如何解决x86 UEFI 引导:UEFI 真的需要从地址 0 开始的传统 1MiB 填充吗?
我对使用 UEFI 在 x86_64 上进行内核开发和引导过程比较陌生。许多通用 OS 开发资源建议将初始目标文件中的前 1 MiB 保留为空闲/不变,因为有“许多旧功能 I/O 映射,例如 VGA 帧缓冲区”。
这仅适用于传统 BIOS 启动还是仍然适用于 UEFI?
示例链接脚本:
ENTRY(start)
SECTIONS {
/* According to https://intermezzos.github.io/book/first-edition/hello-world.html
* there is lots of memory mapped I/O and 1MiB is a conventional padding (legacy?!)
* TODO find out if this only is valid for legacy BIOS boot or also for UEFI!
*/
. = 1M;
.text :
{
*(.text)
}
.bss :
{
*(COMMON)
*(.bss)
}
}
解决方法
EFI 引导服务函数 GetMemoryMap 提供的内存映射标识所有已使用和可用的页面。调用 ExitBootServices 后,您应该可以随意使用任何可用的页面。
在调用 ExitBootServices 之前,您应该调用 AllocatePool 或 AllocatePages 来获取内存。如果您特别想在第一兆字节内分配内存,您可以使用 type = ALLOCATE_MAX_ADDRESS 和 address = 0xfffff 调用 AllocatePages。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。