虛空間管理
頁框和頁的關系
頁框
將內存空間分為一個個大小相等的分區(比如:每個分區4KB),每個分區就是一個頁框,也叫頁幀,即物理頁面,是linux劃分內存空間的結果。
每個頁框都有一個頁框號,即內存塊號、物理塊號。
頁
將用戶進程的地址空間也分為與頁框大小相等的一個個區域,稱為頁或頁面,即虛擬頁面,是linux劃分地址空間的結果。
每個頁面都有一個頁號
頁、頁表項、頁表、頁目錄項、頁目錄的關系參考:
計算機體系結構——虛擬內存技術
CSDN:基本分頁存儲管理的基本概念
線性區
當用戶態進程動態請求內存時,linux并不會直接分配物理頁框,而是先分配一段新的虛擬地址空間的使用權。
CSDN:進程地址空間 - VMA線性區
PCB中內存信息數據結構
主要的數據結構
mm_struct
mm是進程控制塊中的一個成員,表示了該進程的內存信息。
每個進程都有自己的頁目錄、頁表項等信息
*pgd: 一級頁表的起始地址
*mmap:指向進程的第一個VMA
mm_rb:指向紅黑樹的根
vm_area_struct
線性區,表示用戶虛空間中的一塊連續區域,可以簡稱為vma。
數據結構成員包括權限信息等。
vm_rb->rb_left指針指向相鄰的低地址VMA,vm_rb->rb_right指向相鄰的高地址VMA1
page
頁框描述符,描述了頁框的類型(匿名頁還是文件頁)
mem_map:描述了所有頁框,連續存放。
file
頁高速緩存,以文件為管理單位:緩存的頁框屬于某個文件
硬盤數據頁的高速緩存,放在頁框中;
address_space
address_space:記錄映射到本文件(某一區間)的所有線性區,這些線性區按其區間組織為一顆優先搜索樹。
page_tree:文件的所有緩存頁框的描述符構成一顆基樹,該結構體表示基樹的根節點,如果最低位為1,表示指向的是一個radix_tree_node對象
anon_vma
anon_vma數據結構,鏈接了page和anon_vma,實質上和anon_vma_chain共同鏈接了的page數據結構和VMA的vm_area_struct數據結構
anon_vma_chain
anon_vma_chain鏈接了anon_vma和vma
rb_node 和 rb_root
radix_tree_node
path:該節點的頁節點數
count:表示有效頁框描述符地址的數量
數據結構關系
數據結構關系圖:
鏈表關系
所有的page構成一顆基樹
頁框描述符紅黑樹
通過page->index可以快速找到其他page地址
vma紅黑樹
所以進程的VMAs組成一個雙向鏈表
反向映射
正向映射:頁號 → 頁框號,即通過虛擬頁號查找物理頁號
反向映射:頁框號 → 進程號和頁號的集合,即在已知物理頁面(page frame)的情況下,找到映射該物理頁面的虛擬頁。
反向映射使用場景
反向映射通常在頁框回收時需要此功能,例如
- 當內存空間不足時,有些頁面長時間不適用,需要交換到磁盤
- 有些頁面需要遷移
工作原理
當上述使用場景需要反向映射時,linux為了快速定位映射到該物理頁的頁表項,通過頁框號查找頁框描述符,通過頁框描述符中的mapping確定是匿名頁還是文件頁,并根據mapping的值
t
父進程為自己的進程空間VMA分配物理頁面的時,會產生匿名頁面
匿名頁和文件頁
二者均是頁框的類型。
匿名頁
不屬于文件的頁高速緩存,沒有關聯到文件頁,不是以文件形式存在,無法和磁盤文件交換
匿名頁面是線性區的一種類型,映射到anon_vma對象(該對象關聯了進程為對應線性區申請的一組匿名頁框,并記錄了使用這些頁框的所有線性區)
mapping的最低位為1.
匿名頁反向映射結構圖2:
文件頁
映射文件的頁,即某個文件的也高速緩存。程序可以通過read/write/mmap去操作,此時在內存中會申請page cache來緩存硬盤內容,因此該內容及存在于內存,也存在于外存中
屬于某個address_space對象(該對象記錄使用該文件頁高速緩存的所有線性區)
mapping!=0,但mapping的最低位為0。
文件頁反向映射結構圖2
linux內存管理筆記(三十四)----匿名映射
參考文獻
紅黑樹的應用:Linux內核虛擬內存的管理 ??
CSDN:linux內存管理筆記(三十八)----反向映射 ?? ??