【发布时间】:2014-03-16 06:15:59
【问题描述】:
想象一台 32 位 x86 计算机,内存少于 3 GB,CPU 设置为禁用分页和平面段描述符(0x0 作为基础,0xffffffff 作为数据和代码的有效限制)。
当 ring0 中的指令尝试使用 mov 指令来引用没有任何内存地址支持的物理地址时会发生什么?
QEMU 仿真会因“致命:尝试在 RAM 或 ROM 之外执行代码”等错误而停止。
这些异常与内存问题有关:
- 它不应该是“Segment Not Present (
#NP)”:它只在加载段寄存器时发生,但我实际上可以毫无问题地加载扁平段。 - 不应生成“Stack Fault (
#SS)”,因为代码未引用堆栈。 - “一般保护 (
#GP)”不应发生,因为代码在 ring-0 中运行,并且段已设置为允许访问每个物理地址。 - 分页已禁用,因此也不是“页面错误 (
#PF)”。 - 而且这不是对齐问题,因此不应触发“对齐检查 (
#AC)”。
我没有选择,我不知道应该发生什么。
【问题讨论】:
-
您的编程问题是什么?从编程的角度来看,正确的答案是“不要那样做”。
-
请注意,物理地址空间包括一个 MMIO 区域,设备在其中拥有其 MMIO 寄存器。例如在 PC 上通常介于 768MiB 和 1GiB 之间,IIRC。以及ROM。所以“不存在的物理地址”不是指 RAM、ROM 或 MMIO。
标签: assembly x86 ram osdev address-space