2

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

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

4

2 回答 2

6

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

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

希望这可以帮助。

于 2013-08-23T00:21:33.053 回答
2

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

于 2013-08-23T00:20:11.857 回答