1樓:北極
要保證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所謂的相容性僅僅體現在使用者態。
2樓:「已登出」
上面的32位模式和PAE模式是「純32位」的,在這兩種狀態下cpu工作在32位保護模式。
下面的4級分頁是64位專用的,在這個狀態下CPU工作在長模式。
段描述符的L位(CS.L),當然就是long的意思,可以用來從長模式的64位模式切換到32位相容模式,在32位相容模式下,CPU模擬32位處理器的行為,但是依然使用長模式的4級分頁機制。
你看intel就是這樣,標誌位的名字都叫long mode enable,為了和amd做區分模式名字一定要叫ia32e
沒找到圖,將就看吧。
牽扯到的標誌位包括,CR0.PG, CR4.PAE, EFER.LME, EFER.LMA, CS.L
對了之前還牽扯到乙個CR0.PE,用來從實模式切換到保護模式
參考文獻:intel sdm,卷3
3樓:喵喵
只是這個32位的相容包如何在64位的CPU或者作業系統上執行呢
對於 64 位 Windows 來說,包含一整套 32 位 Windows 所需的系統呼叫等所需的檔案,可以執行幾乎所有不依賴驅動的 32 位應用程式。這堆東西加起來叫 WoW64 (Windows on Windows 64),你可以看作這是 Win32 子系統的一部分。
從 Windows Server 2008 R2 開始,可以不安裝 WoW64,系統會無法執行 32 位程式。
macOS 等 UNIX 及 Linux 等 UNIX-Like 不懂。
或者64位CPU上也有人裝32位的作業系統
x64-64 的 CPU 相容之前的所有 32 位 x86 CPU 的指令集。
即是說,同一條指令在 32 位 x86 CPU 上執行的結果和在 64 位 x86-64 CPU 上執行的結果一致。
ARM 架構類似,ARMv8 相容所有 ARMv7 的指令集。
其他架構不懂。
電腦顯示是64位作業系統可是安裝不了64位的軟體,如何處理?
初生之鳥 ARM64的Windows只支援以下架構的程式 32位x86 一般指的32位程式多是這個需要經過x86二進位制翻譯器效能比較差 32位ARM 現在能找到的多是幾年前為越獄Windows RT裝置移植的程式很多都能直接在上面執行 大部分UWP也會是32位ARM 64位ARM 現在很多軟體都在...
64位作業系統跟32位比有什麼區別?
普通IT技術人員 說作業系統32 64位的區別,就不得不說,cpu硬體的位數區別,主要是硬體工藝的問題。32位CPU指的是該CPU在單位時間內能一次處理的二進位制數的位數為32位 64位CPU指的是該CPU在單位時間內能一次處理的二進位制數的位數為64位 而作業系統位數是針對cpu的位數而開發出來的...
C 如何跨平台判斷作業系統是32位還是64位?
WhatIsSpin 題主你這問題,成心折騰程式設計師。首先得說明一下,不呼叫系統API,又想知道與系統相關的東西,這就像你讓我進門拿東西,又把門鎖上不給我鑰匙一樣,正統方法是根本不可能做到的 且不深究這麼做有什麼意義,本來乙個很簡單的函式就能解決的問題繞個圈 那就得走曲道破窗而入。其次是跨平台不是...