твой код выделяет память вызовами
bs->AllocatePages(2, 4, ...), а 2 -- это
AllocateAddress, т.е. запрос на выделение памяти по фиксированному тобой адресу. У меня этот код сразу возвращает ошибку, а вот
bs->AllocatePages(0, 4, ...) -- работает:
diff --git a/boot/bootloader.c b/boot/bootloader.c
index 377e907c1728..5ae82dca7fc0 100644
--- a/boot/bootloader.c
+++ b/boot/bootloader.c
@@ -59,7 +59,7 @@ EFIAPI long long efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
// 1. Выделяем память под скрытый буфер экрана (1024 * 768 * 4 байта = 3145728 байт = 768 страниц по 4КБ)
unsigned long long v_buffer_addr = 0;
// 2 = EfiAllocateAnyPages, 4 = EfiRuntimeServicesData (чтобы ядро гарантированно видело эту память)
- long long status = bs->AllocatePages(2, 4, 768, &v_buffer_addr);
+ long long status = bs->AllocatePages(0, 4, 768, &v_buffer_addr);
if (status != 0) {
while(1) { __asm__ __volatile__("hlt"); }
}
@@ -85,7 +85,7 @@ EFIAPI long long efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
unsigned long long map_buffer = 0;
// Выделяем временную память под саму карту памяти (округлим map_size до страниц)
- bs->AllocatePages(2, 4, (map_size / 4096) + 1, &map_buffer);
+ bs->AllocatePages(0, 4, (map_size / 4096) + 1, &map_buffer);
// Получаем финальную карту памяти и MapKey
status = bs->GetMemoryMap(&map_size, (void*)map_buffer, &map_key, &desc_size, &desc_ver);