vm_area_struct結構體是include\linux\mm_types.h檔案中定義的結構體,簡稱VMA,也被稱為進程地址空間或進程線性區,在創建之後會插入到mm->mm_rb紅黑樹和mm->mmap鍊表中。該結構體用來定義VMM記憶體區域,是linux虛存管理的最基本的管理單元,它描述的是一段連續的、具有相同訪問屬性的虛擬記憶體空間,大小為物理記憶體頁面的整數倍。
基本介紹
- 中文名:虛擬記憶體區塊結構體
- 外文名:vm_area_struct
- 縮寫:VMA
- 位置:include\linux\mm_types.h檔案
結構體內容,結構體各欄位說明,
結構體內容
linux 4.20原始碼關於vm_area_struct結構體的描述如下:
struct vm_area_struct { unsigned long vm_start; unsigned long vm_end; struct vm_area_struct* vm_next, * vm_prev; struct rb_node vm_rb; unsigned long rb_subtree_gap; struct mm_struct* vm_mm; pgprot_t vm_page_prot; unsigned long vm_flags; struct { struct rb_node rb unsigned long rb_subtree_last; } shared; struct list_head anon_vma_chain; struct anon_vma* anon_vma; const struct vm_operations_struct* vm_ops; unsigned long vm_pgoff; struct file* vm_file; void* vm_private_data; #ifndef CONFIG_MMU struct vm_region* vm_region;#endif#ifdef CONFIG_NUMA struct mempolicy* vm_policy;#endif};
結構體各欄位說明
Linux 原始碼中vm_area_struct結構體各欄位功能及部分取值描述如下:
1. vm_start、vm_end成員分別保存了該虛擬記憶體空間的首地址和末地址後第一個位元組的地址,以位元組為單位,所以虛擬記憶體空間範圍可以用 [vm_start, vm_end)表示。
2. 指針vm_next, vm_prev 分別VMA鍊表的前後成員。通常,進程所使用到的虛擬記憶體空間不連續,且各部分虛擬記憶體空間的訪問屬性也可能不同。所以一個進程的虛擬記憶體空間需要多個vm_area_struct結構來描述。在vm_area_struct結構的數目較少的時候,各個vm_area_struct按照升序排序,以單鍊表的形式組織數據,vm_next, vm_prev分別指向當前節點的下一個節點、上一個節點。
3. vm_rb,當vm_area_struct結構的數據較多的時候,仍然採用鍊表組織的化,勢必會影響到它的搜尋速度。針對這個問題,每個進程結構體mm_struct中都創建一個紅黑樹,將本VMA作為一個節點加入到紅黑樹中,以提高vm_area_struct的搜尋速度。
4. rb_subtree_gap保存本node中左右子樹中最大的gap,也就是最大間隙size。換句話說,從這個node開始,左右子樹中能插入的VMA最大length是多少。