Linux進程的虛擬地址空間描述

2020-03-24     sandag

通過虛擬內存的概念,作業系統為每一個進程提供完全一致的內存視圖,這個內存視圖的地址空間,叫虛擬地址空間。

從每個進程的角度來看,內存中只存在作業系統內核及本進程,即內存是被本進程獨占的。

從嚮往上看,分為進程代碼和數據區、堆數據區、共享庫區、堆棧區、內核內存區。

進程代碼與數據區

可執行程序文件的內容加載到該區域,該區域又分成2部分,低地址部分包含程序的代碼及只讀數據,為只讀部分;另一區域存放可執行文件的可讀寫數據,為可

讀寫區。

該區域不是從0地址開始的,它有一個偏移地址。

堆數據區

堆數據區即heap區,在C程序中,該區域的分配和回收由 malloc 和 free 進行。隨著區域分配的進行,區域不斷從低地址向高地址方向延伸。

共享庫區

即共享庫內存映射區,在C語序中,printf等函數所在庫文件的目標代碼加載到該區域。

該區域的開始地址是固定的,並向高地址延伸。

堆棧區

Stack區,程序運行時,函數調用產生的堆棧存放在該區域。

該區域的開始地址是固定的(緊挨著內核內存區),隨著調用函數時堆棧的產生,該區域不斷從高地址向低地址方向延伸。

內核內存區。

內核虛擬內存區,在虛擬地址空間的最高地址處的一塊地址空間內。該區域用戶進程不能訪問。

文章來源: https://twgreatdaily.com/zh-hk/nj6iCnEBnkjnB-0z4Tc_.html