まずはMINIXから。オペレーティングシステム第3版のP449でminixはページングは使ってないと書いてあるのでminix3.1.0だとページング機能は未使用。
qemuでminix起動後のcr3レジスタの値をみても0なので、確かにページングは使ってなかった。。
Linuxは0.10と2.6.30で調べてみた。
0.10だとboot/head.sのsetup_paging内で行っている模様。
2.6.30だと32bitならarch/x86/mm/init_32.c、64bitならarch/x86/mm/init_64.cのkernel_physical_mapping_init()。
これの呼び出し元は、arch/x86/mm/init.cのinit_memory_mapping()。
init_memory_mapping()では32bitと64bitで呼び出しかたを変えてるんだけど、一瞬なにが違うのかよくわかんなかった。
kernel_physical_mapping_init()の関数プロトタイプは32,64bit両方同じなので。。
290#ifdef CONFIG_X86_32 291 for (i = 0; i < nr_range; i++) 292 kernel_physical_mapping_init(mr[i].start, mr[i].end, 293 mr[i].page_size_mask); 294 ret = end; 295#else /* CONFIG_X86_64 */ 296 for (i = 0; i < nr_range; i++) 297 ret = kernel_physical_mapping_init(mr[i].start, mr[i].end, 298 mr[i].page_size_mask); 299#endif
でも、よくよく見てみると、32bitのときだけendをretに代入する処理がある(294行目)。
64bitの方では、kernel_physical_mapping_init()の戻り値をretに代入しているが、32bitは戻り値は使わずに、endを代入する。
このendはinit_memory_mapping()に渡ってくる引数。
呼び出し元は、arch/x86/kernel/setup.cのsetup_arch()にある以下の行っぽい。
869 /* max_pfn_mapped is updated here */ 870 max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
kernel_physical_mapping_init()の実装を調べるのは次回に持ち越し。