Memory UEFI引导内核:静态物理内存布局

Memory UEFI引导内核:静态物理内存布局,memory,osdev,uefi,Memory,Osdev,Uefi,作为操作系统课程的一部分,我需要编写自己的微型操作系统内核,在QEMU和UEFI(OSVF)下运行。UEFI规范似乎相当复杂,有一件事离我越来越远,那就是是否有可能有一个静态(编译时定义的)物理内存布局,这样我的内核在保留UEFI使用区域的同时有合理数量的物理内存可用 让我举例说明一下。它有一个简单的手工引导加载程序,由遗留BIOS运行。根据,此操作系统按如下方式分配物理内存: +------------------+ | Free Space | +---------------

作为操作系统课程的一部分,我需要编写自己的微型操作系统内核,在QEMU和UEFI(OSVF)下运行。UEFI规范似乎相当复杂,有一件事离我越来越远,那就是是否有可能有一个静态(编译时定义的)物理内存布局,这样我的内核在保留UEFI使用区域的同时有合理数量的物理内存可用

让我举例说明一下。它有一个简单的手工引导加载程序,由遗留BIOS运行。根据,此操作系统按如下方式分配物理内存:

+------------------+ 
|    Free Space    |
+------------------+ 0x00500000
|      Kernel      |
+------------------+ 0x00100000
|   BIOS and I/O   | <------------ Bootloader code is loaded here
+------------------+ 0x00000000
+--------------+
|自由空间|
+------------------+0x00500000
|内核|
+------------------+0x00100000
|BIOS和I/O|
那么,在我的UEFI引导的内核中有没有一种实现静态物理内存布局的方法呢

不可以。您可以尝试静态分配一台计算机的物理内存区域(UEFI内置的内存管理器具有“在此特定物理地址分配页面”功能),但不能保证UEFI不会在任何其他计算机上保留物理地址的范围;它是哪个物理地址范围没有区别

相反,在引导代码启用分页之前,它可以愉快地使用从UEFI的内存管理器分配的页面和/或引导加载程序的“.bss”部分中预先分配的内存,而不关心物理地址是什么;在启动代码启用分页后,物理地址几乎与所有内容都无关(并且您可以随意使用虚拟地址空间,如果您不喜欢security/KASLR,还可以在内核空间中静态分配虚拟地址范围)

大多数情况下,对于UEFI来说,如果可能/支持静态分配的物理地址,则不会有任何好处,也不会使任何事情变得更简单