一、核心記憶體配置
1、與應用程式中的malloc函數相對,在Linux核心中,通常使用kmalloc來動態分配記憶體
(1)原型: void * kmalloc(size_t size,int flags);
(2)參數:
i、size:要分配的記憶體大小
ii、flags:分配標誌,它控制kmalloc的行為。flags的取值可以是:
a、GFP_ATOMIC,用來在進程上下文之外的代碼(包括中斷處理)中分配記憶體,從不睡眠。(16M-896M)
b、GFP_KERNEL,在進程上下文中分配記憶體。可能睡眠(16M-896M)
c、__GFP_DMA,這個標誌要求分配能夠DMA傳輸的記憶體區。(物理地址在16M以下的頁幀)
d、__GFP_HIGHMEM,這個標誌表示分配的記憶體位於高端記憶體。(869M以上)
2、按頁分配(如果模組需要分配大塊的記憶體,那使用面向頁的分配技術會更好)
(1)get_zeroed_page(unsigned int flags);返回指向新頁面的指標,並將分頁清空
(2)__get_free_page(unsigned int flags);和get_free_page類似,但不清零頁面
(3)__get_free_pages(unsigned int flags,unsigned int order);分配若干個連續的頁面,返回指向該記憶體地區的指標,但也不清零這段記憶體地區
3、釋放,
I、當程式用完這些頁,可以使用下列函數之一來釋放他們
(1)void free_page(unsigned long addr)
(2)void free_pages(unsigned long addr,unsigned long order)
II、如果使用的是kmalloc分配的記憶體,則使用kfree來釋放
4、
系統記憶體的使用方式可以分為3種形式(流程圖分別用藍、紅、黑表示)
(1)來自使用者空間app的記憶體配置請求(藍色流程圖),注意,此時系統只是給這個請求返回一段虛擬位址區間,並沒有實際為它分配實體記憶體空間。只有當應用程式要訪問這段記憶體空間時,才會產生一個缺頁異常,然後通過get_free_page(s) 函數去系統的空閑頁框中實實在在的獲得一個記憶體單元
(2)來自核心的Kmalloc記憶體配置請求(紅色流程圖);這種請求機制中,有一個很重要的slab管理器。它的作用是:首先從系統空閑頁框中分出一部分物理頁框。然後再將這部分的物理頁框分成若干個小的(會有不同的尺寸大小)儲存單元並用鏈錶鏈接起來。這樣,kmalloc發出記憶體配置請求時,直接向slab去索取記憶體空間
(3)