Linuxソースコード(バージョン2.6.18)の場合:
movl $swapper_pg_dir-__PAGE_OFFSET,%eax
movl %eax,%cr3
movl %cr0,%eax
orl $0x80000000,%eax
movl %eax,%cr0 /* ..and set paging (PG) bit */
ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */
また、load_cr3(pgdir)
およびwrite_cr3(x)
マクロ:
#define load_cr3(pgdir) write_cr3(__pa(pgdir))
#define write_cr3(x) \
__asm__ __volatile__("movl %0,%%cr3": :"r" (x))
cr3
制御レジスタ全体がページディレクトリのアドレスを格納しているようです。ただし、Intel ia-32 Developer's_Manualを参照すると、別の話になります。インテルのマニュアルには次のように書かれています。
name 0.............11 12.................31
cr3 flags address of page directory
PDE flags address of page table
PTE flags address of 4kb page frame
マニュアルによると、最上位20ビットはレジスタcr3
全体ではなくページディレクトリのアドレスを格納しますcr3
。また、ページディレクトリが正確に4kbであるため、アドレスの最下位12ビットは常にゼロであるため合理的です。
ちょっと変じゃないですか?cr3
Linuxコードは、の最上位20ビットではなく、ページディレクトリのアドレスを割り当てるだけswapper_pg_dir
です。レジスターは正確に何cr3
を保存しますか、インテルのマニュアルが示唆するアドレスまたはフォーマットは何ですか?
次のリンクはIntelのマニュアルです:http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html