Linux核心記憶體分配

2021-09-24 06:47:52 字數 1497 閱讀 8424

函式有

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...