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

6
对于一些使用64位变量的CPU密集型代码,使用Amd64指令集而不是x86是有益的。如何在32位Windows(例如Windows XP SP3)下实现?当然,我假设使用现代的、启用了Amd64的CPU。我排除了工作繁重但可行的方法:作为虚拟机运行完整的64位操作系统,例如在Virtualbox下的Ubuntu for Amd64。
我知道需要一些汇编,并且会受到限制,尤其是寻址超出32位Windows管理的内存。但我考虑的是纯计算任务,只需要适量的内存和不调用外部函数。

2
我认为这不会很容易...你必须以某种方式钩取调度程序,使CPU在调度程序将CPU控制权交给您的代码时进入64位模式,然后在调度程序想要CPU回来时切换回32位模式。这肯定不能在用户模式下完成(您需要规避抢占式多任务处理的整个要点)。 - Matteo Italia
2个回答

10

在没有内核修改/特殊驱动程序/虚拟化的情况下,32位通用操作系统无法使用Amd64指令(长模式)。

原因是:

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

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

也许可以编写特殊的驱动程序,在32位操作系统上执行64位任务,但这种驱动程序更像是64位内核和内核动态打补丁程序。我不知道这样的解决方案。

当在32位操作系统中运行时,您只能使用MMX、SSE、SSE2、SSE3、AVX来访问CPU的64位算术逻辑单元和寄存器。

我可以说的是,Linux、某些BSD、Mac OS X具有一种模式,即使用64位内核,但用户空间软件是32位的。在这种情况下,将可以运行32位和64位应用程序,因为内核知道64位模式并可以访问64位寄存器来执行任务切换。据我所知,MS Windows本身没有这种模式(W7模拟32位模式,但这被MS称为模拟器,因此我认为这不是内核特性)。

其他可能性(如果您的CPU支持硬件虚拟化,这更好),是使用64位虚拟机监控程序(VMware / Xen等过于昂贵的解决方案)与32位和64位客户机操作系统一起使用。VirtualBox是使用虚拟机监视程序的另一个选项,也可以免费使用。


1
请注意,在兼容模式下,REX前缀被解释为有效的(INC或DEC)指令。 - bdonlan
另一方面,这种“特殊驱动程序”可能可以编写:否则,VMWare等如何在运行在64位处理器上的32位主机上运行64位客户端? ---编辑--- VT-x / AMD-V似乎是答案。 - Matteo Italia
fgrieu,1)要使用amd64指令,您需要进入长模式。2)进入长模式后,CPU会更改有关操作系统如何管理内存的假设(页表具有其他格式)。3)32位XP对amd64位页表一无所知。 32位XP不知道驱动程序和中断在长模式下的工作方式。 - osgx
2
fgrieu,Virtual Box只有在以下情况下才能实现此功能(主机为32位,客户机为64位):http://www.virtualbox.org/manual/ch03.html#intro-64bitguests "64位处理器具有硬件虚拟化支持" - 因此这是我的答案中简要描述的hypervisor解决方案。在这种情况下,hypervisor是非常小的64位操作系统,由VBOX驱动程序启动。它管理内存并路由/转换中断,调度64位和32位任务(执行长/保护模式切换),特权和非特权都可以。此外,此模式(请参见链接中的第3页)"会产生额外的开销"。 - osgx
1
fgrieu,源代码位于 VBox/VMM 中。我能够在此处识别模式切换器 http://www.virtualbox.org/browser/trunk/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac ,VMM 是虚拟机监控程序的源头(VMM = 虚拟机监视器;英特尔硬件虚拟化术语)。 - osgx
显示剩余5条评论

2

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

  • 32位操作系统无法识别额外的64位寄存器(以及现有寄存器的高32位),也不会在任务切换时保留这些寄存器。
  • 32位操作系统未准备好启用64位代码执行。启用64位代码执行意味着要切换到IA-32e分页模式(需要完全不同的页表格式)并设置GDT(或LDT)中代码段描述符中的CS.L = 1和CS.D = 0。(请参阅IA-32手册,第3a / 3b卷5.2.1章节)

原则上,您可以编写新的Windows HAL来解决这两个问题,该HAL以IA-32e模式运行,并切换到64位跳转代码段以保存和恢复64位寄存器。这是一项相当复杂的任务,请参阅Windows DDK以获取详细信息。如果您的CPU支持VMX,则还可以使用仿真方法,例如VirtualBox等。但从一开始就使用64位操作系统会更简单。


1
VMX不是模拟,而是硬件辅助虚拟化。 - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接