随着硬件的发展,为了让用户能够在新的平台上继续使用现有的工具和服务,操作系统往往支持旧版本的应用程序。
微软是通过引入WOW64(Windows 32-bit on Windows 64-bit)技术,实现了在64位Windows操作系统上运行32位x86应用程序的能力。
今天我们将深入探讨这一兼容性技术的背后原理,包括CPU指令集的角色、兼容技术的起源以及一些关键的实现细节。
CPU的支持
x64系统兼容x86程序离不开CPU的支持。
CPU模式切换和指令集
在x64处理器中,有两种模式对于运行应用程序非常重要:64位模式(也称为长模式)和兼容模式。64位模式允许运行64位代码,而兼容模式则允许处理器在64位操作系统下运行32位代码。切换这两种模式是通过修改处理器的状态,主要是CS(代码段)寄存器来实现的。特定的CPU指令,比如REX前缀,用于在64位代码中指示扩展的寄存器使用。
WOW64利用了这些CPU特性来支持32位应用程序。当32位应用程序启动时,它会在兼容模式下运行。当这个应用程序发出系统调用时,WOW64会介入,并在将控制权传递给64位操作系统内核之前,将处理器状态从32位兼容模式切换到64位模式。
这个cpu特性是操作系统得以运行32程序的硬件前提。
AMD64
64位扩展到x86架构,最初是由AMD公司推出的,称为AMD64。这种技术后来被广泛接受并成为业界标准,Intel也推出了与之兼容的技术,称为Intel 64(以前称为EM64T)。这些64位扩展使得x86处理器能够运行64位指令集,同时保持对传统32位x86软件的兼容性。
IA-64/Itanium
在此之前,英特尔和惠普共同开发的一种64位计算机架构,称为IA-64/Itanium。IA-64设计为一种全新的架构,使用了与x86完全不同的指令集架构(ISA),这种指令集被称为显式并行指令计算(EPIC)。EPIC能提高指令级并行性(ILP)和计算效率,更好地利用现代微处理器的性能潜力。
由于IA-64是一个全新的架构,它并不是原生支持x86指令集的。这意味着IA-64处理器不能直接以硬件模式运行传统的x86程序。
为了实现向后兼容性,Itanium处理器确实提供了一种模拟x86指令集的机制,允许运行32位x86软件。这是通过在处理器或操作系统层面上的软件模拟来实现的。这种模拟方式允许IA-64处理器运行x86程序,但这通常会带来显著的性能损失,因此,Itanium的这种x86兼容模式更多被视为一个过渡方案,主要用于支持那些尚未为IA-64架构重新编译的应用程序。
由于Itanium处理器主要针对的是高端服务器和企业级计算市场,并且需要软件专门为其架构优化以发挥最佳性能,这使得Itanium处理器在通用计算市场上的吸引力受限,在个人计算和小型服务器市场更难生存。相比之下,AMD64架构(x86-64)由于其与传统x86架构的兼容性,以及能够直接支持现有的32位应用程序和操作系统,因此在广泛的市场应用中取得了更大的成功。随着时间的推移,x86-64成为了主流的64位计算架构,IA-64/Itanium逐渐退出市场。
WOW64的工作原理
系统调用转换
WOW64包含一个名为“thunking”的过程,用于将32位系统调用转换为64位调用。这个过程涉及到修改调用参数和调用堆栈,以适应64位系统的要求。在64位操作系统内核完成调用处理后,结果需要被转换回32位格式并返回给32位应用程序。
文件系统和注册表重定向
WOW64使用重定向技术来隔离32位和64位应用程序的文件系统和注册表访问。这是通过在内部使用不同的路径和注册表键来实现的。例如,32位应用程序尝试访问“C:\Program Files”时,实际上重定向到了“C:\Program Files (x86)”目录。注册表也有类似的重定向机制,确保32位应用程序只能看到和修改它们自己的视图。
技术细节
寄存器布局
在x86架构中,通用寄存器(如EAX, EBX等)是32位宽的,而在x64架构中,对应的寄存器(如RAX, RBX等)扩展到了64位。WOW64必须在64位模式下模拟出32位寄存器的行为,因此当32位应用程序运行时,WOW64需要确保这些寄存器只使用低32位,而高32位保持不变。
寻址能力
64位架构能够直接访问更大的内存空间(理论上可达16 EB),而32位架构的寻址范围限制在4 GB之内。WOW64通过虚拟内存映射技术,使得32位应用程序可以在64位环境下正常运行而不超出其寻址范围。此外,WOW64还必须处理32位应用程序试图访问超过4GB内存的情况,这通常涉及到内存分段或重新分配内存块。
指令集差异
x64架构引入了新的指令集,例如AVX和AVX-512,这些指令在32位架构中是不可用的。WOW64需要识别这些指令,并在必要时进行转译或忽略。此外,对于某些特定的指令,WOW64需要模拟它们在32位环境下的行为,以确保应用程序的正常运行。
相关技术的历史
WOW64的类型兼容层技术并非微软发明。最早可以追溯到DEC(Digital Equipment Corporation)为其VAX计算机系统开发的VMS操作系统,以及后来的Alpha处理器架构。微软在64位版本的Windows XP和Windows Server 2003中首次引入了WOW64,以便在新的64位处理器上运行32位Windows应用程序。
从16位到32位再到64位的过渡是计算机技术发展中的一次重大飞跃。最初,IBM PC使用的是16位架构,随后随着Intel 80386的推出,计算机进入了32位时代。到了20世纪90年代末,随着IA-64和AMD64架构的出现,64位计算成为了可能。每一步过渡都伴随着兼容性问题的挑战,需要设计专门的技术来确保老版本的应用程序能够在新架构上运行。
在Linux平台上,通过使用
emul(32)
和
emul(64)
来实现32位和64位二进制的兼容性。微软在设计WOW64时借鉴了这些先例,并且为了支持广泛的32位应用程序,进行了更为复杂的实现。
兼容性问题
内存访问错误
某些32位应用程序可能试图访问超出其合法范围的内存区域。WOW64需要确保这些访问不会导致系统崩溃或其他不稳定行为。例如,如果32位应用程序尝试读取或写入64位内存地址,WOW64需要拦截这样的尝试,并模拟正确的访问行为。
驱动程序兼容性
32位设备驱动程序无法在64位环境下正确工作。这是因为驱动程序依赖于特定的32位API或数据结构。WOW64需要确保只有经过验证的32位驱动程序才能加载,并且它们必须与64位内核兼容。
性能瓶颈
密集使用系统调用的应用程序会因为WOW64的额外开销而表现出性能下降。此外,某些应用程序没有针对64位环境进行优化,导致在64位架构上运行效率较低。
性能影响
计算密集型负载
对于计算密集型应用,WOW64带来的性能损失相对较小,因为主要的计算任务不在WOW64的处理范围内。然而,对于那些需要大量系统调用的应用程序,性能损耗会比较明显。
I/O密集型负载
这类应用会受到较大的影响,因为频繁的系统调用会导致更多的性能损耗。例如,数据库服务器或Web服务器等应用会因为频繁的磁盘I/O操作而受到影响。
安全漏洞问题
微软在64位Windows中引入诸如ASLR(地址空间布局随机化)和DEP(数据执行保护)等安全功能来增强安全性。这些功能在32位环境下不完全可用,因此,32位应用程序相比64位程序更容易出现安全漏洞,包括缓冲区溢出、权限提升等问题。
相关技术和工具
兼容性测试工具
例如,Microsoft提供的Application Compatibility Toolkit可以帮助开发者识别和解决兼容性问题。这些工具可以自动扫描应用程序,查找存在的兼容性问题,并提供修复建议。
编译器选项
现代编译器提供了多种选项来帮助开发者构建更高效的64位代码。例如,通过使用特定的编译器标志,开发者可以选择不同的优化级别,或者启用特定的指令集支持,以提高应用程序的性能。
结语加粗样式
WOW64是让32位应用程序能够在64位Windows操作系统上无缝运行的关键。它利用CPU的模式切换能力,通过系统调用转换、文件系统和注册表重定向以及其他技术手段来实现这一目标。
过程中存在一些性能损耗,但在大多数情况下,这种损耗对用户体验的影响不大。例如我们常用的许多软件(如QQ、WPS等)都依然是32位软件,而在使用过程中几乎感觉不到性能的变化。
长远来看,随着越来越多的应用程序原生支持64位,WOW64的依赖将逐渐减少,直到32位应用程序最终淡出市场。
版权归原作者 编码时空的诗意行者 所有, 如有侵权,请联系我们删除。