【问题标题】:What happens when windows encounters an unknown instruction in a binary?当 Windows 在二进制文件中遇到未知指令时会发生什么?
【发布时间】:2010-09-28 08:56:27
【问题描述】:

我们有一个使用 SSE3 优化编译的二进制文件,最终使用指令 LDDQU。现在,当此代码在仅支持 SSE1,2 的 Windows 系统(单核,XP2)上执行时(如通过 CPU-Z 工具所见),应用程序将崩溃。

(924.4f0):无效的锁定序列 - 代码 c000001e(第一次机会) ... 001700a10 f20ff00430 lddqu xmm0,xm​​mword ptr [eax+esi] ds:0023:1e08d200=270a57364a4a77896db676459d8c40a9 ...

有人能告诉我这次崩溃意味着什么以及可能的修复方法吗?

【问题讨论】:

    标签: c++ winapi operating-system


    【解决方案1】:

    应用程序是在支持 SSE3 的情况下编译的,但在不支持 SSE3 的 CPU 上运行时会崩溃。啧啧,好奇怪!选择指令集的编译器选项必须存在,因为微软的某些程序员有一天感到无聊。

    您有多种选择:

    • 仅使用 SSE2 指令集制作单个版本的应用程序
    • 使用不同的指令集编译不同版本的应用程序
    • 使用结构化异常处理 (SEH) 来实现不受支持指令的用户模式模拟。

    最后一种方法比前两种方法更耗时,存在一些性能问题,但这些缺点远小于它给您带来的优点。如果您选择第三种解决方案,您还可以发明自己的操作码! 混淆程序控制流的完美方式,这对于阻碍程序的逆向工程并因此保护您的程序非常有用。知识产权。

    【讨论】:

    • 至少有一个额外的选项,它由英特尔的编译器积极实施: * 使用 SSE2 和 SSE3 代码路径制作应用程序的单个版本。在运行时,根据处理器进行分支。
    【解决方案2】:

    遇到未知指令的是硬件。就像您不能让摩托罗拉芯片执行 x86 代码一样,此处理器无法识别 LDDQU 指令。

    CPU 将引发一个中断,由操作系统处理,并转换为您收到的错误消息。

    你能做什么?您也只能为“较低级别”平台构建二进制文件。目标“x86”可能会做。然后编译器将发出 x86 兼容的代码。您可能希望以两个版本发布您的软件:“优化”和“兼容”。

    【讨论】:

      【解决方案3】:

      应该引发异常,一般是EXCEPTION_ILLEGAL_INSTRUCTION from msdn

      EXCEPTION_ILLEGAL_INSTRUCTION 线程试图执行一个无效的 说明。

      但是,在您的情况下,CPU 无法正确地对执行流进行交互并将其分解为更小的部分,从而导致未定义的行为(在此某些指令中添加了 LOCK 前缀,来自 SSE3 的剩余字节指令,但它不支持 LOCK 前缀并发出异常信号)。除了制作 SSE2 版本,或测试 SSE 故障并根据支持的内容对代码进行分支之外,真的没有什么可做的)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 2014-06-21
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-28
        相关资源
        最近更新 更多