WoW64
WoW64(Windows 32-bit on Windows 64-bit)是Microsoft Windows作業系統的一個子系統,它提供在所有Windows 64位元系統上執行32位元應用程式的能力——這包括Windows XP Professional x64 Edition、IA-64和Windows Server 2003的64位元版本,以及Windows Vista、Windows Server 2008、Windows 7、Windows 8、Windows Server 2012、Windows 8.1、Windows 10、Windows Server 2022和Windows 11的64位元版本。在Windows Server 2008 R2 Server Core中它成為了可選組件,並在Nano Server中不再提供。WoW64旨在解決32位元與64位元Windows中的許多差異,特別是涉及到Windows本身的結構變化。
轉換函式庫
WoW64子系統由一個輕量級相容層組成,其在所有64位元Windows版本上有類似的介面。它的目的是建立一個32位元環境,為未修改的32位元Windows應用程式在64位元系統上執行提供一個必需的介面。在技術上,WoW64使用三個動態連結函式庫(DLL)實現:
Wow64.dll
,通往Windows NT核心的核心介面,它轉換32位元與64位元呼叫,包括指標和呼叫棧操作。Wow64win.dll
,為32位元應用程式提供適當的入口點。Wow64cpu.dll
,負責解決處理程序從32位元切換到64位元模式。
架構
儘管表面上看它在所有64位元Windows版本上都表現相同,但WoW64的實現取決於目標處理器架構。舉例來說,面向Intel Itanium 2處理器(即IA-64架構)開發的64位元Windows版本,會使用Wow64win.dll
在Itanium 2的獨有指令集中設定x86指令的仿真。這種仿真會比 Wow64win.dll
的函式在x86-64架構(也稱「Intel 64」或「AMD64」)上的計算代價更昂貴,因為當有必要執行32位元執行緒時,處理器硬體必須從64位元模式切換到相容模式,然後再切換回64位元模式。
登錄檔和檔案系統
WoW64子系統也處理其他執行32位元應用程式所必需的關鍵問題。它參與32位元應用程式與Windows組件的互動,例如登錄檔,64位元與32位元應用程式會使用不同的鍵。舉例來說,HKEY_LOCAL_MACHINE\Software\Wow6432Node 是 HKEY_LOCAL_MACHINE\Software 的32位元環境版本,並且32位元應用程式不會感覺到這種重新導向。有些登錄檔鍵是等效從64位元對映到32位元,還有些則是內容鏡像,這取決於Windows的版本。
作業系統使用%SystemRoot%\system32
目錄放置其64位元函式庫和可執行檔。這樣做的原因是考慮到向下相容性,許多舊款程式採用寫死使用該路徑。當執行32位元應用程式時,WoW64會將32位元透明重新導向到 %SystemRoot%\SysWoW64
,那裡放著32位元函式庫和可執行檔。32位元應用程式不會知道自己在64位元作業系統上執行。32位元應用程式可以通過偽目錄%SystemRoot%\sysnative
訪問真實的存有64位元函式庫和可執行檔的資料夾%SystemRoot%\System32
。
你會看到有兩個Program Files目錄可見,裡面分別放著32位元和64位元應用程式。儲存32位元檔案的目錄名為 Program Files (x86) 以區分兩者,而64位元目錄使用原有的 Program Files 為名,不附加任何限定名稱。
應用程式相容性
只包含32位元核心模式驅動程式,或者插入組件到僅64位元實現的組件處理程序(例如Windows Explorer)的主記憶體空間的32位元應用程式不能在64位元平台上執行。32位元服務程式是支援的。SysWOW64資料夾位於作業系統所在分割區的Windows資料夾,其包含許多支援32位元應用程式的程式(例如cmd.exe、odbcad32.exe,為32位元應用程式註冊ODBC連接等)。面向MS-DOS和Windows早期版本的16位元應用程式通常不相容64位元版本的Windows Vista、7和8,但可以通過Windows Virtual PC或DOSBox執行在16位元或32位元的Windows作業系統上。32位元版本的Windows XP、Vista、7和8在另一方面通常也可以幾乎無問題地執行16位元應用程式。16位元應用程式不能直接執行在x64版本的Windows上,因為CPU在x64模式下執行時不支援VM86。
Internet Explorer實現了32位元與64位元兩個應用程式版本,因為網際網路上有許多32位元ActiveX組件,而它們不可能在64位元版本上執行。Internet Explorer的32位元版本被定為預設版本,並且64位元版本不能被設定為預設瀏覽器。
WoW64 64位元版本中透明層的一個程式錯誤[1][2]導致所有依賴Windows API函式GetThreadContext的32位元應用程式不相容。此類套用包括應用程式除錯器、呼叫堆疊跟蹤器(例如IDE顯示呼叫堆疊)和使用垃圾收集(GC)引擎的應用程式。受影響最廣泛的一個GC引擎是Boehm GC[3],它被同樣流行的Mono作為預設的垃圾收集引擎。雖然Mono截至2010年10月有一種新的、可選的GC(稱作SGen-GC),但它與Boehm GC執行堆疊掃描的方式相同,因此它也不相容WoW64。截至2010年11月15日,微軟沒有提供修復計劃或變通解決方案。
效能
據微軟介紹,執行在WOW64下的32位元軟體與在32位元Windows上的執行效能相近,但可能增加少許執行緒和其他開銷[4]。
一個32位元應用程式在64位元系統上可以完全使用4GB虛擬記憶體,而在32位元系統上,部分可定址主記憶體無法使用,因為那會被核心和主記憶體對映的外部裝置(如顯示卡)使用。
參見
- Windows on Windows
- 使用者帳戶控制也有一個機制,將舊款程式寫入到特定區域的檔案處理到新位置。無管理員權限的處理程序將檔案寫入到system32將被重新導向到一個虛擬儲存目錄。
- 墊片
參考資料
- ^ Saw, Zach. WOW64 bug: GetThreadContext() may return stale contents. Zach Saw's Blog. November 13, 2010 [2010-11-15]. (原始內容存檔於2021-07-02).
- ^ WOW64 OS bug: Old 32-bit XP apps failing under Win7 WOW64. Microsoft Developer Network. November 11, 2010 [2010-11-15]. (原始內容存檔於2010-11-21).
- ^ Discussions about the Boehm Garbage Collector (Boehm GC).. [2010-11-25]. (原始內容存檔於2011-07-16).
- ^ Performance and Memory Consumption Under WOW64. Microsoft. [2013-05-06]. (原始內容存檔於2013-03-07).
外部連結
- 關於在64位元Windows上執行32位元套用的MSDN頁面 (頁面存檔備份,存於網際網路檔案館)(英文)
- WOW64資料夾、變數、值和參考資料的綜合資料 (頁面存檔備份,存於網際網路檔案館)(英文)