要保证64位兼容性,无非就是两点:
1. 硬件兼容(指令层面上);
2. 软件兼容(操作系统);
因为以上两点都能保证,所以自然32位程序能在兼容32位程序的操作系统+CPU上跑。
具体的形式:
1. 硬件兼容
现有的x86架构的CPU,操作系统进入64位的工作模式都是兼容32位的,即使在long-mode模式下,汇编指令的默认操作数大小不全是64位的,实际上多数都是32位的。所以硬件指令直接平移过来就可以了。
比如汇编指令TEST EAX,EAX;
在32位下编码是 0x85 0xC0
在64位下编码也是 0x85 0xC0
硬件兼容提供了软件兼容的基础。
2. 软件兼容
Windows和Linux都提供了32位的用户态运行库,所以用户调用各种系统API都可以直接兼容。
系统调用方面,虽然系统内核是64位的,但因为CPU对32位程序发起系统调用时处理的流程不同,所以操作系统能感知到系统调用是从什么状态发起的,剩下的工作就是专门对32位做一下处理即可。
-------------------------------------------
实际应用中,还有一些特殊的情况,比如:
1. 硬件不提供对早期指令的支持,或者操作系统不想用这种方式,那么操作系统也可以采用虚拟机的方式用软件模式,比如Win2000-WinXP时代里的控制台(cmd)在运行16位程序时就是完全模拟出来的(比如debug命令)
2. 绝大多数64位操作系统对32位的兼容仅仅做到了应用程序,而不是驱动(内核态),因为在内核态提供32位支持是一个很麻烦并且有风险的事情,而且内核态程序对CPU拥有完整的控制权,很容易让系统崩溃,所以64位Windows和Linux所谓的兼容性仅仅体现在用户态。