函式有
kmalloc
get_free_page()
__get_free_pages()
__get_free_page()
vmalloc
kmem_cache
kmem_cache_alloc
linux記憶體分為3中,dma(可以直接訪問),normal memory,high memory
一般記憶體中,前16m是dma記憶體,一般提供給isa裝置。high memory用在32位系統訪問大位址空間,不能直接用,要對映。
#includechar *ptr=(char*)kmalloc(1024,gfp_kernel)
memset(ptr,0,1024);
kfree(ptr);
gfp_kernel,核心正常分配記憶體,空閒記憶體少時候,進入休眠等待頁面,當程序休眠,核心採取適當動作獲取空閒頁,所以用他來分配,必須可重入,不能在原子上下文執行。
gfp_atomic,中斷上下文使用,不會導致函式睡眠。
另外還有附加gfp_uster(可能睡眠),gfp_highuser(如果有高階記憶體,從高階記憶體分配),__gfp_dma,__gfp_highmem
使用小記憶體時用kmalloc
#include vmalloc
vfree
按4k頁分配記憶體
ptr=(char*)__get_free_pages(gfp_kernel,3)//3是2的3次方個記憶體頁
memset(ptr,0,page_size<<3);
free_pages((unsigned long)ptr,3);
頻繁分配固定大小記憶體頁
typedef struct_malloc_free
malloc_free,*pmalloc_free;
struct kmem_cache my_cache;
malloc_free *mptr;
my_cache=kmem_cache_create("mycache",sizeof(malloc_free));
mptr=kmem_cache_alloc(my_cache,gfp_kernel);
kmem_cache_free(cache,mptr);
if(cache)
kmem_cache_destroy(my_cache);
kmalloc()和__get_free_pages()申請的虛擬記憶體位於物理記憶體對映區域(<=896m),在物理上連續,與真實實體地址只有乙個固定偏移,所以存在簡單轉換關係。
kmalloc只能分配小塊記憶體,快,不會手動清零,沒有空閒可能會發生swap
vmalloc不一定連續,虛擬記憶體物理記憶體沒有簡單換算關係。無法再原子上下文使用。
kmem_cache分配同樣大小的記憶體頁
__get_free_pages:分配大塊頁記憶體。
linux核心記憶體分配
核心中的記憶體分配通常通過kmalloc kfree來進行,但是也有其它的方式來獲取記憶體,所有這些方式共同提供了核心中分配 釋放記憶體的介面。類似於標準c中的malloc free,kmalloc kfree是核心中的用於常規記憶體分配的介面。kmalloc kfree是工作在slab分配器的基礎...
核心記憶體的分配
當使用者態程序需要額外記憶體的時候,可以從核心所維護的空閒頁幀鍊錶中獲取頁,該鍊錶通常由頁替換演算法來更新,這些頁幀通常分散在物理記憶體當中,如果使用者只需要乙個位元組的記憶體,那麼會產生記憶體碎片,這是因為程序會得到整個頁幀 核心記憶體的分配通常是從空閒記憶體池中獲取的,而並不是從滿足普通使用者模...
Linux核心記憶體分配機制
現象 1 壓力測試過程中,發現被測物件效能不夠理想,具體表現為 程序的系統態cpu消耗20,使用者態cpu消耗10,系統idle大約70 2 用ps o majflt,minflt c program命令檢視,發現majflt每秒增量為0,而minflt每秒增量大於10000。初步分析 majflt...