以下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)
这是操作系统启动代码的一部分;不是任何操作系统下的应用程序。
答案 0 :(得分:4)
根据提供的信息,我怀疑尚未为您的处理器启用SSE指令。如果未启用,它们的使用将触发异常(我认为是向量19)。此外,如果此向量未正确初始化,那么我肯定会看到它导致三重错误。
有关启用处理器SSE指令的更多信息,请参阅64-ia-32-architecture软件开发手册第13卷第3卷。
希望这有帮助。
答案 1 :(得分:2)
鉴于地址已对齐且您处于启动代码中,最初异常的最可能解释是SSE尚未在启动时启用。为什么异常导致三重错误是一个更微妙的问题,但可能你没有设置矢量来处理它。