您正在看的SQLserver教程是:深入SQL Server 2000的內存管理機制(二)。
可訪問大地址的應用 (Large-Address-Aware Executables)
在Windows增加支持/3GB參數以前,一個應用程序是無法訪問一個帶有高位設置的指針.一個32位的指針只有前31位地址空間可以被用戶模式的應用程序訪問.這剩余的一位不用.因此有一些聰明的開發者因為其他的目的不願意在處理內存地址空間時浪費這一位.(舉例來說:可以用來標志一個指針引用其它應用程序分配的數據類型).這樣就/3GB參數就遇到一個難題,因為這種類型的程序不能方便的區分一個合法的指針引用的內存空間在2G的分界線以上與一個內存地址空間在2G以下,但它的高位已經被用做它用的指針.基本上如果一台機器用/3GB的參數啟動,這種應用程序是無法運行的.為解決這種狀況,微軟在WIN32的PE文件Characteristics字段增加了一個新的標志位來表示一個程序是否運行在可訪問大地址的(Large-Address-Aware Executables)模式.當該標志位被起用( IMAGE_FILE_LARGE_ADDRESS_AWARE ),該可執行文件頭部Characteristics字段的32位被置位.通過這個可執行文件頭部的標志位,應用程序可以暗示WINDOWS 它可以處理帶有高位設置的指針,這樣就不會帶來任何異常結果.當該標志被置位並且支持這種方式啟動的Windows也是通過/3GB的參數啟動,這時操作系統會提供一直擴展的私有用戶模式的地址空間給應用程序.你可以通過工具,比如: DumpBin 和 ImageCfg (轉儲可執行文件的頭部)來檢查一個可執行文件的該標志位.Visual C++ 通過 /LARGEADDRESSAWARE 連接器開關來表示IMAGE_FILE_LARGE_ADDRESS_AWARE,SQL SERVR已經將該標志位激活,所以你可以在支持/3GB參數的Windows 版本中使用該參數,這樣操作系統回自動擴展SQL Server的用戶內存空間.
注釋:Windows在可執行文件啟動時檢查IMAGE_FILE_LARGE_ADDRESS_AWARE 標志位,但忽略DLL文件.DLL代碼必須自動處理高位被置位的指針。
物理內存擴展
Intel 處理器自從Pentium PRO開始,以後的處理器都支持一種物理內存擴展(PAE)的內存映射模式。PAE模式提供了可以訪問64GB的物理內存空間。在PAE模式中,內存管理單元(Memory Management Unit (MMU))仍然執行:頁目錄入口page directory entries(PDEs) 和頁表入口page table entrIEs (PTEs),但是在此之上有一個新的級別:頁目錄指針表。同時,在PAE模式PDEs 和PTEs是64位的(不僅僅是標准的32位),這樣系統可以映射比標准轉換更多的內存空間,因為PDEs 和PTEs模式的尋址寬度是標准的2倍。這並不僅僅是增加了頁目錄指針表。頁目錄指針表被用來管理這些大容量表和索引。一些特殊版本的Windows內核需要運行在PAE模式。這中內核集成在Windows 2000以及以後的版本中,在單處理器的機器中體現在Ntkrnlpa.exe文件中,在多處理器的機器中體現在Ntkrnlpamp.exe文件中。你可以向增加/3GB和/USERVA參數一樣在BOOT.INI文件中加/PAE參數激活PAE模式。
地址窗口擴展
Windows的地址窗口擴展(AWE)機制可以允許應用程序訪問超過4GB的物理內存。一個32位的指針是一個整數,只能保存0x00000000到0xFFFFFFFF的值,就是說可以引用4GB 以內線性的內存地址空間,AWE允許一個應用程序繞過這些限制,通過操作系統訪問所有的內存空間。
從概念上說,AWE並不是一個新的事物。在計算機發展之初,操作系統和應用程序已經使用相似的機制回避指針的限制。例如:我們倒退到DOS年代,32位擴充功能被經常用來允許一個16位的程序訪問他自已以外的內存地址空間。一些特殊目的管理者和API經常使用擴充內存和擴展內存。你可能記得這樣一個很久以前產品Quarterdeck QEMM-386經常用來做這樣的事情。典型的機制是允許一個指針可以訪問超過本身限制的空間,(比如:地址太大無法在自己的指針中)通過在可以訪問的地址空間分配一個窗口或區域來和本身無法訪問的內存地址之間傳遞指針。AWE的工作原理:你可以在可以訪問的地址空間提供一塊區域(窗口)作為分段傳輸區,來傳送在用戶內存空間無法訪問的內存地址。
為了使用AWE,一個應用程序需要:
1.分配的物理內存地址可以通過AllocateUserPhysicalPages API函數訪問。這個函數需要調用者有Lock Pages in Memory的權限。
2.在可以訪問的內存空間建立一塊區域。通過VirtualAlloc API函數可以作為映射一個物理內存的映射窗口。