x86 cr3 и linux swqpper_pg_dir - PullRequest
       0

x86 cr3 и linux swqpper_pg_dir

2 голосов
/ 27 октября 2011

В исходном коде 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

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Для 32-битного пейджинга обязательно, чтобы адрес каталога страниц был кратным 4096, то есть его 12 младших разрядов равны нулю.Однако код операции для установки cr3 загружает 32 бита, а не 20 бит.Когда загружается cr3, его 20 старших битов используются для адреса каталога страницы, а младшие 12 битов интерпретируются как флаги, которые могут влиять на поведение поискового вызова в более новых версиях процессора.«Безопасный» параметр для этих флагов равен нулю, и это именно то, что делает Linux: он загружает cr3 32-разрядным значением, в котором его 12-значный младший бит равен нулю (потому что это 32-разрядное значение было принято в качестве памятиадрес, кратный 4096).

1 голос
/ 27 октября 2011

Нет ничего странного, если swapper_pg_dir-__PAGE_OFFSET кратно 4096.

Допустимы нули в младших битах CR3:

  • зарезервированные биты должны быть установлены в 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...