想象一台 32 位 x86 计算机,其内存少于 3 GB,CPU 设置为禁用分页和平面段描述符(0x0
作为基础,0xffffffff
作为数据和代码的有效限制)。
当 ring0 中的一条指令试图使用一条mov
指令来引用一个没有任何内存地址支持的物理地址时会发生什么?
QEMU 仿真只是因为“致命:尝试在 RAM 或 ROM 之外执行代码”之类的错误而停止。
这些异常与内存问题有关:
- 它不应该是“段不存在(
#NP
)”:它只在加载段寄存器时发生,但我实际上可以毫无问题地加载扁平段。 #SS
不应生成“堆栈错误( )”,因为代码不引用堆栈。- “一般保护(
#GP
)”不应该发生,因为代码在 ring-0 中运行并且段被设置为允许访问每个物理地址。 - 分页被禁用,因此它也不是“页面错误(
#PF
)”。 - 而且这不是对齐问题,因此不应触发“对齐检查(
#AC
)”。
我没有选择,我不知道会发生什么。