基本介紹
- 中文名:虛擬記憶體區塊結構體
- 外文名: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 | 頁是可寫的 |