Linux memory management——(程式虛存空間的管理)(轉)
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的虛擬記憶體空間。各個程式的虛擬記憶體彼此獨立。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux Memory ManagementLinux
- 12. 記憶體管理(Memory Management)記憶體
- Linux Memory Management or 'Why is there no free RAM?' (zt)Linux
- Memory Management in RustRust
- 【儲存管理】表空間概念
- 管理表空間(表空間的屬性)轉貼
- memory management unit (MMU)
- 程式虛擬空間分佈
- 【儲存管理】建立永久表空間
- 將字典管理表空間轉換為本地管理表空間
- 虛擬空間的陷阱--對微軟的檄文 (轉)微軟
- Oracle Shared Pool Memory ManagementOracle
- Oracle Automatic PGA Memory ManagementOracle
- 本地表空間管理優點vs資料字典表空間管理(轉載)
- VMware下LINUX的虛擬機器增加磁碟空間Linux虛擬機
- 為Linux虛擬機器增加磁碟空間Linux虛擬機
- linux記憶體管理--使用者空間和核心空間Linux記憶體
- 程式的虛擬地址空間——NULL指標分割槽Null指標
- Linux管理指令碼之清理空間Linux指令碼
- Win10系統管理磁碟儲存空間的方法Win10
- HP-UX top 輸出中實存(real memory)/虛存(virtual memory)資料解釋UX
- Oracle Memory Management and HugePage (連載一)Oracle
- Oracle Memory Management and HugePage (連載二)Oracle
- Oracle Memory Management and HugePage (連載三)Oracle
- Oracle Memory Structure 1. Overview And ManagementOracleStructView
- Linux 虛擬機器擴充套件磁碟空間Linux虛擬機套件
- SQL Server 2012 記憶體管理 (memory management) 改進SQLServer記憶體
- linux fork程式空間問題Linux
- 【儲存管理】建立臨時表空間組、建立臨時表空間組及使用
- Oracle 本地表空間管理與字典表空間管理Oracle
- Linux 磁碟掛載和swap空間管理Linux
- 儲存管理之段收縮、可恢復空間
- Oracle的表空間的儲存管理與最佳化技術Oracle
- Go的棧空間管理Go
- Oracle 表空間的管理Oracle
- Oracle的表空間管理Oracle
- [zt] 如何將資料字典管理表空間(DMT)轉化為本地管理表空間(LMT)
- LINUX的系統核心空間的保護(轉)Linux