在32位Windows下使用Amd64指令的轻量级方法



对于一些使用64位变量的cpu绑定代码,使用Amd64指令集比使用x86指令集更有益。如何在32位Windows(例如Windows XP SP3)下完成?当然,我假设是一个现代的、支持amd64的CPU。我排除了工作但重量级的方法:将一个完整的64位操作系统作为虚拟机运行,例如Virtualbox下的Ubuntu for Amd64。

我知道需要一些汇编,并且会有限制,特别是寻址比32位Windows管理的内存更多。但我认为纯粹的计算任务只需要适量的内存,不需要调用外部函数。

无法在32位通用操作系统中使用Amd64指令(Long模式)(不需要修改内核/特殊驱动程序/管理程序)

这是因为:

1)要使用本机64位指令,您需要切换到长模式。这是特权行为。如果CPU切换到64位模式,32位操作系统内核将无法继续工作,因此您应该在进入内核

之前切换回来。

2)但是内核通常是异步调用的,用于定时器(调度程序)和其他硬件中断(驱动程序)。它不会保存64位寄存器,也不会将模式从long更改为protected。

也许可以编写特殊的驱动程序,在32位操作系统上完成64位任务,但这样的驱动程序更像是64位内核和内核的动态补丁程序。我不知道有什么办法。

在32位操作系统中,您只能使用MMX, SSE, SSE2, SSE3, AVX来访问64位ALU和CPU寄存器。

我可以说,Linux,一些BSD, Mac OS X有一个模式,当64位内核使用,但用户空间软件是32位。在这种情况下,可以同时运行32位和64位应用程序,因为内核知道64位模式,并且可以访问64位寄存器来进行任务切换。据我所知,MS Windows本身没有这样的模式(W7模拟32位模式,但这被称为我的MS模拟器,所以我认为它不是内核功能)。

另一种可能性(这更好,是您的CPU支持硬件虚拟化)是在32位和64位客户机操作系统上使用64位管理程序(VMware/Xen,其他价格过高的解决方案)。VirtualBox是使用虚拟机监控程序的另一种选择,它是免费使用的。

一般来说,在32位操作系统内核中运行64位代码几乎是不可能的,原因如下:

  • 32位操作系统不知道额外的64位寄存器(以及现有寄存器的上32位),并且不会跨任务切换保存它们
  • 32位操作系统未准备好启用64位代码执行。启用64位代码执行意味着切换到IA-32e分页(这需要完全不同的页表格式)并设置CS。L = 1, CS。GDT(或LDT)中的代码段描述符D = 0。(见IA-32手册,第3a/3b卷5.2.1)

原则上,您可以通过为Windows编写新的HAL来解决这两个问题,该HAL在IA-32e模式下运行,并切换到64位蹦床代码段以保存和恢复64位寄存器。这是一项相当复杂的任务;请查看Windows DDK以了解详细信息。如果你的CPU支持VMX,你也可以使用模拟方法,就像VirtualBox和它的朋友所做的那样。但是从一开始就使用64位操作系统会简单得多。

最新更新