对于某些使用64位变量的cpu绑定代码,使用Amd64指令集而不是x86是有益的.如何在32位
Windows(例如
Windows XP SP3)下完成?当然,我假设一个现代的,支持Amd64的cpu.我排除了工作但重量级的方法:将一个完整的64位操作系统作为虚拟机运行,例如VirtualBox下的Udntu for Amd64.
我知道需要一些程序集,并且会有限制,特别是解决比32位Windows管理更多的内存.但我正在考虑纯粹的计算任务,只需要适量的内存而不需要调用外部函数.
在32位通用OS(无内核修改/特殊驱动程序/管理程序)中无法使用Amd64指令(长模式).
这是因为:
1)使用本机64位指令需要切换到长模式.这是特权行动.如果cpu切换到64位模式,32位操作系统内核无法继续工作,因此在进入内核之前应该切换回来
2)但是内核通常是异步调用的,用于定时器(调度程序)和其他硬件中断(驱动程序).它不会保存64位寄存器,也不会将模式从long更改为protected.
也许可以编写特殊的驱动程序,它将在32位操作系统上执行64位任务,但这种驱动程序更像是64位内核和内核的动态修补程序.我不知道这样的解决方案.
在32位操作系统中运行时,只能使用MMX,SSE,SSE2,SSE3,AVX访问64位ALU和cpu寄存器.
我可以说,当使用64位内核时,Linux,某些BSD,Mac OS X都有一种模式,但用户空间软件是32位.在这种情况下,可以运行32位和64位应用程序,因为内核知道64位模式并且可以访问64位寄存器来执行任务切换.据我所知,MS Windows本身没有这样的模式(W7模拟32位模式,但这被称为我的MS作为模拟器,因此我认为它不是内核中的特性).
其他可能性(这是更好的,你的cpu支持硬件虚拟化),是使用64位虚拟机管理程序(VMware / Xen,其他价格过高的解决方案)与32位和64位客户操作系统. VirtualBox是使用管理程序的另一种选择,可以免费使用.