【问题标题】:Why is x86 movsd causing a triple fault exception?为什么 x86 movsd 会导致三重错误异常?
【发布时间】: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 个字节。加上对齐检查已关闭。
  • 是的,我现在知道您已经检查过了 - 抱歉。

标签: assembly x86


【解决方案1】:

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

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

希望这会有所帮助。

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多