Linux memory management——(程式虛存空間的管理)(轉)

BSDLite發表於2007-08-16
Linux memory management——(程式虛存空間的管理)(轉)[@more@]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的虛擬記憶體空間。各個程式的虛擬記憶體彼此獨立。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-960751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章