UEFI-загруженное ядро: статическая структура физической памяти - PullRequest
0 голосов
/ 03 октября 2018

Как часть моего курса по ОС, мне нужно написать свое собственное крошечное ядро ​​ОС, работающее под QEMU с UEFI (OSVF).Спецификация UEFI кажется довольно сложной, и одна вещь, которая ускользает от меня, заключается в том, возможно ли иметь статическую (определяемую во время компиляции) структуру физической памяти, чтобы мое ядро ​​располагало разумным объемом физической памяти, покатакже сохраняя области, используемые UEFI.

Позвольте мне пояснить, используя в качестве примера xv6 .Это простой ручной загрузчик, работающий на устаревшем BIOS.Согласно книге xv6 , эта ОС распределяет физическую память следующим образом:

+------------------+ 
|    Free Space    |
+------------------+ 0x00500000
|      Kernel      |
+------------------+ 0x00100000
|   BIOS and I/O   | <------------ Bootloader code is loaded here
+------------------+ 0x00000000

Причина, по которой такая простая схема возможна, состоит в том, что вся «волшебная» память, используемая устройствами иBIOS находится в физическом диапазоне [0x00000000; 0x000FFFFF].В частности, загрузчик загружается в этом диапазоне и затем может свободно выбирать любую область памяти для загрузки ядра.Свободное пространство, начинающееся с 0x00500000, может быть выделено для нужд пользовательских программ.

Я хотел бы иметь такую ​​же простую структуру памяти в загруженном UEFI ядре;однако, это не кажется простым делом.Проблемы:

  1. Похоже, что нет способа определить адрес для прошивки UEFI для загрузки моего ядра - вместо этого прошивка выбирает адрес во время выполнения;
  2. Кажется, что нет достаточно небольшого диапазона физических адресов, который гарантированно содержал бы всю используемую UEFI память, так что я мог бы предположить, что остальная часть ОЗУ свободна для использования ядром.

Одним из способов решения этих проблем является использование карты памяти, предоставляемой UEFI, через GetMemoryMap().Карта описывает все области памяти, используемые прошивкой.Однако вычисление структуры памяти во время выполнения усложняет вещи, в отличие от статической структуры памяти, например, используемой в xv6.Я готов пожертвовать некоторым объемом ОЗУ ради простоты.

Так есть ли способ добиться статического расположения физической памяти в моем UEFI-загруженном ядре?

1 Ответ

0 голосов
/ 21 июня 2019

Так есть ли способ добиться статической разметки физической памяти в моем загруженном UEFI ядре?

Нет.Вы можете попытаться статически выделить область физической памяти, которая работает для одного компьютера (встроенный в UEFI диспетчер памяти имеет функцию «выделить страницы по этому конкретному физическому адресу»), но нет гарантии, что диапазонфизические адреса не будут зарезервированы UEFI на любом другом компьютере;и не имеет значения, к какому физическому диапазону адресов он относится.

Вместо этого, прежде чем ваш загрузочный код разрешит подкачку страниц, он может с радостью использовать страницы, выделенные из диспетчера памяти UEFI и / или память, предварительно выделенную в ".bss вашего загрузчика".раздел, не заботящийся о том, что физические адреса;и после того, как ваш загрузочный код разрешит подкачку, физические адреса станут неактуальными практически для всего (и вы можете использовать ваши виртуальные адресные пространства по своему усмотрению, включая статическое распределение диапазонов виртуальных адресов в пространстве ядра, если вам не нравится security / KASLR).

В основном, для UEFI, если бы это было возможно / поддерживалось, статически распределенные физические адреса не принесли бы пользы и ничего бы не упростили.

...