当处理器尝试访问不存在的物理地址时会发生什么?

2023-11-22

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

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

QEMU 仿真只是停止并出现诸如“致命:尝试在 RAM 或 ROM 之外执行代码”之类的错误。

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

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

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


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

在这种情况下,所有 2^32 个可能的地址都存在并且可以读取和写入。

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当处理器尝试访问不存在的物理地址时会发生什么? 的相关文章

随机推荐