如何启用SSE我独立的启动代码?如何启用SSE我独立的启动代码?(How do I enable S

2019-05-12 07:55发布

(这个问题原本对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 CR0CR4控制寄存器:

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寄存器,通过保存并在必要时恢复它们。

Answer 1:

如果你正在运行一个古老的或定制的操作系统,不支持上下文切换省电XMM暂存器,它不会在机器控制寄存器设置上证所启用位。 在这种情况下,那一抹XMM暂存器的指令都将故障。

我花了一秒钟找到,但http://wiki.osdev.org/SSE解释如何改变CR0和CR4允许SSE指令,而无需在裸机上运行#UD


我对你的旧版本的问题,首先想到的是,你可能已经编译程序-mavx-march=sandybridge或同等学历,从而使编译器发出的一切的VEX编码版本。

CVTSI2SD   xmm1, xmm2/m32         ; SSE2
VCVTSI2SD  xmm1, xmm2, xmm3/m32   ; AVX

见https://stackoverflow.com/tags/x86/info的链接,包括英特尔的insn设置参考手册。


相关阅读: 哪些支持Windows版本/需要哪些CPU多媒体扩展? 在如何检查的AVX和AVX512(其中还引入新的结构状态,所以操作系统必须设置一个位或硬件将发生故障)支持的一些细节。 它的到来它从另一个角度,但链接应说明如何启用/禁用AVX的支持。



Answer 2:

我建议你查阅英特尔的手册 ,当你有这样的疑问。

它的说明书中明确指出CVTSI2SD是SSE2指令。



文章来源: How do I enable SSE for my freestanding bootable code?