В рамках моего курса ОС мне нужно будет написать собственное крошечное ядро ОС, работающее под 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; однако это не кажется простым делом. Проблемы следующие:
- Похоже, что нет способа определить адрес для прошивки UEFI для загрузки моего ядра - вместо этого микропрограмма выбирает адрес во время выполнения;
- Кажется, не существует достаточно небольшого диапазона физических адресов, который гарантированно содержал бы всю используемую UEFI память, так что я мог бы предположить, что остальная часть ОЗУ будет свободна для использования ядром.
Один из способов решения этих проблем - использование карты памяти, предоставленной UEFI, через GetMemoryMap()
. На карте описаны все области памяти, используемые прошивкой. Однако выяснение структуры памяти во время выполнения усложняет ситуацию, в отличие от статической схемы памяти, такой как та, что используется xv6. Я готов пожертвовать объемом оперативной памяти ради простоты.
Итак, есть ли способ добиться статической разметки физической памяти в моем ядре с загрузкой UEFI?