前言
知道因為 64 位元比較寬可以容納 32 位元的數據,所以可以讓 32 位元應用程式在 64 位元作業系統上正常運作,但是不知道實際到底如何運作,所以這篇就來探討一下這裡面運作的觀念。
32 位元與 64 位元的差異
首先就要先介紹 32 位元與 64 位元的差異,位元數的定義是以 CPU 內的通用暫存器有幾個位元來決定的,像是 x86 的 CPU 就是只有 32 位元的暫存器,數據不能超過 32 位元,超過 32 位元就會當作溢位或忽略,所以在 64 位元系統下開發的應用程式若沒有考慮到給 32 位元的系統用的話,在 32 位元的系統下開啟 64 位元的應用程式是無法正常運作的。
SysWOW64 目錄
原生 32 位元 Windows 系統 (Windows 9x/NT/7/10) 有 system32 目錄,存放了與系統溝通 32 位元的 API 函式庫 (kernel32.dll、user32.dll),具有用戶接口、鍵盤滑鼠輸入、影印機等的程式幾乎都會調用到這些API。
而在原生 64 位元的 Windows 為了系統兼容 32 位元的應用程式,將 64 位元的 API 函式庫放到 system32,且函數名稱與基本功能沒有改變,只是變成 64 位元代碼實現運作,而把 32 位元的函式庫通通丟到 SysWOW64 (Windows On Windows 64-bit) 這個文件夾下。
SysWOW64 不只是一個文件夾的名字,它是 Windows 64 位元下的一個子系統,專門用來執行 32 位元應用程式。
看到這裡可以發覺在 Windows 64 位元的作業系統上:
- system32 放的是 64 位元的 API
- SysWOW64 放的是 32 位元的 API
32-bit App on 64-bit OS 運作原理
那 32 位元的應用程式如何在 64 位元的作業系統運作的呢?讀者可能知道因為 64 位元比較寬可以容納32位元的數據,所以可以正常運作,但是不知道實際到底如何運作。
它的運作方式如下說明,當 32 位元應用程序開始加載時,WOW64 會依照 32 位元的 ntdll.dll 來建立 32 位元所需要的啟動環境,將 64 位元 CPU 的運作模式切換為 32 位元的模式,開始執行 32 位元的加載器並運行應用程式。
WOW64 並不會直接依 32 位元的 ntdll.dll 去發送指令,反而是重定向至 64 位元的 ntdll.dll,此時 WOW64 會轉換為原生 64 位元的模式進行函數調用與取得回傳值等操作,並會將取得的資料先由 64 位元轉回 32 位元,再將運作模式轉回 32 位元,把資料給 32 位元的應用程式去處理後續動作。