2009年9月10日星期四

Windows 7/Vista 32bit 實現支援 128GiB 記憶體

微軟的 32bit Windows 大部分只支援 4GB 記憶體上限, 伺服器版本則部分支援更大記憶體, 此種限制其實是微軟 License Value(?!)的分支優越行銷策略, 客戶被限制在其銷售模式中。

Vista/XP 要支援超過 4GB 記憶體時, 一般必需購買(可以向微軟付費索取) 64bit 版本光碟以支援 64bit 記憶體定址上限, 一般 32bit 記憶體定址上限是 232 = 4,294,967,296 = 4GiB, 而 32bit 版本因為軟體驅動程式安全地址問體被受限在 3.2GB(或更小 2.5GB)可使用記憶體地址內, 這亦是一般情況下用戶在 32bit Windows 安裝 4GB 記憶體後不會得到全部可使用的 4GB 記憶體, 不過 Vista/XP/Win7 32bit 其實都已設計了內建 Physical Address Extension(PAE) 支援, 參考 msdn 的 "Memory Limits for Windows Releases" 就可以看見被限制在不同分支的版本內, 在系統預設支援模式下 Win7/Vista/XP 會自動載入使用 Data Execution Prevention (DEP) 功能, 而且自動啟動 PAE(NX)。

在記憶體安全地址區因為電腦系統內硬體(例如 BIOS ACPI, 晶片組, PCI bus, PCI Express 及 Video 記憶體)配置地址的差異, 保留的記憶體會由最小 256MB 到 1.5GB(甚至更多), 根據微軟的宣稱的名詞(memory mapped IO reservations), 保留的記憶體覆蓋在實體記憶體的地址; 但實際應用 Windows 32bit 程式的最大可用記憶體限制 2GB 是不會跨越到實體記憶體 4GB 佔用硬體在配置驅動程式的安全地址, 在 PAE 模式的環境下 MMIO 的保留地址已經是多餘的了。


以往 Vista 32bit 系統要使用超過 4GB 的話, 方法是借用 Windows 2008 Server 32bit 的 kernel 檔案, 不過由於 kernel 設計不同, 會產生很多系統不兼容及錯誤問體, 根據 Geoff Chappell 的分析說明, Vista 32bit 可以藉修改 kernel 後規避 ZwQueryLicenseValue API 函數支援超過 4GB 記憶體上限(已經實測使用近一年了), 而且可以用盡驅動程式安全地址記憶體, 繼承的 Windows 7(6.1) 32bit kernel 亦可以實現支援 128GiB 記憶體(已實測)。

網上已經有一個可以修改 Vista(Win7) kernel 為 128GiB 的程式, 懶得思考(勇字兵)的話善用 google 搜索啊。

手動修改 kernel 需要使用的軟體, 包括如下:
  • Win7/Vista 32bit 的 kernel 檔案(ntkrnlpa.exe)
  • hex editor(或 UltraEdit)
  • editbin.exe(來自 Visual Studio Tools)
  • makecert.exe(來自 Windows Software Development Kit SDK)
  • signtool.exe(來自 Windows Software Development Kit SDK)

修改 kernel 步驟(以 系統管理員身分權限):
1. 將 C:\Windows\System32\ntkrnlpa.exe 系統 kernel 檔案複製為 mykernel.exe
2. 執行 hex editor(或 UltraEdit) 編輯 mykernel.exe
尋找: (主要搜索: 8b 45 fc 85 c0 74, 8b 前面隔一個位置的值是 7c 就對了)
7c (??) 8b 45 fc 85 c0 74 (??) (如圖) 應該能找到兩處, 然後把兩個地方都改成:
7c (??) b8 00 00 02 00 90 90 (如圖) 儲存檔案 mykernel.exe
3. 重設 mykernel.exe 的 checksum
在 命令提示字元(Command prompt)內, 執行:
editbin /release mykernel.exe
4. 將修改的 mykernel.exe 數碼簽章
在 命令提示字元(Command prompt)內, 執行:
makecert -r -ss my -n "CN=my test ca"
signtool sign -s my -n "my test ca" mykernel.exe 5. 完成後將 mykernel.exe 放置到 C:\Windows\System32 系統目錄內

修改 Windows 7/Vista boot 起動步驟(以 系統管理員身分權限):
1. 建立一個新的 boot 入口條目, 使用修改過的 kernel ({id} 在執行 /copy 指令時獲得)
在 命令提示字元(Command prompt)內, C:\Windows\System32 系統目錄下執行: (如圖)
bcdedit /copy {current} /d "Kernel hack with PAE"
bcdedit /set {id} pae ForceEnable
bcdedit /set {id} kernel mykernel.exe
bcdedit /set {id} testsigning on
2. 完成後重啟電腦, 在 boot 選單項目選擇 "Kernel hack with PAE" (如圖)
備註:
  • {id} 數值會不盡相同, 在 bcdedit /copy 時自動生成。
  • 要刪除 boot 選單項目還原的話, 執行指令: bcdedit /delete {id}
  • 雖然修改可以實現支援 128GB 實體記憶體上限, 不過單一個 32bit 程式仍然只可以跑到 2GB 的上限, 就筭使用 4GT 模式, 亦只能衝到 3GB 上限; 使用 4GT 模式的話, 只適合安裝多過 4GB 實體記憶體的情況, 否則系統整體效能下降(已實測)。

登入後查看工作管理員裡面的實體記憶體(或執行 System Information, Everest 等等)。
未修改 kernel 前 4GB 實體記憶體, 可用記憶體是 3327MB(3.25GB) (如圖) 修改 kernel 後 4GB 實體記憶體, 可用記憶體是 4095MB(4GB) (如圖)...多了 768MB 可用
這個修改 kernel 步驟 Vista 到目前最新的 Windows 7 都是可用的, 另外注意升級 Service Pack(或 Windows Update kernel)後需要重新 patch 一遍。

運行 hack 內核版本後, 桌面顯示的是 "測試模式(test mode)" (如圖) 要屏閉桌面水印的話, 使用 RemoveWatermarkx86.exe(善用 google 搜索) 修改 users.dll.mui。 (如圖)
參考資料:
Licensed Memory in Windows Vista
MSDN - Memory Limits for Windows Releases

參考圖片: Vista 32bit 可以支援安裝多於 4GB 實體記憶體

【本篇內容只屬學術研究參考不負任何責任, 一切後果自負】

沒有留言:

發佈留言