私は 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番目の行で?