行程地址空間
- 一、何為行程地址空間
- 二、為什么要有行程地址空間
- 三、深入探究行程地址空間
一、何為行程地址空間
?在我們學習C語言C++的時候,我們知道記憶體被劃分為堆區,堆疊區,常量區等等,事實上這里的記憶體并不是物理記憶體,而是一個虛擬的記憶體空間,我們寫代碼時能訪問得到的只有虛擬記憶體,系統再通過一種映射關系在物理記憶體上執行對應的操作,通過禁止用戶直接訪問物理記憶體從而避免因操作不當而引發事故,在Linux中,當你的程式跑起來就變成了一個行程,它的代碼和資料需加載到記憶體,所訪問到的虛擬記憶體就叫做行程地址空間(mm_struct)
二、為什么要有行程地址空間
- 從此之后再也不會有系統級別(指訪問物理記憶體)的越界問題了,因為虛擬記憶體階段在映射的時候會檢查,不會出現越界訪問物理記憶體的情況
- 每個行程的行程地址空間布局,范圍都一致,使得對每個行程的操作,設計都一致,這樣就不用不同的行程不同的"分析"了
- 每個行程都認為自己獨占記憶體,這樣能更好地保持行程獨立性以及合理使用空間
- 行程管理和記憶體管理完成解耦
三、深入探究行程地址空間
?行程地址空間本質是記憶體中的一種內核資料結構——mm_struct,通過結構體:定義很多變數規定堆疊區,堆區等等區域的起始終止位置,而這個結構體最多有2^32個尋址地址,如:
struct mm_struct{
unsigned int heap_start; //規定堆區的開始地址
unsigned int heap_end; //規定堆區的結束地址
unsigned int code_start; //規定代碼區的開始地址
unsigned int code_end; //規定代碼區的結束地址
……
}
從start到end則是一段虛擬區域,這區域之間每一個尋址地址是虛擬地址
?當作業系統創建一個行程后,會將代碼和資料從硬碟加載到記憶體,創建task_struct存盤行程相關資訊來控制和管理行程,同時創建mm_struct(行程地址空間)為了讓行程訪問記憶體,上文說到行程地址空間會通過一種映射關系映射到物理記憶體上,這個映射關系存盤在頁表中,每一個行程的task_struct和mm_struct通過指標鏈接在一起,對于創建子行程,也為其創建mm_struct和task_struct,將代碼和資料加載到記憶體,虛擬地址和頁表父行程一樣,在寫入的時候進行寫時拷貝

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/305740.html
標籤:其他
