程序位址空間

2021-06-26 06:07:48 字數 925 閱讀 6082

程序位址空間

1.可執行檔案**的記憶體對映,稱為**段

2.可執行檔案的已初始化全域性變數的記憶體對映,稱為資料段

3.包含未初始化的全域性變數,也就是bss段的零頁的記憶體對映

4.用於程序使用者控制項棧的零頁的記憶體對映

5.任何記憶體對映檔案

6.任何共享記憶體段

7.任何匿名的記憶體對映,比如由malloc分配的記憶體

struct mm_struct ;

核心同時使用兩個計數器是為了區別主使用計數(mm_count)器和使用該位址空間的程序數目(mm_users);mmap和mm_rb這兩個資料結構描述的物件是相同的:該位址空間中的全部記憶體區域,但是前者是以鍊錶的形式存放而後者是以紅-黑樹的形式存放。mmap作為鍊錶,利於簡單、高效的遍歷所有元素,而mm_rb結構作為紅-黑樹,更適合搜尋指定元素。

核心使用函式mmap或者do_mmap建立新的位址空間,當位址空間用完之後,呼叫mummap或者do_mummap刪除位址空間。

雖然應用程式的操作物件時對映到物理記憶體之上的虛擬記憶體,但是處理器直接操作的卻是物理記憶體,所以在應用程式訪問乙個虛擬記憶體時,首先必須將虛擬記憶體轉化為物理記憶體位址,處理器才可以處理,linux使用**頁表完成轉換,但是可以按照需要在編譯時簡化使用頁表的**結構,比如只使用兩級。該**頁表是:

1.頂級頁表是頁全域性目錄(pgd),pgd中的表項指向二級頁目錄中的表項:pmd

2.二級頁表是中間頁表(pmd),其中的表項指向pte中的表項

3.最後一級的頁表簡稱為頁表(pte),該頁表指向物理頁表

多數體系結構為了提高搜尋記憶體中的實體地址的速度,都多數實現了tlb(翻譯後緩衝器),tlb作為將乙個虛擬位址對映到實體地址的硬體快取,當請求訪問乙個虛擬位址時,處理器將首先檢查tlb中是否快取了改虛擬位址到實體地址的對映,如果在快取中直接命中,實體地址立刻返回,否則,就需要再通過頁表搜尋需要的實體地址。

程序位址空間

這篇文章應該不能說是原創的,這裡的記錄都是我通過閱讀整理來的,並沒有太多的自己的想法。資料 現代作業系統 之所以去了解位址空間也是因為在學習dll的時候看到要將dll對映到程式的位址空間,不甚明了所以去查詢相關的資料。位址空間其實很好理解 當然針對早期的機器 早期的機器是沒有ram,rom,cach...

程序位址空間

kernel筆記 程序位址空間 2013 09 03 09 53 49 分類 linux 下圖是x86 64下linux程序的預設記憶體布局形式 下面逐一分析以上各個位址段的含義。text 段 段,從虛擬記憶體位址00400000開始,使用pmap 可以檢視到,這個位址是固定的 linux pmap...

程序位址空間

下圖是x86 64下linux程序的預設記憶體布局形式 下面逐一分析以上各個位址段的含義。text 段 段,從虛擬記憶體位址00400000開始,使用pmap 可以檢視到,這個位址是固定的 linux pmap 27729 bash 00400000 552k 480k 260k 0k 0k r x...