想象一下一台内存不足 3 GB 的 32 位 x86 计算机,其 CPU 设置为禁用分页和平面段描述符(0x0
作为基础,0xffffffff
作为数据和代码的有效限制)。
当 ring0 中的指令尝试使用 mov
时会发生什么引用不受任何内存地址支持的物理地址的指令?
QEMU 仿真只是因为“致命:尝试在 RAM 或 ROM 之外执行代码”之类的错误而停止。
这些异常与内存问题有关:
#NP
)”:它只在加载段寄存器时发生,但我实际上可以毫无问题地加载平面段。 #SS
)”,因为代码不引用堆栈。 #GP
)”不应该发生,因为代码在 ring-0 中运行并且段被设置为允许访问每个物理地址。 #PF
)”。 #AC
)”。 我用尽了选择,我不知道会发生什么。
最佳答案
如果分页被禁用并且当前段的限制是 4GiB(在 32 位模式下),则没有“不存在”的地址:
在这种情况下,所有 2^32 个可能的地址都存在并且可以读取和写入。
如果对没有 RAM、ROM 等的地址进行读或写操作,会发生什么取决于 CPU 外部的硬件而不是 CPU 本身。
对此类地址的写操作通常会被忽略,而读操作通常会导致无意义值(在大多数 PC 上,“全 1”值如 0xFF、0xFFFF、0xFFFFFFFF)。
理论上这样的地址访问可能会导致中断甚至导致计算机崩溃,具体取决于地址。然而,这不是由 CPU 本身完成的,而是由其他硬件组件完成的。
在这样的地址上执行代码基本上只是对该地址的读取访问。
关于assembly - 当处理器试图访问一个不存在的物理地址时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21820814/