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

时间:2011-08-20 16:25:35

标签: cpu-architecture win32-process x86-64

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

我理解需要一些程序集,并且会有限制,特别是解决比32位Windows管理更多的内存。但我正在考虑纯粹的计算任务,只需要适量的内存而不需要调用外部函数。

2 个答案:

答案 0 :(得分:9)

在32位通用操作系统中无法使用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是使用管理程序的另一种选择,可以免费使用。

答案 1 :(得分:1)

通常,在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节)

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