複製鏈接
請複製以下鏈接發送給好友

WOW64

鎖定
WOW64 (Windows-on-Windows 64-bit)是一個Windows操作系統的子系統, 它為現有的 32 位應用程序提供了 32 位的模擬,可以使大多數 32 位應用程序在無需修改的情況下運行在 Windows 64 位版本上。
中文名
WOW64
外文名
Windows-on-Windows 64-bit
內    容
Windows操作系統的子系統
模    式
32 位兼容性模式

WOW64簡介

它類似於舊的 WOW32 子系統,負責在 Windows 32 位版本下運行 16 位的代碼
硬件本身具有 32 位兼容性模式,可以處理 IA-32 指令的實際執行,而 WOW 層處理諸如在 32 位和 64 位模式之間切換處理器以及模擬 32 位系統的事務。例如,32 位和 64 位程序具有不同的註冊表配置單元。還有一個用於 32 位二進制文件的不同的系統目錄。64 位二進制文件仍然使用 System32 目錄,因此,當 32 位應用程序安裝到系統中時,WOW 層會確保將 32 位二進制文件置於一個新的目錄 SysWOW64 中。這是通過如下方式實現的:根據應用程序是否運行在 WOW 下,截獲對 API 的調用(如 GetSystemDirectory)並返回適當的目錄。相同的問題可能會存在於註冊表中。因為 32 位和 64 位的 COM 服務器都可以安裝在系統上,並位於相同的類標識符 (CLSID) 下,因此 WOW 層需要將對註冊表的調用重定向到適當的 32 位或 64 位配置單元中。WOW 層也會處理註冊表中某些區域之間的鏡像更改,以便使其更簡單地支持 32 位和 64 位代碼之間的交互操作。
WOW64 非常重要,因為當不關注性能和可伸縮性的問題時,它使您可以利用大多數現有的 32 位代碼。它是兩種方法的最佳結合。您可以將您的服務遷移到 64 位,同時將 Microsoft 管理控制枱 (MMC) 配置管理單元保留為 32 位。Windows 64 位版本包括 MMC 的 32 位和 64 位的版本。當選擇保留管理工具為 32 位時,進程間的通訊可能會遇到某些問題,但是隻要接口設計正確,諸如遠程過程調用 (RPC) 的協議應該可以在 32 位和 64 位進程之間運行。有關 WOW64 的另外一點需要牢記:它並不是為要求高性能的應用程序而設計的。至少,WOW64 子系統需要將 32 位參數擴展到 64 位,並且需要將 64 位的返回值截斷為 32 位。在最糟糕的情況下,WOW64 子系統將需要進行內核調用,涉及到的不僅僅是到內核的轉換,還有從處理器的 32 位兼容性模式到其本機 64 位模式的轉換。在 WOW64 下運行時,應用程序將無法妥當地進行調整。對於那些您要將其保留為 32 位的應用程序而言,請在 WOW64 下測試它們。如果性能不能滿足您的期望,您需要考慮將應用程序遷移到 64 位。

WOW64實現

WOW64 是在用户模式下實現的,作為 ntdll.dll 和內核之間的層。WOW64 及其支持的一些 DLL 僅僅是可以加載到 32 位進程中的 64 位的 DLL。對於所有其他情況,進程保持為純進程。32 位的進程無法加載 64 位的 DLL,反之亦然。

WOW64轉換庫

WoW64子系統是一個輕量級的compatibility layer, 在所有版本的windows上都擁有同樣的接口. 它的主要目的是用來創建32-bit環境, 為了讓32位的應用程序可以不經過任何修改就運行在64-bit的系統上, 它提供了必須的接口.
技術上説, WOW64是由三個DLL實現的.
Wow64.dll 是Windows NT kernel的核心接口, 在32位和64位調用之間進行轉換, 包括指針和調用棧的操控. Wow64win.dll 為32位應用程序提供合適的入口指針. Wow64cpu.dll 負責將處理器在32位和64位的模式之間轉換。
註冊表和文件系統
WOW子系統也會處理運行64-bit應用程序的其他關鍵方面. 比如説, 在管理32位應用程序與windows註冊表的交互時, 會給存儲子系統提供接口(32位的註冊表與64位的註冊表不太一樣.) 操作系統使用%SystemRoot%\system32目錄來存儲64-bit的庫文件和可執行文件. 這樣做是為了向後兼容, 因為很多舊系統的應用程序都是使用hardcoded的方式來獲取這個路徑的. 當執行32位應用程序的時候, WOW64會將對DLL的請求從system32重定向到%SystemRoot%\SysWOW64, 在SysWOW64目錄中, 包含了舊系統的庫和可執行文件.

WOW64存在

Windows 2000 Limited Edition Windows XP Professional x64 Edition, and IA-64 64-bit版本的Windows Server 2003 64-bit版本的
Windows Vista 64-bit版本的Windows Server 2008 64-bit版本的Windows 7在Windows server 2008 R2上, 這是一個可選組件. WoW64被設
計用來處理許多在32-bit Windows 和64-bit Windows之間的不同, 尤其是在Windows自身的結構變化上的不同。

WOW64虛擬內存

默認情況下,Windows 32 位版本的地址空間限制在 4 GB,其中一半是為內核保留的。這限制了普通的應用程序只能使用 2 GB 的有效虛擬內存。2 GB看起來好像很多,但是由於錯誤的分配算法、大型文件映射甚至過多的使用 DLL,地址空間很容易在應用程序中變得零碎。看一下任務管理器中的“VM Size”列,就會發現普通應用程序消耗的虛擬內存量。當然,就像過去的 DOS 時期(利用 XMS/EMS)一樣,有很多種方法可以使 32 位的應用程序訪問多於 4 GB 的物理內存。進入物理地址擴展 (PAE) 和地址窗口擴展(Address Windowing Extensions,AWE)。PAE 通過將地址位的數量從 32 擴展到 36 來工作,這樣使應用程序可以尋址的空間達到 64 GB。AWE 使應用程序可以將大於 4 GB 的物理內存範圍映射到虛擬地址空間中。這兩種方法都引入了開銷並增加了代碼的複雜性。
Windows 64 位版本提供 16 TB 的有效尋址空間,其中一半可用於用户模式的應用程序。這意味着整個數據庫可以移動到內存中,顯著地提高了性能,或者整個網站可以緩存到內存中。它還可以使代碼保留並委託到巨型的鄰近虛擬內存塊中,無需實際地擔心虛擬內存碎片問題。這也考慮到了巨型文件映射對象或共享的內存部分。

WOW64判斷模式

其中程序有三種情況:
一是64bit的程序跑在64bit下,那麼不是wow64模式,返回0
二是32bit程序跑在64bit下,是wow64模式,返回1.
三是32bit程序跑在32bit下,返回0.
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;

BOOL IsWow64()
{
    BOOL bIsWow64 = FALSE;
    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
                        GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

    if (NULL != fnIsWow64Process)
    {
     if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
     { 
            // handle error    
     }
    }

    return bIsWow64;
 }