進程虛擬地址空間分佈概述

在windows操作系統中,每個進程都有自己的私有地址空間,因此一個進程的線程只能訪問屬於這個進程的內存空間,即進程之間是地址隔離的。在windows2000中,進程虛擬地址空間可分爲如下四個部分:


1)NULL 區 (0x00000000~0x0000FFFF): 如果進程中的一個線程試圖操作這個分區中的數據,CPU就會引發非法訪問。他的作用是,調用malloc等內存分配函數時,如果無法找到足夠的內存空間,它將返回NULL。而不進行安全性檢查。它只是假設地址分配成功,並開始訪問內存地址0x00000000(NULL)。由於禁止訪問內存的這個分區,因此會發生非法訪問現象,並終止這個進程的運行。
2)用戶模式分區    ( 0x00010000~0xBFFEFFFF):這個分區中存放進程的私有地址空間。一個進程無法以任何方式訪問另外一個進程駐留在這個分區中的數據(相同exe,通過copy-on-write來完成地址隔離)。(在windows中,所有.exe和動態鏈接庫都載入到這一區域。系統同時會把該進程可以訪問的所有內存映射文件映射到這一分區)。
2)隔離區    (0xBFFF0000~0xBFFFFFFF):這個分區禁止進入。任何試圖訪問這個內存分區的操作都是違規的。微軟保留這塊分區的目的是爲了簡化操作系統的現實。
3)內核區    (0xC0000000~0xFFFFFFFF):這個分區存放操作系統駐留的代碼。線程調度、內存管理、文件系統支持、網絡支持和所有設備驅動程序代碼都在這個分區加載。這個分區被所有進程共享。

其中用戶模式分區從地地址到高地址依次爲:


1)代碼段,存放函數體的二進制代碼。
2)靜態數據區(分爲以初始化數據段和未初始化數據段)全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束後由系統釋放 。
3)堆,一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
......(未映射部分)(這個部分包含各種導入的dll等)
4)棧, 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

所有 32 位應用程序都有 4 GB 的進程地址空間(32 位地址最多可以映射 4 GB 的內存)。對於 Microsoft Windows 操作系統,應用程序可以訪問 2 GB 的進程地址空間,稱爲用戶模式虛擬地址空間。應用程序擁有的所有線程都共享同一個用戶模式虛擬地址空間。其餘 2 GB 爲操作系統保留(也稱爲內核模式地址空間)。所有操作系統版本(從 Windows 2000 Server 開始,包括 Windows Server 2003)都有一個 boot.ini 開關,可以爲應用程序提供訪問 3 GB 的進程地址空間的權限,從而將內核模式地址空間限定爲 1 GB。

訪問進程地址空間的 AWE

地址窗口化擴展插件 (AWE) 通過允許訪問儘可能多的操作系統支持物理內存來擴展 32 位應用程序的功能。AWE 可以將最大內存容量 64 GB 的一部分映射到用戶地址空間來實現此功能。應用程序緩衝池和 AWE 映射內存之間的映射通過操作 Windows 虛擬內存表來完成。

爲了支持 3 GB 的用戶模式進程空間,必須將 /3gb 參數添加到 boot.ini 文件中並重新啓動計算機,從而使 /3gb 參數生效。設置此參數後,用戶應用程序線程可以尋址 3 GB 的進程地址空間,而爲操作系統保留 1 GB 的進程地址空間。

注意:
如果計算機上有 16 GB 以上的可用物理內存,操作系統需要 2 GB 的進程地址空間供系統使用,因此只能支持 2 GB 的用戶模式地址空間。爲了讓 AWE 能夠使用 16 GB 以上的內存,應確保 boot.ini 文件中沒有/3gb 參數。否則,操作系統就不能尋址 16 GB 以上的內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章