8

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

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

QEMU 仿真只是因为“致命:尝试在 RAM 或 ROM 之外执行代码”之类的错误而停止。

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

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

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

4

2 回答 2

6

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

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

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

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

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

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

于 2014-02-17T07:51:47.067 回答
5

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

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

于 2014-02-17T06:58:55.763 回答