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

发布于 2024-11-30 08:30:39 字数 284 浏览 2 评论 0原文

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

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

For some CPU-bound code using 64-bit variables, it is beneficial to use the Amd64 instruction set rather than x86. How can it be done under 32-bit Windows (e.g. Windows XP SP3)? Of course I assume a modern, Amd64-enabled CPU. I'm excluding the working but heavyweight method: running a full-blown 64-bit OS as a virtual machine, e.g. Ubuntu for Amd64 under Virtualbox.

I understand some assembly is needed, and there will restrictions, in particular addressing more memory than 32-bit Windows manages. But I'm thinking of purely computational tasks needing only a moderate amount of memory and no call to external functions.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

执手闯天涯 2024-12-07 08:30:39

无法在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 是使用管理程序的另一种选择,并且可以免费使用。

There is no way to use Amd64 instructions (Long mode) in 32-bit general-purpose OS (without kernel modification/special drivers/hypervisor).

This is because:

1) to use native 64-bit instructions you need to switch into long mode. This is privileged action. 32-bit OS kernel can't continue to work if the CPU is switched into 64-bit mode, so you should switch back before entering a kernel

2) But kernel are often called asynchronously, for timer (scheduler) and other hardware interrupts (drivers). It will not save 64-bit registers nor change mode from long into protected.

May be it is possible to write special driver, which will do the 64-bit tasks on 32-bit OS, but such driver is more like 64-bit kernel and dynamic patcher of kernel. I know no one such solution.

You can only use MMX, SSE, SSE2, SSE3, AVX for accessing 64-bit ALU and registers of your CPU when running in 32-bit OS.

I can say, that Linux, some BSD, Mac OS X have a mode, when 64-bit kernel is used, but user-space software is 32-bit. In such case it will be possible to run both 32-bit and 64-bit applications, because kernel knows about 64-bit mode and can access 64-bit registers to do a task switch. As far as I know, MS Windows have not such mode itself (the W7 emulates 32bit mode, but this is called my MS as simulator so I assume it is not an in-kernel feature).

Other possibility (this is better, is your CPU has support of hardware virtualization), is to use 64-bit hypervisor (VMware/Xen, other overpriced solutions) with 32-bit and 64-bit guest OSes. VirtualBox is other option of using hypervisor, and it is free to use.

旧街凉风 2024-12-07 08:30:39

一般来说,在 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 位Tampoline 代码段用于保存和恢复 64 位寄存器。这是一个相当复杂的任务;有关详细信息,请查看 Windows DDK。如果您的 CPU 支持 VMX,您还可以使用仿真方法,就像 VirtualBox 及其朋友所做的那样。但从一开始就使用 64 位操作系统会简单得多。

In general, running 64-bit code in a 32-bit OS kernel is going to be next to impossible, for the following reasons:

  • The 32-bit OS is unaware of the additional 64-bit registers (and upper 32-bits of the existing registers) and will not save them across task switches
  • The 32-bit OS is not prepared to enable 64-bit code execution. Enabling 64-bit code execution means switching to IA-32e paging (which requires an entirely different page table format) and setting CS.L = 1 and CS.D = 0 in the code segment descriptor in the GDT (or LDT). (See the IA-32 manuals, vol 3a/3b 5.2.1)

In principle, you may be able to workaround both problems by writing a new HAL for Windows, which operates in IA-32e mode, and switches to a 64-bit trampoline code segment to save and restore 64-bit registers. This is a rather complex task; take a look at the Windows DDK for details. You could also use an emulation approach, as VirtualBox and friends do, if your CPU supports VMX. But it would be much simpler to simply use a 64-bit OS from the start.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文