6.828: Operating System Engineering (79)
ええと、いったん
// Map VA 0:4MB same as VA KERNBASE, i.e. to PA 0:4MB. // (Limits our kernel to <4MB) pgdir[0] = pgdir[PDX(KERNBASE)]; // Install page table. lcr3(boot_cr3);
でコメントに記述されているような mapping が何故に必要なのかが分かりませんでした。
がしかし、うにまが 2002.11 の Linux のブートプロセスをみる、な記事に以下な記述を発見。
ところが、CPU が実行しているカーネル・プログラムは 1MB 以降のメモリにロードされており、実行ポインタ (EIP レジスタ) も 00100000H 付近のアドレスを指しています。そこで、カーネルの初期段階では、00000000H から始まる 8MB の領域と C0000000H 以降の 8MB のどちらのアドレスでアクセスしても、結果的には同じメモリを参照するようなページテーブルを作成します。
そして、startup_32 サブルーチンの最後で、ljmp $(__KERNEL_CS),$1f
を実行することによって C0000000H 以降のアドレス範囲に制御を移します。
UNIX MAGAZINE 2002.11 連載/Linux のブートプロセスをみる より引用
成程
ということで CR0 レジスタの設定などをしてる箇所とかきちんと確認したいのですが、宿題の要求はまだまだ高い部分で微妙にげんなりしてたりしてます。
とりあえず RoR 方面に去ります。