【发布时间】:2013-08-22 22:59:14
【问题描述】:
以下 x86 指令导致三重故障异常(cpu 重置)。知道为什么吗?
0042F94B F20F100520E44300 movsd xmm0,qword [dword 0x43e420]
在该指令之前插入了以下代码,以验证 0x43e420 处的内存是否可访问(它是):
0042F945 8B0520E44300 mov eax,[dword 0x43e420]
X86 处于保护模式。 GDT 设置正确,段寄存器都是 0x10,除了 cs 是 0x8。两个 GDT 条目都是平坦的,并用尽了整个 32 位内存空间。未设置 eflags 上的对齐检查 (AC)。
0x43e420 处的内存是:
0x43e420: 00 00 00 00 00 00 00 40
Bochs 模拟器在执行该指令后输出这些消息:
interrupt(): gate.type(9) != {5,6,7,14,15}
interrupt(): gate descriptor is not valid sys seg (vector=0x0d)
interrupt(): gate descriptor is not valid sys seg (vector=0x08)
这是操作系统启动代码的一部分;不是任何操作系统下的应用程序。
【问题讨论】:
-
这条指令看起来很时髦。 AFAIK,
movsd是一个双字大小的字符串移动。你的意思是movq吗? -
有两条同名的操作码指令。这里使用的 movsd 是 SSE2 指令集的一部分。
-
有。嗯,这不是很方便,是吗?哦,好吧,每天都学点新东西。那么,对于这个问题,这可能是对齐问题吗?
-
我不知道怎么做。 0x43e420 最多对齐 32 个字节。加上对齐检查已关闭。
-
是的,我现在知道您已经检查过了 - 抱歉。