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