2015-12-17 5 views
5

ブートローダーが完備されているとはいえ、私は暇な時間に教育の練習としてオンとオフを書きました。私は問題に遭遇しました。カーネルをロードする準備をする

私は初期ブートを実行でき、他のセクタを問題なくチェーンロードできます。私が自分のOSを書いていたら、行きたいと思う。 :)代わりに、私はLinuxをブートストラップしようとしています。私が持っている課題は2倍です。

  1. 私はそれがI need to load the kernel (Linux) into memory at 0x100000であることを理解しています。カーネルのオフセット0x202に "HdrS"という署名があるはずです。私はまた、開始アドレスは0x214にあるべきであることを知っています。しかし、その場所の住所にジャンプすると、その場所は停止します。明らかに、これを回避するのはかなり難しいです。 :) カーネルの正しい開始アドレスを決定するために必要なこの一連の事実に何かがないのですか?
  2. 私は、(1)に対する答えは、メモリ領域にハードウェアディスカバリ情報を書き込む必要があると考えられます。私はOSDev Wikiにこれを渡すいくつかの参照を見てきましたが、私はこれがどこにあるのか正確にどのデータがそこにある必要があるのか​​見当たりません。 ブートローダはハードウェアの検出を担当していますか?もしそうなら、どのデータをどこに置く必要がありますか?

のノートを取るために、追加のポイントは、私はEFIブートシステムの作成を扱っていますので、私は32ビットプロテクトモードで既にだということなので、16ビットリアルモードは本当にここにオプションではありませんされ、排除カーネル内のリアルモード開始位置。

+0

デバッガをこの周りに包むのは簡単です...仮想マシンを使用してください。地獄、linuxにもソースコードが付属しています;) – Jester

+0

ベアメタルでデバッグしようとしていますか?ボッシュ内部の別のマシンシミュレータを試してみてください。これは、クロック(およびタイマー割り込みなど)が停止するため、シングルステップに一時停止することが完全に透過的になるという利点があります。 –

+0

@PeterCordesはい。 Bochsにもデバッグ接続インターフェースがあることを覚えているようですね。それが役に立っているかどうか分かりますが、本当に私には、0x214で示された場所にジャンプしています。私は間違った場所からアドレスを取得していると思われます。私の問題。 –

答えて

2

@Jesterが私の問題を発見し、両方の質問に答えました。解決策は実際にはfile that I had linkedにありましたが、私は関連するセクションを見逃していました。私は後世のためにここに関連する部分を含めています:ブートパラメータ(構造体boot_params

32ビットのブートプロトコルでは、Linuxカーネル をロードするための最初のステップは、セットアップにする必要があり、 は伝統的にゼロ」として知られていますページ")。 struct boot_params struct のメモリは、すべてゼロに割り当てて初期化する必要があります。次に、カーネルイメージのオフセット0x01f1からのセットアップヘッダ をstruct boot_paramsにロードして調べる必要があります。

0x0202 +バイト値で boot_params 16ビットブートのそのような構造体の設定ヘッダを読み取り/修正/書き込みに加えて、0x0201

オフセット:セットアップヘッダの端部は 以下のように計算することができます。ブートローダは もzero-page.txtに記述されている のように、struct boot_paramsの追加フィールドを埋める必要があります。

struct boot_paramsを設定した後、ブートローダは、16ビットブートプロトコルと同じ方法で 32/64ビットカーネルをロードできます。

32ビットブートプロトコルでは、カーネルは、 32/64ビットカーネルの開始アドレスである 32ビットカーネルエントリポイントにジャンプすることによって開始されます。

CPUが32ビット保護モードで、ページング が無効になっている必要があります。 GDTにセレクタの記述子をロードする必要があります。 __BOOT_CS(0x10)および__ BOOT_DS(0x18);どちらの記述子も4Gフラットセグメントでなければなりません。 __BOOT_CSには実行/読み取り権限が必要で、__BOOT_DS には読み取り/書き込み権限が必要です。 CSは__BOOT_CSで、DS、ES、SSでなければなりません は__BOOT_DSでなければなりません。割り込みは無効にする必要があります。 %esiは構造体boot_paramsのアドレス を保持する必要があります。 %ebp、%edi、%ebxはゼロでなければなりません。

64ビット命令も同じドキュメントにあります。

関連する問題