[Windows]32位元的應用程式是如何在64位元的系統下運作的呢?

讀者可能知道因為64位元比較寬可以容納32位元的數據,所以可以正常運作,但是不知道實際到底如何運作。


首先就要先介紹32位元與64位元的差異,位元數的定義是以CPU內的通用暫存器有幾個位元來決定的,像是x86的CPU就是只有32位元的暫存器,數據不能超過32位元,超過32位元就會當作溢位或忽略,所以在64位元系統下開發的應用程式若沒有考慮到給32位元的系統用的話,在32位元的系統下開啟64位元的應用程式是無法正常運作的。

那32位元的應用程式如何在64位元的系統下運作的呢?讀者可能知道因為64位元比較寬可以容納32位元的數據,所以可以正常運作,但是不知道實際到底如何運作,原生32位元Windows系統(Windows 9x/NT/7/10)有system32資料夾,存放了與系統溝通32位元的API函式庫(kernel32.dll, user32.dll),具有用戶接口、鍵盤滑鼠輸入、影印機等的程式幾乎都會調用到這些API。而在原生64位元的Windows為了系統兼容32位元的應用程式,將64位元的API函式庫放到system32,且函數名稱與基本功能沒有改變,只是變成64位元代碼實現運作,而把32位元的函式庫通通丟到WOW64(Windows On Windows 64-bit)這個文件夾下。

WOW64不只是一個文件夾的名字,它是Windows 64位元下的一個子系統,專門用來執行32位元的應用程式。它的運作方式如下說明,當32位元應用程序開始加載時,WOW64會依照32位元的ntdll.dll來建立32位元所需要的啟動環境,將64位元CPU的運作模式切換為32位元,開始執行32位元的加載器並運行應用程式,WOW64並不會依32位元的ntdll.dll去發送指令,反而是重定向至64位元的ntdll.dll,此時WOW64會轉換為原生64位元的模式進行函數調用與取得回傳值等操作,轉回32位元之前,會將取得的資料先由64位元轉回32位元,再轉回32位元的模式,給進32位元的應用程式去處理後續動作。

留言

這個網誌中的熱門文章

[Hyper-V] 讓 Windows 可以吃到超過 16TB 的硬碟!