隨著內存價格的不斷下降,相信很多朋友都和 Aulddays 一樣已經用上了 4G 甚至更多的內存。在 64 位 Windows 系統仍存在一些驅動兼容性問題的情況下,32 位的系統仍然是絕對的主流,但 32 位的桌面版 Windows 版系統對 4G 以上內存的支持似乎一直不好。關于這個問題,網上的文章清一色的會提到 PAE(Physical Address Extension 物理地址擴展)技術。遺憾的是,據絕大多數朋友的測試情況來看,即使啟用了 PAE,32 位的 Windows Vista 仍然無法使用全部的 4G 內存。在 Vista SP1 中,微軟使了個小技巧,讓系統屬性中可以顯示“已安裝”的 4G 內存;但更進一步,在任務管理器中證實實際可用的內存仍然只有 3069M(最多不超過 3.25G,依不同配置而定),如下圖所示:

這一點,在系統屬性程序(開始\運行,輸入“msinfo32”,回車)中可以更清楚的看出“已安裝物理內存”和“可用物理內存”的數量。
PAE?并不足夠
PAE 是 32 位系統內存支持不得不說的一個問題。在沒有 PAE 的情況下,32 位系統使用 32 位的地址空間,因此總共可以支持 2^32=4G 的內存,再加上一些系統的限制,沒有 PAE 的 32 位 Windows 上本來實際只能使用 3G 的內存。而 PAE 則是一種地址擴展技術,通過它可以讓操作系統擁有更多的地址空間,理論上可以支持 128G 甚至更多的內存。PAE 在 Windows Server 系統上可以很好的工作,如下圖所示,32 位的 Server 2008 (和 Vista 實際使用相同的內核)在開啟 PAE 之后可以很好的使用 4G 內存,但 Vista 上即使開啟了 PAE 也仍然只能使用 3G 內存(事實上,Vista 默認是開啟 DEP 的,而 DEP 功能需要 PAE 支持,因此一般來說 PAE 其實并不需要手動設置而是自動開啟的。點擊這里可以看到關于 DEP 的詳細討論),這又是為什么呢?

技術大牛 Geoff Chappell 在研究了 Vista 和 Server 2008 的內核之后發現,造成這個限制的實際上是 Vista 的許可證限制!簡單來說,vista/2008 內核在啟動初期會調用 MxMemoryLicense 未公開 API 函數來確定系統“許可(licensed)”使用的最大內存數量;而 MxMemoryLicense 則會查詢 tokens.dat 和 pkeyconfig.xrm-ms 兩個文件確定系統的許可證(桌面系統還是服務器系統),接下來再根據許可證類型確定支持內存的最大值。如果系統內存大于根據許可證確定的值,則在內核啟動時多余的內存就會被完全忽略掉。這也就是造成 32 位 Vista 不能使用 4G 或以上內存的根本原因。
目前已經有兩個測試證實了這個情況,并成功在 32 位 Vista 下使用了 4G 內存。注意:進行這兩個測試實際已經違反了 Windows Vista 的使用許可證,所以是存在版權問題的;在弄清這個問題之前請不要輕易進行類似的測試!
測試1. 替換系統授權:
將 Vista 中的 C:\ Windows\ ServiceProfiles\ NetworkService\ AppData\ Roaming\ Microsoft\ SoftwareLicensing\ tokens.dat 文件和 C:\ Windows\ System32\ licensing\ pkeyconfig\ pkeyconfig.xrm-ms 文件分別用 Server 2008 中的同名文件替換。之后再啟動系統時內核就會誤認為啟動的是 Server 2008 系統,而消除 Vista 許可證對內存的限制。但是這樣一來很多系統服務和系統組件也會按照 2008 的方式來運行,造成很多不兼容性。
測試2. 修改系統內核
在 Geoff Chappell 的文章中(點擊查看原文)采用了直接 patch 系統內核的方法。經 Aulddays 測試,這種方法同樣適用于目前最新版的 Windows 7 RTM 系統。這種方法難度較大,但帶來的不兼容性則小的多,并且可以完美支持多至 128G 的內存!他的具體做法如下:為避免原始內核被破壞,首先復制系統內核文件 ntkrnlpa.exe,并命名為 ntkr128g.exe,之后的修改都在 ntkr128g.exe 上進行。用 hex 編輯器打開 ntkr128g.exe,查找下列兩個字符串:
特征串1:7C 11 8B 45 FC 85 C0 74 0a
特征串2:7C 10 8B 45 FC 85 C0 74 09
兩個特征串在內核中都出現且只出現一次,雖然特征串內容不同,但修改方式相同:把 0x8B 開始的 7 個字節(即上面標記為深紅色的部分。最前兩個字節不作修改?。?/strong>修改成:
后7個字節修改成:B8 00 00 02 00 90 90
對于目前的兩個版本的 Vista 和最新的 Windows 7,修改處的文件偏移地址(即 0x8B 字節的位置)分別如下:
版本號 |
版本 |
文件偏移地址 |
6.0.6000.16386 |
Windows Vista |
0x003040B1, 0x003040F2 |
6.0.6001.18000 |
Windows Vista SP1 |
0x00309AA3, 0x00309AE4 |
6.1.7600.16385 |
Windows 7 |
0x0035C243, 0x0035c283 |
接下來測試加載修改后的內核。首先需要為修改后的內核重新計算 checksum 和生成數字簽名。在命令行中輸入下面3個命令:
editbin /release ntkr128g.exe
makecert -r -ss my -n "CN=My Own Testing Authority"
signtool sign -s my -n "My Own Testing Authority" ntkr128g.exe
上述簽名過程需要用到三個命令行工具,其中 editbin 在 Visual Studio 中自帶,而 makecert 和 signtool 在 Windows SDK 6.0 中自帶,如果你機器上安裝了 Visual Studio 2008 的話,第一個工具可以在 %VS2008_Dir%\ VC\ Bin\ 中找到,后兩個工具可以在 %ProgramFiles%\ Microsoft SDKs\ Windows\ v6.0A\ bin\ 中找到。Visual Studio 2008 Express 和 Windows SDK 6.0 都可以從微軟網站免費下載; 如果不想麻煩另外安裝的話,也可以點擊這里單獨下載這幾個工具; 如果運行時提示缺少 MSVCR90.DLL,請先點擊這里下載安裝 VC2008 的運行時組件。
最后在系統啟動菜單中加入一條新的啟動菜單項(需以管理員方式運行命令提示符)(如果是Windows 7 系統的話可將命令中的 Vista 換成 7):
bcdedit /copy {current} /d "Windows Vista With More Than 4GB"
運行成功后,該命令會返回一個 GUID 值,記錄下該 GUID 值,并運行下面三條,用之前返回的 GUID 值替換命令中的 guid(命令中包含 guid 的大括號也要輸入):
bcdedit /set {guid} pae ForceEnable
bcdedit /set {guid} kernel ntkr128g.exe
bcdedit /set {guid} testsigning on
最后,重啟系統并在啟動菜單中選擇 "Windows Vista (或 7) With More Than 4GB" 一項即可。由于修改了內核,系統啟動后桌面上會顯示“Test Mode”的提示。
查看:原文地址;來源:live.aulddays.com。