Linux memory management——(進程虛存空間的管理)
1.內核空間和用戶空間
進程運行時能訪問的存儲空間只是它的虛擬內存空間。對當前該進程而言只有屬於它的虛擬內存是可見的。
在進程的虛擬內存包含著進程本身的程序代碼和數據。
進程在運行中還必須得到操作系統的支持。進程的虛擬內存中還包含著操作系統內核。
Linux把進程的虛擬內存分成兩部分,內核區和用戶區。
操作系統內核的代碼和數據等被映射到內核區。
進程的可執行映像(代碼和數據)映射到虛擬內存的用戶區。
進程虛擬內存的內核區的訪問權限設置為0級,用戶區為3級。
內核訪問虛存的權限為0級,而進程的訪問權限為3級
(1)Linux的用戶地址空間分布
進程描述符中的struct mm_struct *mm用來管理已分配給該進程的線性地址空間
每一個連續的線性地址區間由一個vm_area_struct管理,簡稱vma
mm中的vma按地址排序由線性鏈表連接起來,當vma的數量相當大的時候啟用avl樹,與線性鏈表同時管理vma以提高訪問效率
隨著vma的動態改變,vma之間存在歸並和拆分等操作
分配vma並不立即分配頁幀。
(2)Linux的內核地址空間分布
線性地址0xC0000000
物理映射區最大為896M,如果實際物理內存不足896M,則該區與實際物理內存大小相等
兩個隔離區的作用是防止越界造成的致命損害
Linux的存儲管理主要是管理進程虛擬內存的用戶區。
進程虛擬內存的用戶區分成代碼段、數據段、堆棧
以及進程運行的環境變量、參數傳遞區域等。
2.進程的虛存區域
一個虛存區域是虛存空間中一個連續的區域,在這個區域中的信息具有相同的操作和訪問特性。每個虛擬區域用一個vm_area_struct結構體進行描述.它定義在/include/linux/mm.h中
struct vm_area_struct { struct mm_struct * vm_mm; unsigned long vm_start;
unsigned long vm_end; pgprot_t vm_page_prot; unsigned short vm_flags; short vm_avl_height;
struct vm_area_struct * vm_avl_left;
struct vm_area_struct * vm_avl_right;
struct vm_area_struct * vm_next;
struct vm_area_struct * vm_next_share;
struct vm_area_struct * vm_prev_share;
struct vm_operations_struct * vm_ops;
unsigned long vm_offset;
struct inode * vm_inode;
unsigned long vm_pte;
};
(1)vm_mm指針指向進程的mm_struct結構體。
(2)vm_start和vm_end 虛擬區域的開始和終止地址。
(3)vm_flags指出了虛存區域的操作特性:
VM_READ 虛存區域允許讀取
VM_WRITE 虛存區域允許寫入
VM_EXEC 虛存區域允許執行
VM_SHARED 虛存區域允許多個進程共享
VM_GROWSDOWN 虛存區域可以向下延伸
VM_GROWSUP 虛存區域可以向上延伸
VM_SHM 虛存區域是共享存儲器的一部分
VM_LOCKED 虛存區域可以加鎖
VM_STACK_FLAGS 虛存區域做為堆棧使用
(4)vm_page_prot 虛存區域的頁面的保護特性。
(5)若虛存區域映射的是磁盤文件或設備文件的的內容,則vm_inode指向這個文件的inode結構體,否則vm_inode為NULL。
(6)vm_offset是該區域的內容相對於文件起始位置的偏移量,或相對於共享內存首址的偏移量。
(7)所有vm_area_struct結構體鏈接成一個單向鏈表,vm_next指向下一個vm_area_struct結構體。鏈表的首地址由mm_struct中成員項mmap指出。
(8)vm_ops是指向vm_operations_struct結構體的指針。該結構體中包含著指向各種操作的函數的指針。
(9)所有vm_area_struct結構體組成一個AVL樹。
(10)vm_next_share和vm_prev_share,把有關的vm_area_struct
結合成一個共享內存時使用的雙向鏈表。
系統為每個進程提供了4GB的虛擬內存空間。各個進程的虛擬內存彼此獨立。