(这个问题原本对CVTSI2SD
指令,我认为它没有Pentium M的CPU上运行的事实,但实际上是因为我使用的是定制的操作系统,我需要手动启用SSE)。
我有一个奔腾M CPU,并且至今没有使用SSE指令定制的操作系统,但我现在需要使用它们。
试图在中断6执行任何SSE指令的结果,非法操作码(在Linux的会导致SIGILL
,但这不是Linux),也提到了英特尔架构软件开发人员手册 (这是我从现在开始,请参阅作为IASDM )作为#UD -无效的操作码(未定义操作码)。
编辑 :彼得·科德斯实际上确定了真正的原因,并指出我的解决方案,我在下面继续:
如果你正在运行一个古老的操作系统,不支持上下文切换省电XMM暂存器,在机器控制寄存器中的SSE启用位将不会被设置。
事实上,IASDM提到这一点:
如果操作系统没有提供足够的SSE系统级支持,执行一个SSE或SSE2指令也可以生成#UD。
彼得·科德斯向我指出的SSE OSDev维基 ,介绍如何通过写既能使SSE CR0
和CR4
控制寄存器:
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 回答这个问题解释了如何测试:如果在保护模式下,也就是当第0位( PE
中) CR0
被设置为1,则可以从测试位0和1 CS
选择器,它应该均为0。
最后,定制的操作系统必须在适当的上下文切换处理XMM寄存器,通过保存并在必要时恢复它们。