【问题标题】:How to detect or probe or scan usable/accessible physical memory?如何检测或探测或扫描可用/可访问的物理内存?
【发布时间】: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


【解决方案1】:

你想要多少信息?

如果你只想知道哪些区域是可用的RAM;然后“int 0x15, eax=0xE820”(限制 BDA 将被视为可用)或 UEFI 的“获取内存映射”功能,都是您所需要的。请注意,对于这两种情况,一个/某些区域可能会报告为“ACPI 可回收”,这意味着在您完成 ACPI 表解析后(或者如果您不关心 ACPT 表),RAM 将变得可用。

如果您想要更多信息,您需要做更多的工作,因为信息分散在各处。具体来说:

  • ACPI 的 SRAT 表描述了哪些事物(例如,哪些内存区域)在哪个 NUMA 域中; ACPI 的 SLIT 表描述了它对性能的影响。

  • ACPI 的 SRAT 表还描述了哪些内容(例如,哪些内存区域)是“热插拔可移除”并为“热插入”保留。

  • CPU 的 CPUID 指令会告诉您“物理地址大小(以位为单位)”。这有助于了解您是否/何时尝试找到合适的物理地址空间区域以用于内存映射的 PCI 设备的 BAR,因为您获得的内存映射太傻了,无法告诉您“不可用”之间的区别由内存映射的 PCI 设备”、“可由内存映射的 PCI 设备使用”和“由内存映射的 PCI 设备使用”。

  • 解析(或配置)PCI 配置空间(必要时结合 IOMMU)告诉您物理地址空间的哪些区域当前由哪些 PCI 设备使用

  • 解析“系统管理 BIOS”表可以(通过大量工作和“启发式摸索”)告诉您物理地址空间的哪些区域对应于主板上的哪些 RAM 芯片以及这些 RAM 的详细信息芯片是(类型、速度等)。

  • 各种 ACPI 表(例如 MADT/APIC 和 HPET)可用于确定各种特殊设备(本地 APIC、IO APIC、HPET)的位置。

  • 您可以假设(部分)以物理地址 0xFFFFFFFF 结尾的区域将是固件的 ROM;并且(通过更多的“启发式摸索”从固件的内存映射报告为“保留”的区域中减去任何特殊设备)您可以确定该区域的大小。

如果您完成所有这些操作,您将获得一个相当完整的映射,描述物理地址空间中的所有内容。

【讨论】:

  • 哇!惊人的!谢谢布伦丹。真的很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 2014-06-26
相关资源
最近更新 更多