6

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

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

4

2 回答 2

10

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

这是因为:

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

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

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

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

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

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

于 2011-08-20T16:27:32.567 回答
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 位操作系统会简单得多。

于 2011-08-20T16:51:57.063 回答