В исходном коде 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 хранит адрес Page Directory. Однако, когда я ссылаюсь на Intel ia-32Developer's_Manual, он рассказывает другую историю. Вот что сказано в руководстве Intel:
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. Это также разумно, поскольку каталог страницы занимает ровно 4 КБ, поэтому 12 младших бит адреса всегда равны нулю.
Разве это не немного странно, потому что код linux просто назначает адрес каталога страниц для cr3 вместо 20 MSB из swapper_pg_dir.
Мой вопрос заключается в том, что именно регистр cr3 является магазином, адресом или форматом, который предлагает руководство intel?
Следующая ссылка является руководством Intel: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html