【发布时间】:2021-07-11 18:02:57
【问题描述】:
(这个问题原本是关于CVTSI2SD指令,我以为它在奔腾M CPU上不起作用,但实际上是因为我使用的是自定义操作系统,我需要手动启用SSE .)
我有一个 Pentium M CPU 和一个自定义操作系统,到目前为止还没有使用 SSE 指令,但我现在需要使用它们。
尝试执行任何 SSE 指令会导致中断 6、非法操作码(在 Linux 中会导致 SIGILL,但这不是 Linux),在 Intel architectures software developer's manual 中也有提及(我从现在开始提及on as IASDM) as #UD - Invalid Opcode (UnDefined Opcode)。
编辑:Peter Cordes 实际上找到了正确的原因,并指出了解决方案,我在下面继续:
如果您运行的旧操作系统不支持在上下文切换时保存 XMM reg,则不会设置其中一个机器控制寄存器中的 SSE 启用位。
确实,IASDM 提到了这一点:
如果操作系统没有为 SSE 提供足够的系统级支持,执行 SSE 或 SSE2 指令也可以生成#UD。
Peter Cordes 向我指出了 SSE OSDev wiki,它描述了如何通过写入 CR0 和 CR4 控制寄存器来启用 SSE:
clear the CR0.EM bit (bit 2) [ CR0 &= ~(1 << 2) ]
set the CR0.MP bit (bit 1) [ CR0 |= (1 << 1) ]
set the CR4.OSFXSR bit (bit 9) [ CR4 |= (1 << 9) ]
set the CR4.OSXMMEXCPT bit (bit 10) [ CR4 |= (1 << 10) ]
请注意,为了能够写入这些寄存器,如果您处于保护模式,那么您需要处于特权级别 0。The answer to this question 解释了如何测试它:如果处于保护模式,即,当CR0 中的bit 0 (PE) 设置为1 时,您可以测试CS 选择器中的bit 0 和bit 1,它们应该都是0。
最后,自定义操作系统必须在上下文切换期间正确处理 XMM 寄存器,必要时保存和恢复它们。
【问题讨论】:
-
“但是,Pentium M 无法识别 CVTSI2SD”源?
-
什么是崩溃的原因 -
SIGILL(“非法指令”)或别的什么? -
能否请您在 GDB 下运行该应用程序,并在崩溃现场给我们
(gdb) disas /r的错误和输出? -
你确定你实际上没有Pentium III-M吗?
-
执行
mov eax, 1 / cpuid后能不能贴出eax的值?
标签: x86 sse instruction-set