【问题标题】:What happens with a processor when it tries to access a nonexistent physical address?当处理器试图访问一个不存在的物理地址时会发生什么?
【发布时间】:2014-03-16 06:15:59
【问题描述】:

想象一台 32 位 x86 计算机,内存少于 3 GB,CPU 设置为禁用分页和平面段描述符(0x0 作为基础,0xffffffff 作为数据和代码的有效限制)。

当 ring0 中的指令尝试使用 mov 指令来引用没有任何内存地址支持的物理地址时会发生什么?

QEMU 仿真会因“致命:尝试在 RAM 或 ROM 之外执行代码”等错误而停止。

这些异常与内存问题有关:

  1. 它不应该是“Segment Not Present (#NP)”:它只在加载段寄存器时发生,但我实际上可以毫无问题地加载扁平段。
  2. 不应生成“Stack Fault (#SS)”,因为代码未引用堆栈。
  3. “一般保护 (#GP)”不应发生,因为代码在 ring-0 中运行,并且段已设置为允许访问每个物理地址。
  4. 分页已禁用,因此也不是“页面错误 (#PF)”。
  5. 而且这不是对齐问题,因此不应触发“对齐检查 (#AC)”。

我没有选择,我不知道应该发生什么。

【问题讨论】:

  • 您的编程问题是什么?从编程的角度来看,正确的答案是“不要那样做”。
  • 请注意,物理地址空间包括一个 MMIO 区域,设备在其中拥有其 MMIO 寄存器。例如在 PC 上通常介于 768MiB 和 1GiB 之间,IIRC。以及ROM。所以“不存在的物理地址”不是指 RAM、ROM 或 MMIO。

标签: assembly x86 ram osdev address-space


【解决方案1】:

如果分页被禁用并且当前段的限制是 4GiB(在 32 位模式下),则没有“不存在”的地址:

本例中存在所有 2^32 个可能的地址,并且可以读写。

如果对没有 RAM、ROM 等所在的地址的读取或写入操作取决于 CPU 外部的硬件而不是 CPU 本身,会发生什么情况。

对此类地址的写入操作通常会被忽略,而读取操作通常会导致无意义的值(在大多数 PC 上,“全一”值,例如 0xFF、0xFFFF、0xFFFFFFFF)。

理论上,这种地址访问可能会导致计算机中断甚至崩溃,具体取决于地址。然而,这不是由 CPU 本身完成的,而是由其他硬件组件完成的。

在这样的地址上执行代码基本上只是从该地址进行读取访问。

【讨论】:

  • 读取“无意义值”是计算机如何在启动时确定安装了多少内存...
  • @KerrekSB:要检查给定地址是否为 RAM,您将值写入 RAM 并读回该值。为了确保您也应该使用不同的值。但是,无法确定某个地址是否包含 ROM(包含值为 0xFF 的字节)或什么都没有!
  • @MartinRosenau :这是我使用 int 15h/AX=E820h 的原因之一(如果需要,可以回退到 AX=E802h/8800h)来映射内存以查找进入保护模式之前的可用 RAM。附带说明 ROM 中的 BIOS 扩展(低于 1mb 和高于 A000:0000)可以通过扫描 2kb 块中的内存来查找前 2 个字节中的 0x55、0xAA 来发现。如果找到,第三个字节将包含 BIOS 扩展使用的 512 字节块的数量。
  • 我认为这取决于CPU的实现方式。根据 8086 数据表,有一个 READY 信号,is the acknowledgement from the addressed memory or I/O device that it will complete the data transfer
【解决方案2】:

我的理解是非分页内存访问直接进入总线,导致未定义的行为(取决于芯片组、总线类型等)——请参阅Manual Probing

注意:尝试读/写不存在的内存时永远不会出错——理解这一点很重要:你不会得到有效的结果,但也不会出错。

【讨论】:

  • 取决于硬件设计,这可能是真的,也可能不是。一些处理器可能在传入数据总线上没有同步器,并且可能依赖外部硬件来确保总线状态在被采样时不会改变。如果总线是浮动的,并且恰好在错误的时间发生变化,它可能会导致相当“有趣”的后果,其中最不令人惊讶的可能是在加载指令根据读取的值设置或清除标志的架构上,标志可能与报告的值不一致。
猜你喜欢
  • 2017-09-16
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多