4

「マイクOSガイド」に従って自分のカーネルを作ってみましたが、動作しました。しかし、それから私は、コンパイルされたオブジェクトから関数NASMをロードするブートセクターを作成するためのインターネット上の多くのガイドに行きました。コンパイルして、あらゆる種類のGCCインストールとリンクしてみました。mainC

x86_64-pc-linux-
arm-uclinux-elf-
arm-agb-elf-
arm-elf-
arm-apple-darwin10-
powerpc-apple-darwin10-
i686-apple-darwin10-
i586-pc-linux-
i386-elf-

ブートストラップの場合と同じように、フロッピーに配置すると、すべて失敗しますMikeOSここにあるようなhttp://www.osdever.net/でさまざまなチュートリアルを試し、http //wiki.osdev.org/Bare_Bonesを試しましたが、Macでコンパイルしようとしても機能しません。私はまだ実際のLinuxマシンに飽きていません。しかし、チュートリアルのように、関数を呼び出すアセンブリでブートストラップを取得し、それらをまとめて動作するカーネルファイルにまとめてから、フロッピーファイルにロードしてからISOにロードする方法を考えていました。または、を作成してロードする必要がありますCMikeOSkernel.binsyslinux?Mac開発環境でこれをすべて機能させる方法について誰かが私にヒントを教えてもらえますか?私はmacportsと自作による通行料を持っているのでそれは助けになります。誰かがこれを続けてやった?

編集 これまでの私のブートセクタです

externから関数にジャンプしCてリンクする方法を知りたいだけです。

4

1 に答える 1

2

これにはいくつかの問題があります。まず、あなたが言及したすべてのコンパイラは、32 ビットまたは 64 ビットのコードを出力します。これは素晴らしいことですが、ブート セクタが開始されると、16 ビット リアル モードで実行されます。その 32 ビットまたは 64 ビット コードを実行できるようにする場合は、最初に適切なモードに切り替える必要があります (まあ、32 ビットの場合は 32 ビット プロテクト モード、64 ビットの場合はロング モード)。 )。

次に、適切なモードに切り替えると、コード用のスペースはそれほど多くありません。ブート セクターは 512 バイトです。2 バイトは起動可能な署名用に予約されており、適切なモードに切り替えるコード用に数バイトが必要になります。そのディスクまたはおそらく FAT ファイルシステムのパーティションを使用できるようにしたい場合は、さらに多くの使用可能なバイトを取り除いてください。最も単純なプログラムを除いて、十分なスペースがありません。

では、実際のオペレーティング システムはこれにどのように対処するのでしょうか。実際のオペレーティング システムは、ブート セクタを使用して、ディスクからより大きなブートローダーをロードする傾向があります。次に、そのより大きなブートローダーが実際のカーネルをロードし、適切なモードに切り替えることができます (ただし、それはロードされたカーネルの責任である可能性がありますが、場合によって異なります)。

ブートローダーを作成するのは大変な作業になる可能性があるため、独自のブートローダーを作成するのではなく、 GRUB を使用して、カーネルをマルチブート標準に準拠させたい場合があります。GRUB は、ディスクから (おそらく ELF 形式で) カーネルをロードし、32 ビット保護モードのエントリ ポイントにジャンプできるブートローダーです。役に立ちますよね?

ただし、これはアセンブリの学習から解放されるわけではありません。カーネルのエントリ ポイントはアセンブリでなければなりません。多くの場合、小さなスタックをセットアップし、適切なレジスタを正しい呼び出し規則で C 関数に渡すだけです。

自分で書くのではなく、コピーするだけでよいと思うかもしれませんが、それだけではありません。(少なくとも)次のアセンブリも必要です。

  • 新しいグローバル記述子テーブルをロードしています。
  • 割り込みの処理。
  • 非メモリ マップ I/O ポートの使用。

…などなど、言うまでもなく、デバッグする必要がある場合、適切なデバッガーがない可能性があります。代わりに、逆アセンブル、レジスタ値、およびメモリ ダンプを確認する必要があります。コードが C からコンパイルされている場合でも、基礎となるアセンブリが何をするかを知る必要があります。そうしないと、デバッグできません。

要約すると、あなたの主な問題はアセンブリを知らないことです。前述のとおり、アセンブリはオペレーティング システムの開発に不可欠です。アセンブリを完全に理解したら、オペレーティング システムの作成を開始できる可能性があります。

于 2013-01-15T02:11:18.567 に答える