简单来说,Windows 为 32 位程序提供 32 位版本系统库和一个用于访问 64 位内核的转接层 WOW64 来确保兼容性。
32 位程序在 64 位系统上执行时像往常一样加载和调用 32 位版本系统库,只是对 32 位版本系统库的调用将在内部被通过 WOW64 转调至 64 位版本。 并且在访问特定注册表项和文件时,32 位程序会被重定向至 32 位版本的内容。这些机制对程序来说是无感的。
重定向机制:
-
注册表重定向
64 位系统会对 32 位程序的特定注册表访问实施重定向,以防止注册表冲突。 注册表重定向本质上是提供两份注册表项,一份供 64 位程序使用,另一份供 32 位程序使用。 不同 Windows 版本之间会重定向的注册表项可能是不同的 (LOCAL_MACHINE/Software 下的内容几乎总是被重定向)。 应用程序在访问注册表时可在 samDesired 参数中添加
KEY_WOW64_64KEY 或 KEY_WOW64_32KEY 标识以访问指定版本的注册表。 -
注册表反射
一些注册表项的值在 32 位和 64 位注册表中是必须相同的。为了确保这一点,Windows 引入了注册表反射机制。 这些注册表项的值在被更改后将会同步至另一版本的注册表中。同步的时机点是注册表项被关闭(RegCloseKey)的那一刻。 应用程序可通过RegEnableReflectionKey和RegDisableReflectionKeyAPI 来启用/禁用注册表项的反射。 -
文件重定向
为了确保 32 位程序能够找到自己所需版本的系统文件,Windows 引入了该机制。 当 32 位程序在访问 System32 等目录时将会被重定向至相应的 SysWOW64 目录下。 应用程序可以通过Wow64DisableWow64FsRedirectionWow64EnableWow64FsRedirection和Wow64RevertWow64FsRedirectionAPI 来避免被重定向。
额外补充:
-
WoW进程
运行在 64 位系统上的 32 位程序被称为 WoW 进程。 -
安腾处理器
安腾处理器下,Windows 使用 8kb 页面模拟 32 位程序的 4kb 页面,这导致小部分相关 API 不可用。 并且如果同一个 32 位程序有多个实例同时运行,其会增加显著的虚拟内存开销。 -
性能问题
x86-64 架构处理器直接支持 x86 指令,因此 32 位程序执行速度与在 32 位系统上相似。而在安腾和 ARM64 处理器下,32 位程序性能会有受影响。
详细内容请参考文档系列:https://learn.microsoft.com/en-us/windows/win32/winprog64/running-32-bit-applications