assembly - 当处理器试图访问一个不存在的物理地址时会发生什么?

标签 assembly x86

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

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

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

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

  • 它不应该是“Segment Not Present (#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/

    相关文章:

    assembly - 如何在emu8086中创建和绘制 Sprite ?

    assembly - movzwl、%ax 和负值的奇怪结果

    c++ - 初始化 union 内的结构 (C++)

    assembly - 除法导致括号不平衡

    c# - 是否可以从 C# 中执行 x86 汇编序列?

    assembly - mov 立即数到 64 位寄存器的十六进制机器代码没有 REX.W 前缀?

    打印数组所有元素的汇编代码

    c - 如何确定在 C 程序中执行的 x86 机器指令的数量?

    assembly - GCC 内联汇编器,混合寄存器大小 (x86)

    gcc - 使用单个 divl 指令进行除法和取模(i386、amd64)