為什麼 64 位操作系統可以運行 32 位應用程序?


amd64 架構,以及 intel em64t 架構的 CPU ,都實現了一種【在 64 位模式下運行 32 位程序】的方式。

這個模式最初是 amd 設計的,有興趣的可以查看當年 amd k8 cpu 的技術文檔,裡面有非常詳細的描述。——從某種意義上說,intel 的 ia64 之所以失敗,就是因為沒有象 amd 一樣設計出一種在 64 位下運行 32 位程序的 cpu 模式。所以後來只得跟風 amd 設計出 em64t。

Windows 通過 wow64 來支持這種 cpu 模式,這意味著 Win64 本身就帶有了 32 位相關的運行庫,雖然這一套庫很可能是直接把 32 位系統調用轉換成對 64 位 winapi 的系統調用。
Linux 也直接支持這個模式,當然一般需要安裝 multilib 之類的一些庫才可以在 64 位 Linux 下跑 32 位 Linux 程序。

當然,操作系統支持這個模式只能在用戶層,內核態還是必須 64 位,因而驅動程序都需要 64 位。

順便說一下,事實上,對於 amd64/em64t 架構的 cpu ,不但能夠在 64 位模式下運行 32 位應用程序,還可以在 32 位模式下運行 64 位程序。這一點至少目前 Linux 是可以做到的(當然,要做到這一點你需要在你的 32 位Linux下安裝64位相關的運行庫)。補充:據狼大人反映,類似的技術在 OSX 上面已經運用多年。


感覺你們都沒有說到點子上呢。
這是因為64位的Windows有一個重要組件WOW64 (Windows on Windows),如果系統發現是一個32位的程序(軟體),WOW負責把32位Windows程序的指令轉成64位指令,最後都是按64位指令執行的。
注意:不適用核心態代碼(比如驅動),64位Windows上只能用64位的驅動。
The WOW64 emulator runs in user mode. It provides an interface between the 32-bit version of Ntdll.dll and the kernel of the processor, and it intercepts kernel calls.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384274%28v=vs.85%29.aspx


因為即使把另外32位都當作0來處理也不影響程序運行。


@令狐臭 正解,不過說的太簡單了。補充一下:32位有32個加法器進行計算,64位同理。64位計算32位,在高位補0就行了。推薦樓主一本書《編碼的奧秘》。


推薦閱讀:

win7 windows explorer has stooped working是什麼情況?怎麼解決?
Windows 在提示 USB 設備被佔用而無法彈出時為何不指明進程名?

TAG:軟體開發 | 操作系統 | Windows7 |