名詞解釋:
2.頁描述符:描述每乙個頁框的狀態資訊,所有的頁描述符都是儲存在mem_map陣列中,每個描述符32個位元組。
3.節點:系統物理記憶體被劃分為多個節點,每個節點內cpu訪問頁面的時間是相同的,對應的資料結構:節點描述符。
4.管理區:每個節點又分為多個管理區,對應的資料結構: 管理區描述符
1.do_mmap(struct file *file, unsigned long addr,
unsigned long len, unsigned long prot,
unsigned long flag, unsigned long offset)
為當前程序建立並初始化乙個新的線性區。分配成功後,可以把這個新的線性區與程序已有的其他線性區進行合併。
file:要對映的檔案描述符,知道對映哪個檔案才行
offset:檔案內的偏移量,指定要對映檔案的一部分,當然也可以是全部
len: 要對映檔案的那一部分的長度
flag:一組標誌,顯示的指定對映的那部分是map_shared或map_private
prot: 一組許可權,指定對線性區訪問的一種或多種訪問許可權
addr: 乙個可選的線性位址,表示從這個位址之後的某個位置建立線性區
(1)檢查引數是否正確。
(3)做一些許可權和標誌位檢查
(4)呼叫find_vma_prepare()確定處於新區間之前的線性區物件的位置,以及在紅黑樹中新線性區的位置。
(5)呼叫slab分配函式kmem_cache_alloc()為新的線性區分配乙個vm_area_struct資料結構。
(6)初始化新的線性區物件,呼叫vma_link()把新線性區插入到線性區煉表和紅黑樹中。
(7)增加存放在記憶體描述符total_vm欄位中的程序位址空間的大小,如果設定了vm_locked標誌,呼叫make_pages_present()連續分配線性區的所有頁,並把它們鎖在ram中,make_pages_present()又呼叫get_user_pages(),get_user_pages()。
其他線性區處理函式
1.find_vma(struct mm_struct *mm, unsigned long addr)
查詢線性區的vm_end欄位大於addr的第乙個線性區的位置,並返回這個線性區描述符的位址。
2.find_vma_prev(struct mm_struct *mm, unsigned long addr,
struct vm_area_struct **pprev)
與find_vma()類似,不同的是它把函式選中的前乙個線性區描述符的指標賦給了附加引數ppre。
2.do_munmap(struct mm_struct *mm, unsigned long start, size_t
len)
該函式經過兩個主要的階段。第一階段:掃瞄程序所擁有的線性區鍊錶,並把包含在程序位址空間的線性位址區間中的所有線性區從鍊錶中解除鏈結。第二階段:更新程序的頁表,並把第一階段找到並標識出的線性區刪除。
linux為什麼要分為三個區:zone_dma zone_normal zone_highmem?
(1)isa匯流排的歷史遺留問題,只能訪問記憶體的前16m的空間
(2)大容量的ram使得線性位址空間太小,並不是所有的物理空間都能對映到唯一的線性位址空間
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...
Linux記憶體管理
首先我要說,我這是轉貼,轉的cu論壇上 nonameboy 的帖子,你可以連線過去看看。今天因為要解釋系統中可用記憶體的大小,用google看了半天,還有在cu上找了關天,竞然沒有發現有比較好的章,估計很多人都沒有注意到,懂了以後又沒有整理出來。在cu上看了很多文章說什麼memory leak和li...