Как таблица страниц ядра инициализируется? - PullRequest
0 голосов
/ 19 октября 2011

Я слежу за книгой по управлению виртуальной памятью Гормана.

Есть раздел об инициализации страницы таблицы ядра, который, как говорят, разделен на две фазы: загрузку и финализацию.

Вот чтоон говорит о фазе начальной загрузки.

Функция ассемблера startup_32 () отвечает за включение модуля подкачки в файле arch / i386 / kernel / head.S.Хотя весь нормальный код ядра в vmlinuz компилируется с базовым адресом в PAGE_OFFSET + 1MiB, ядро ​​фактически загружается, начиная с первого мегабайта (0x00100000) памяти.Первый мегабайт используется некоторыми устройствами для связи с BIOS и пропускается. Загрузочный код в этом файле обрабатывает 1MiB как свой базовый адрес, вычитая __PAGE_OFFSET из любого адреса до тех пор, пока не будет включен модуль подкачки. Поэтому, прежде чем модуль подкачки будет включен, необходимо установить отображение таблицы страниц, которое переводит 8MiB физической памяти на виртуальный адрес PAGE_OFFSET.

  1. Почему мы хотим вычесть __PAGE_OFFEST?С какой целью?

  2. Почему мы должны делать вычитание до того, как блок пейджинга будет включен?Разве мы не используем вычитание для отображения виртуального адреса ядра в адрес физической памяти?

  3. Почему это 8 МБ?

Спасибо,

1 Ответ

3 голосов
/ 19 октября 2011

Поскольку код x86 обычно не зависит от позиции, если он скомпилирован для выполнения по адресу X (__PAGE_OFFSET + 1MB), но загружен по адресу Y (1MB), все адреса внутри него должны быть уменьшены на YX (__PAGE_OFFSET +1MB - 1MB = __PAGE_OFFSET), чтобы он работал.

Например, если есть инструкция для чтения байта памяти из начала ядра, __PAGE_OFFSET + 1MB, адрес уменьшается на __PAGE_OFFSET и фактическийместо чтения становится 1 МБ, именно там, где ядро ​​запускается в памяти.

Когда перевод страницы наконец-то включен, __PAGE_OFFSET может и, я полагаю, эффективно вычитается механизмом перевода страниц путем сопоставления диапазона виртуальных адресов сдиапазон физических адресов, которые меньше на __PAGE_OFFSET (то есть физический = виртуальный -__ PAGE_OFFSET для таблиц страниц).

Если не требуется каких-либо дополнительных перемещений ядра, 8 МБ, вероятно, просто размер диапазона отображения,достаточно отобразить весь кернель.

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