要保證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所謂的相容性僅僅體現在使用者態。
要保證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所謂的相容性僅僅體現在使用者態。