通過虛擬內存的概念,作業系統為每一個進程提供完全一致的內存視圖,這個內存視圖的地址空間,叫虛擬地址空間。
從每個進程的角度來看,內存中只存在作業系統內核及本進程,即內存是被本進程獨占的。
從嚮往上看,分為進程代碼和數據區、堆數據區、共享庫區、堆棧區、內核內存區。
進程代碼與數據區
可執行程序文件的內容加載到該區域,該區域又分成2部分,低地址部分包含程序的代碼及只讀數據,為只讀部分;另一區域存放可執行文件的可讀寫數據,為可
讀寫區。
該區域不是從0地址開始的,它有一個偏移地址。
堆數據區
堆數據區即heap區,在C程序中,該區域的分配和回收由 malloc 和 free 進行。隨著區域分配的進行,區域不斷從低地址向高地址方向延伸。
共享庫區
即共享庫內存映射區,在C語序中,printf等函數所在庫文件的目標代碼加載到該區域。
該區域的開始地址是固定的,並向高地址延伸。
堆棧區
Stack區,程序運行時,函數調用產生的堆棧存放在該區域。
該區域的開始地址是固定的(緊挨著內核內存區),隨著調用函數時堆棧的產生,該區域不斷從高地址向低地址方向延伸。
內核內存區。
內核虛擬內存區,在虛擬地址空間的最高地址處的一塊地址空間內。該區域用戶進程不能訪問。