vm_area_struct結構體

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是多少。
5. vm_mm指向VMA所屬進程的struct mm_struct結構。
6. vm_page_prot描述VMA訪問許可權,用於創建區域中各頁目錄、頁表項和存取控制標誌,如R/W, U/S, A, D, G位等。
7. vm_flags主要保存VMA標誌位,其定義和描述如下:
標誌名
描述
VM_DENYWRITE
在這個區間映射一個打開後不能用來寫的檔案
VM_EXEC
頁可以被執行
VM_EXECUTABLE
頁含有可執行代碼
VM_GROWSDOWN
這個區間可以向低地址擴展
VM_GROWSUP
這個區間可以向高地址擴展
VM_IO
這個區間映射一個設備的I/O地址空間
VM_LOCKED
頁被鎖住不能被交換出去
VM_MAYEXEC
VM_EXEC標誌可以被設定
VM_MAYREAD
VM_READ標誌可以被設定
VM_MAYSHARE
VM_SHARE標誌可以被設定
VM_MAYWRITE
VM_WRITE標誌可以被設定
VM_READ
頁是可讀的
VM_SHARED
頁可以被多個進程共享
VM_SHM
頁用於IPC共享記憶體
VM_WRITE
頁是可寫的

相關詞條

熱門詞條

聯絡我們