読者です 読者をやめる 読者になる 読者になる

ページングについて調べてるのでメモ。

OS

まずはMINIXから。オペレーティングシステム第3版のP449でminixはページングは使ってないと書いてあるのでminix3.1.0だとページング機能は未使用。
qemuminix起動後の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()の実装を調べるのは次回に持ち越し。