一、分佈位置上的區別: kmalloc()和__get_free_pages()函數申請的記憶體位於物理記憶體的映射區域,而且在物理上也是連續的,它們與真實的物理地址只有一個固定的偏移,因此存在簡單的線性關係;(3G+896M)(低端記憶體); vmalloc函數申請的虛擬記憶體與物理記憶體之間也沒有簡單的換 ...
一、分佈位置上的區別:
kmalloc()和__get_free_pages()函數申請的記憶體位於物理記憶體的映射區域,而且在物理上也是連續的,它們與真實的物理地址只有一個固定的偏移,因此存在簡單的線性關係;(3G+896M)(低端記憶體);
vmalloc函數申請的虛擬記憶體與物理記憶體之間也沒有簡單的換算關係;(高端記憶體)(3G+896M以上的記憶體);
二、特性上的區別:
1、kmalloc()
void *kmalloc(size_t size, int flags);
kmalloc第一個參數是要分配塊的大小,第二個參數為分配標誌,用於控制kmalloc的行為;
最常用的分配標誌是GFP_KERNEL,其含義是內核空間的進程中申請記憶體。kmalloc()的底層依賴__get_free_page()實現,分配標誌的首碼GFP正好是底層函數的縮寫。
kmalloc申請的是較小的連續的物理記憶體,記憶體物理地址上連續,虛擬地址上也是連續的,使用的是記憶體分配器slab的一小片。申請的記憶體位於物理記憶體的映射區域。其真正的物理地址只相差一個固定的偏移。可以用兩個巨集來簡單轉換__pa(address) { virt_to_phys()} 和__va(address) {phys_to_virt()}
使用kmalloc函數之後使用kfree函數;
2、__get_free_pages()
get_free_page()申請的記憶體是一整頁,一頁的大小一般是128K。
從本質上講,kmalloc和get_free_page最終調用實現是相同的,只不過在調用最終函數時所傳的flag不同而已。
3、vmalloc()
vmalloc()一般用在只存在於軟體中的較大順序緩衝區分配記憶體,vmalloc()遠大於__get_free_pages()的開銷,為了完成vmalloc(),新的頁表需要被建立。所以效率沒有kmalloc和__get_free_page效率高;
三、另外的一些東西:
kmalloc()
用於申請較小的、連續的物理記憶體
1. 以位元組為單位進行分配,在<linux/slab.h>中
2. void *kmalloc(size_t size, int flags) 分配的記憶體物理地址上連續,虛擬地址上自然連續
3. gfp_mask標誌:什麼時候使用哪種標誌?如下:
———————————————————————————————-
情形 相應標誌
———————————————————————————————-
進程上下文,可以睡眠 GFP_KERNEL
進程上下文,不可以睡眠 GFP_ATOMIC
中斷處理程式 GFP_ATOMIC
軟中斷 GFP_ATOMIC
Tasklet GFP_ATOMIC
用於DMA的記憶體,可以睡眠 GFP_DMA | GFP_KERNEL
用於DMA的記憶體,不可以睡眠 GFP_DMA | GFP_ATOMIC
———————————————————————————————-