Ядро с загрузкой UEFI: статическая структура физической памяти

В рамках моего курса ОС мне нужно будет написать собственное крошечное ядро ​​ОС, работающее под 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?


person kreo    schedule 03.10.2018    source источник


Ответы (1)


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

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

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

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

person Brendan    schedule 21.06.2019