WoW64

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

WoW64Windows 32-bit on Windows 64-bit)是Microsoft Windows操作系統的一個子系統,它提供在所有Windows 64位系統上運行32位元應用程序的能力——這包括Windows XP Professional x64 EditionIA-64Windows Server 2003的64位版本,以及Windows VistaWindows Server 2008Windows 7Windows 8Windows Server 2012Windows 8.1Windows 10的64位版本。在Windows Server 2008 R2 Server Core中它成為了可選組件,並在Nano Server中不再提供。WoW64旨在解決32位與64位Windows中的許多差異,特別是涉及到Windows本身的結構變化。

轉換函式庫

WoW64子系統由一個輕量級兼容層組成,其在所有64位Windows版本上有類似的接口。它的目的是創建一個32位環境,為未修改的32位Windows應用程序在64位系統上運行提供一個必需的接口。在技術上,WoW64使用三個動態連結函式庫(DLL)實現:

  1. Wow64.dll,通往Windows NT內核的核心接口,它轉換32位與64位調用,包括指針調用棧操作。
  2. Wow64win.dll,為32位應用程序提供適當的入口點。
  3. 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 PCDOSBox運行在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將被重定向到一個虛擬存儲目錄。
  • 墊片

參考資料

  1. ^ Saw, Zach. WOW64 bug: GetThreadContext() may return stale contents. Zach Saw's Blog. November 13, 2010 [2010-11-15]. (原始內容存檔於2021-07-02). 
  2. ^ WOW64 OS bug: Old 32-bit XP apps failing under Win7 WOW64. Microsoft Developer Network. November 11, 2010 [2010-11-15]. (原始內容存檔於2010-11-21). 
  3. ^ Discussions about the Boehm Garbage Collector (Boehm GC).. [2010-11-25]. (原始內容存檔於2011-07-16). 
  4. ^ Performance and Memory Consumption Under WOW64. Microsoft. [2013-05-06]. (原始內容存檔於2013-03-07). 

外部連結