Высшая половина инициализации ядра - PullRequest
5 голосов
/ 03 июня 2011

При инициализации моего ядра у меня есть несколько вещей, которые должны произойти: 1) необходимо включить подкачку страниц, 2) диспетчер физической памяти должен проанализировать карту памяти из grub, и 3) необходимо получить доступ к разному стартовому коду данные, которые должны остаться там на потом (например, GDT, IDT, структуры управления памятью).

Зависимости между этими шагами сводят меня с ума. С более высокой половиной ядро ​​связано по своему виртуальному адресу, и поэтому я выбрал следующие варианты: 1) включить подкачку в сборке, что потребует следования всем указателям мультизагрузки (в сборке), чтобы они по-прежнему были доступны к диспетчеру физической памяти, а затем разархивировать их все, 2) связать код запуска по его физическому адресу и затем выполнить некоторые манипуляции с указателями для доступа к структурам ядра по их физическим адресам, или 3) не использовать верхнюю половину ядро.

Также включается загрузка менеджера физической памяти, не зная объема физической памяти во время компиляции. Я уверен, что мне нужно либо тщательно избегать всех мультизагрузочных структур при выделении первых структур, либо использовать их все сначала, а затем не беспокоиться о их перезаписи (хотя мне все равно придется иметь дело с модулями, и этот подход, вероятно, включает в себя копирование таблиц мультизагрузки в известное место по мере их необходимости при настройке менеджера физической памяти).

Именно из-за этих проблем я до сих пор избегал более половины ядра. У кого-нибудь есть хорошая система для разрешения этих зависимостей? Может быть, какой-то вариант этого трюка с GDT для доступа к ядру по его связанному / виртуальному адресу и к таблицам мультизагрузки по их физическому адресу, или к использованию каких-либо предварительно определенных таблиц страниц, которые позволяют избежать проблем, описанных выше, возможно, с участием PSE?

1 Ответ

4 голосов
/ 03 июня 2011

Вот как я решил эту проблему:

Мой образ ядра загружается GRUB по (физическому) адресу 0x01000000 (16 МБ, чуть выше области ISA DMA).Это изображение в основном состоит из двух частей:

  1. Раздел «Ранний инициал».Этот раздел содержит код, который выполняется для подготовки к переходу на верхнюю половину ядра.В этом разделе я также зарезервировал некоторое место для стека и кучи, использованной во время этой подготовки.Весь код в этом разделе связан по (виртуальному) адресу 0x01000000.
  2. Остальная часть изображения содержит код и данные, которые являются частью ядра более высокой половины.Весь код в этой части связан по (виртуальному) адресу 0xc0000000 (3 ГБ).

Поскольку код в разделе раннего инициализации связан по тому же адресу, с которого он загружен, GRUB может перейти вэтот код без проблем.Этот ранний код инициализации выполняет следующие шаги:

  1. Перемещение структуры MBI, которую GRUB передает ядру.Для этого используется куча внутри раздела ранней инициализации.
  2. Идентификация отображает все страницы, начиная с физического адреса 0x0, до физического адреса последней страницы, использованной разделом ранней инициализации.Отображение идентичности означает, что виртуальные адреса совпадают с физическими адресами.Это гарантирует, что код в начале раздела инициализации все еще может быть выполнен после включения подкачки.
  3. Сопоставить ядро ​​старшей половины по виртуальному адресу 0xc0000000.
  4. Включить подкачку.* Перейти в верхнюю половину ядра.

На этом этапе остальная часть инициализации выполняется из кода верхней половины.Это включает в себя настройку GDT, IDT, управление памятью, ... Обратите внимание, что MBI перемещен в известное место, поэтому вам не нужно беспокоиться о перезаписи его собственными структурами данных.

Небольшое слово о диспетчере физической памяти: я вычисляю количество страниц, необходимое для моих структур данных, выделяю эти структуры, начиная с первой страницы после образа ядра, и начинаю обрабатывать страницы, начинающиеся после этих структур данных.

Надеюсь, это объяснение понятно.Если это не так, пожалуйста, дайте мне знать.Я мог бы также предоставить вам копию моего ядра, если вам это нравится.

...