【发布时间】:2019-07-29 03:44:54
【问题描述】:
如何彻底检测或探测或扫描可用/可访问的物理内存?
我目前正在 NASM 中为 x86_64 自定义操作系统制作自定义引导加载程序。
为了分配哪个物理地址包含哪些数据,我想确保内存可以免费使用。我已经尝试过 BIOS 中断 int 0x15 eax 0xE820 并检查了设备管理器内存资源。 问题是它们都没有完全覆盖。
例如,
它说0x0000000000000000 ~ 0x000000000009FC00 可用。
但严格来说,0x0000000000000000 ~ 0x0000000000000500 是不可用的,因为它存储了 IVT 和 BDA。
此外,这里和那里都有 PCI 孔。
我的目标是检测或探测或扫描我的硬件中可用的整个内存并制作内存映射,以便我可以区分哪个地址是哪个地址。 (下图示例)
0x0000000000000000 ~ 0x00000000000003FF : Real Mode IVT
0x0000000000000400 ~ 0x00000000000004FF : BDA
...
0x0000000000007C00 ~ 0x0000000000007DFF : MBR Load Address
...
0x00000000000B8000 ~ 0x00000000000B8FA0 : VGA Color Text Video Memory
...
0x00000000C0000000 ~ 0x00000000FFFFFFFF : PCI Space
我的处理器是英特尔 i7-8700K 第 8 代。
【问题讨论】:
-
0x0000 和 0x0500 之间的 RAM 可用。没有什么能阻止您重用该内存,甚至用其他东西覆盖该区域,包括实模式中断表。当然,如果你破坏它,那么你就不能使用 BIOS 中断,BDA 中的实模式 BIOS 状态将消失等等。应该认为不可用的内存区域是 EBDA 就在 0xA0000 的视频 RAM 下。 SMM(系统管理模式)可以在您的操作系统运行时读取和写入该区域中的数据。
-
E820 是用于旧版 BIOS 的内存映射的机制。如果您使用的是 UEFI,则 UEFI 具有查询相同类型信息的机制。没有办法询问 BIOS 它正在使用哪些 RAM 区域。由于我通常启用分页,因此我将使 EBDA 下 0x1000 到 4KiB 页面之间的所有内存可用。
-
谢谢迈克尔·佩奇。 EBDA,我应该避免使用的另一个地址,已添加。能否也详尽地回答检测或扫描或探测的方法?将不胜感激。
-
我使用的是传统 BIOS 方法而不是 UEFI。
-
你可以在这里找到更多关于这一切的信息:wiki.osdev.org/Detecting_Memory_(x86) 其中包括你自己手动探测内存的麻烦
标签: memory x86 bootloader osdev memory-mapping