2

Xinuと一緒に OS とネットワークについて学びたいと思っています。githubの xinu-os リポジトリからソース コードをダウンロードし(最大 4d489eead3a49170f69041b959bd5a1bd8dff92d)、自分で xinu.boot と xinu.elf をコンパイルしました。実際に取り掛かるために、いくつかの変更とテストを行いたいと思いました。したがって、私の目標 (およびこの質問の目標) は、VBox で xinu を起動することでした。

少し説明すると、Xinu Pageには、VM 用の Xinu のバージョンと、ダウンロード可能なコードの下にある手順の項目があることを知っています。このセクションには、VBox バージョンが含まれています (以下、VBox バージョンと呼びます)。そのバージョンを使用したくない理由は、github のコードほど多くの機能が含まれていないためです。また、github に boot.xinu-os.org プロジェクトがあり、javascript PC エミュレーターで xinu を起動できることを宣伝していることも知っています。使いたくない理由は、制約がありそうで、従来の方法よりも問題が多いのではないかと思ったからです(ないかもしれません)。そのため、xinu-os リポジトリのコードを使用して独自のバイナリをコンパイルし、VBox の VBox バージョンと同様の方法で簡単に実行できると考えましたが、間違っているように見えました。

Xinu ページの VBox バージョンは、pxe と grub を使用して起動しています。私がしたことは次のとおりです。

  1. xinu-os リポジトリから複製しました。
  2. マルチブート仕様#OS-image-formatに従い、必要なヘッダーを _start の最後に追加して、バイナリをマルチブートに準拠させました。

    /* /xinu/loader/platforms/x86/start.S
     * ...
     * #define     MULTIBOOT_HEADER_MAGIC  0x1BADB002
     * #define     MULTIBOOT_HEADER_FLAGS  0x00000003
     * _start:
     * ...
     */
    jmp     startup
    
    /* Enable multiboot support */
    .align  4
    .long   MULTIBOOT_HEADER_MAGIC
    .long   MULTIBOOT_HEADER_FLAGS
    .long   -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
    
  3. 変更したコードからXinu.bootand を作成しました。Xinu.elf

  4. 指示通りに minicom をセットアップし、VBox バージョンを正常に起動しました。
  5. Xinu.bootVBox版で使われているを調べたところ、 i386用の32bitエルフだったのXinu.bootですが、Makefileでビルドしたはobjcopyで作ったもので、Xinu.elfはエルフでした。Xinu.elfそのため、 I builtという名前をに変更Xinu.bootし、VBox バージョンでそれを置き換えました。
  6. Xinu.boot次に、同じ環境で、を除く同じファイルで起動しようとしました。
  7. それは失敗し、grub は grub コマンドラインを提供してくれました。デバッグ版も使ってみました。これも失敗しましたが、grub コマンドラインを表示する前に、「不明なコマンド: r(0, 1)」というメッセージが表示されました。

Xinu.bootしたがって、私の主な質問は、私のものと、私の pxe ブートを妨げる VBox バージョンのものとの根本的な違いは何ですか? 誰でもそれに光を当てることができますか?

そこにたどり着くまでに、多くの読書と実験が必要でした。私の目標は、自分で構築した Xinu を実行し、修正してテストすることです。pxe で起動する必要はありませんが、実際のハードウェアではなく VBox で実行できることを願っています。私の他の質問は次のとおりです。

  1. VBox または仮想マシンで xinu を実行する別の (そしてより簡単な) 方法はありますか?
  2. 起動するように構成された VBox バージョンで出荷された grub はどのようになっXinu.bootていますか? ファイルでxinuを検索しようとしたが、何も得られなかったからです。
  3. 「不明なコマンド: r(0, 1)」というメッセージはどういう意味ですか?それはgrubまたはxinuが発行したものですか?
  4. このようなシステムをどのようにデバッグすればよいですか? kprintfstart.S にいくつか挿入しようとしましたが、どこにも行きませんでした。gdb も試しましXinu.elfたが、いくつかの命令を実行した後にセグメンテーション違反が発生しました。そして、なぜgdbでデバッグできないのですか? (組み立て初心者なので教えてください。)
  5. この種の質問に対して信頼できる Xinu コミュニティまたはメーリング リストはありますか?

私の質問が特別で複雑なことは承知しており、それらを英語で表現するのはとてもぎこちないです。どんな助けでも大歓迎です!前もって感謝します!

4

1 に答える 1

3

かなりの量の読書の後、QEMU で github バージョンの xinu を正常に実行できるようになりました。これが私がやった方法です:

  • github バージョンの xinu は、QEMU で実行するためにほとんど変更がありません。私の質問で説明されているように、マルチブート ヘッダーを追加する必要があります。
  • 作成後、次のように xinu で実行します。

    qemu-system-i386 -kernel xinu.elf
    
  • QEMU が実行されると、「Booting from ROM...」という画面で停止します。次にCTRL-ALT-3、 を押します。

QEMU で起動すると、grub が引き起こす問題とともに grub をスキップします。

QEMU はデバッグにも便利です。xinu を次のように実行した場合:

qemu-system-i386 -s -S -kernel xinu.elf

QEMU は、命令が実行される前に開始および一時停止します (パラメーターの詳細については、QEMU のマニュアルを確認してください)。次に、gdb を起動してアタッチできます。

gdb xinu.elf

gdb が起動したら、次を発行します。

target remote localhost:1234

xinu を実行している QEMU プロセスに gdb をアタッチします。ブレークポイントの設定、レジスタの表示、逆アセンブルなど、gdb で通常行うことは何でも実行できます。すべてが完了したら、c( continue) を発行してキックオフします。

CRxgdbでレジスタを表示できない場合があります。これは、QEMU で直接行うことができます。CTRL-ALT-2QEMU ウィンドウを押すと、コンソールが表示され、次のコマンドを発行できます。

info registers

そして、それらを含むすべてのレジスタを取得しCRxます。そのコンソールで発行できるコマンドは他にもあります。helpそれらについての詳細情報を提供します。

于 2014-01-14T13:31:01.413 に答える