【问题标题】:Values returned by E820h QuerySystemAddressMap on 4GB+ memoryE820h QuerySystemAddressMap 在 4GB+ 内存上返回的值
【发布时间】:2017-12-21 03:15:28
【问题描述】:

我刚刚写完review for a program that displays the results from QuerySystemAddressMap
我还有两个问题:

  1. 看到那些 - 对于最不必要的大 - 32 位参数 ECXEBX,尤其是 EAX 中的函数号,我怀疑可能存在与此 BIOS 函数对应的保护模式.我的怀疑正确吗?

  2. the BIOS function 0000E820h 在内存超过 4GB 的计算机上运行从真实地址模式并且知道超过 4GB 标记的内存将无法寻址时,地址和长度会不会报告低于 4GB?

通常我会尝试一下并自己找出答案,但我还没有这种硬件。

【问题讨论】:

  • 您没有内存超过 4 GB 的硬件?因为每个系统,即使是全新的系统,都以实模式启动,因此很容易测试。据我所知,没有 ROM BIOS 中断可以从保护模式访问。 This reference 建议 E820h 也只是实模式。我认为它使用 32 位寄存器的原因只是历史原因:它是为 Compaq SystemPro 引入的,这是第一个需要它的系统,它使用了 386 处理器。为什么使用完整的寄存器?
  • @CodyGray 我有点推测可能存在类似于 VESA 视频 BIOS 上可用的 ProtectedModeEntryPoint 的东西。至于“为什么使用完整的寄存器”,所有这些操作数大小前缀和 32 位立即数在实地址模式下占用了大量字节。

标签: assembly memory x86-64 bios


【解决方案1】:

BIOS 函数 INT 15h EAX=0000E820h 旨在获取系统的完整内存映射,旨在克服先前接口不支持 4 GB 以上内存的限制。因此,此函数不报告 4 GB 以上的内存是没有意义的。没有保护模式等效的 BIOS 功能。 (虽然 UEFI GetMemoryMap 服务在通过 UEFI 而不是传统的 BIOS 引导方法引导时提供了等效的功能。)

该函数旨在在操作系统进入保护模式之前以实模式调用。在实模式下使用 32 位寄存器所需的几个额外代码字节是微不足道的。无论如何,大多数操作系统都会回收早期实模式启动代码使用的内存。

【讨论】:

  • 不幸的是,在遗留系统或至少那些使用 BIOS 引导的系统中本质上是GetMemoryMap,必须如此复杂。 AMI rev 6.05 01/18/11 core 08.00.16 将 int 15H 处理程序复制到 99FB:0 并且 20 字节成员在 @ 99FB:90H 中存活。如果 AX=E820 只返回一个指向该数组的指针,那就更方便了。
猜你喜欢
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2015-07-09
相关资源
最近更新 更多