ano*_*nol 6 x86 sse instruction-set
(这个问题最初是关于CVTSI2SD
指令和我认为它在Pentium M CPU上不起作用的事实,但实际上是因为我使用的是自定义操作系统,我需要手动启用SSE.)
我有一个Pentium M CPU和一个自定义操作系统,到目前为止没有使用SSE指令,但我现在需要使用它们.
尝试执行任何SSE指令会导致中断6,非法操作码(在Linux中会导致a SIGILL
,但这不是Linux),也在英特尔架构软件开发人员手册中提到(我现在将其称为IASDM) as #UD - 无效操作码(UnDefined Opcode).
编辑:彼得·科德斯实际上确定了正确的原因,并指出了解决方案,我在下面继续:
如果您运行的是不支持在上下文切换时保存XMM regs的古老操作系统,则不会设置其中一个机器控制寄存器中的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) ]
Run Code Online (Sandbox Code Playgroud)
请注意,为了能够写入这些寄存器,如果您处于保护模式,那么您需要处于特权级别0. 此问题的答案解释了如何测试它:如果处于保护模式,即,当位0(PE
)输入CR0
设置为1时,您可以测试CS
选择器中的位0和1 ,它们应该都是0.
最后,自定义操作系统必须在上下文切换期间通过在必要时保存和恢复它们来正确处理XMM寄存器.
如果您运行的是不支持在上下文切换时保存XMM reg的古老或自定义OS,则不会在机器控制寄存器中设置SSE使能位.在这种情况下,触及xmm regs的所有指令都将出错.
我花了一秒钟才找到,但是http://wiki.osdev.org/SSE解释了如何改变CR0和CR4以允许SSE指令在没有裸机的情况下运行#UD
.
我对你的旧版本的问题,首先想到的是,你可能已经编译程序-mavx
,-march=sandybridge
或等同,从而使编译器发出的一切的VEX编码版本.
CVTSI2SD xmm1, xmm2/m32 ; SSE2
VCVTSI2SD xmm1, xmm2, xmm3/m32 ; AVX
Run Code Online (Sandbox Code Playgroud)
有关链接,请参阅https://stackoverflow.com/tags/x86/info,包括英特尔的insn set参考手册.
相关:哪些版本的Windows支持/需要哪些CPU多媒体扩展?有一些关于如何检查对AVX和AVX512的支持的细节(这也引入了新的架构状态,因此操作系统必须设置一点或硬件会出错).它是从另一个角度来看它,但链接应指示如何激活/禁用AVX支持.
归档时间: |
|
查看次数: |
1125 次 |
最近记录: |