0

私は Linux カーネル学習の初心者です。現在、古いバージョンの 2.4 で Linux カーネル コードを読んでいます。本から、暫定的な page_table がブートストラップでアクティブ化され、PAGE_OFFSET ~ PAGE_OFFSET + 8M と 0 ~ 8M の両方が物理的な 0 ~ 8M にマップされたことがわかります。しかし、関数 init_bootmem_core では、次のコードを確認できます。

bootmem_data_t *bdata = pgdat->bdata;
unsigned long mapsize = ((end - start)+7)/8;

pgdat->node_next = pgdat_list;
pgdat_list = pgdat;

mapsize = (mapsize + (sizeof(long) - 1UL)) & ~(sizeof(long) - 1UL);
bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT);
bdata->node_boot_start = (start << PAGE_SHIFT);
bdata->node_low_pfn = end;

/*
 * Initially all pages are reserved - setup_arch() has to
 * register free RAM areas explicitly.
 */
memset(bdata->node_bootmem_map, 0xff, mapsize);

return mapsize;

mapstart はカーネルの後の最初のページ番号に等しく、仮の page_table にマップされていませんでした。最後から2番目の行で?

4

1 に答える 1

0

私は 2.4 のブート プロセスにあまり詳しくありませんが、この時点でページ テーブルが初期化される可能性がありますが、実際にはカーネルはまだ保護モードに移行されていますか? それが起こるまで (少なくとも Intel アーキテクチャでは)、物理フレームを直接アドレス指定する x86 リアル モードになります。

于 2013-11-04T03:30:30.540 に答える