为什么x86 movsd会导致三重故障异常?

时间:2013-08-22 22:59:14

标签: assembly x86

以下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)

这是操作系统启动代码的一部分;不是任何操作系统下的应用程序。

2 个答案:

答案 0 :(得分:4)

根据提供的信息,我怀疑尚未为您的处理器启用SSE指令。如果未启用,它们的使用将触发异常(我认为是向量19)。此外,如果此向量未正确初始化,那么我肯定会看到它导致三重错误。

有关启用处理器SSE指令的更多信息,请参阅64-ia-32-architecture软件开发手册第13卷第3卷。

希望这有帮助。

答案 1 :(得分:2)

鉴于地址已对齐且您处于启动代码中,最初异常的最可能解释是SSE尚未在启动时启用。为什么异常导致三重错误是一个更微妙的问题,但可能你没有设置矢量来处理它。