您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)Linux中如何使用kmalloc內(nèi)核內(nèi)存分配函數(shù),小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。
static __always_inline void *kmalloc(size_t size, gfp_t flags){ if (__builtin_constant_p(size)) { if (size > KMALLOC_MAX_CACHE_SIZE) return kmalloc_large(size, flags);#ifndef CONFIG_SLOB if (!(flags & GFP_DMA)) { int index = kmalloc_index(size); if (!index) return ZERO_SIZE_PTR; return kmem_cache_alloc_trace(kmalloc_caches[index], flags, size); }#endif } return __kmalloc(size, flags);}
注:
1)__builtin_constant_p
編譯器內(nèi)聯(lián)函數(shù),判斷傳入?yún)?shù)是否為常量。如果是變量,直接調(diào)用__kmalloc
函數(shù)。
2)KMALLOC_MAX_CACHE_SIZE
表示系統(tǒng)創(chuàng)建slab cache
的最大值為8K,定義如下:
## include/linux/slab.h/* Maximum size for which we actually use a slab cache */#define KMALLOC_MAX_CACHE_SIZE (1UL << KMALLOC_SHIFT_HIGH)#ifdef CONFIG_SLUB/* * SLUB directly allocates requests fitting in to an order-1 page * (PAGE_SIZE*2). Larger requests are passed to the page allocator. */#define KMALLOC_SHIFT_HIGH (PAGE_SHIFT + 1)#endif## arch/arm64/include/asm/page.h #define PAGE_SHIFT CONFIG_ARM64_PAGE_SHIFT## arch/arm64/Kconfigconfig ARM64_PAGE_SHIFT int default 16 if ARM64_64K_PAGES default 14 if ARM64_16K_PAGES default 12
RockPI 4A Linux內(nèi)核使能ARM64_4K_PAGES
??墒褂妹?code>getconf查看page size
,具體如下:
root@linaro-alip:~# getconf PAGESIZE4096
3)kmalloc
一般用于小內(nèi)存分配,RockPI 4A Linux內(nèi)核基于slub
(CONFIG_SLUB=y
)實(shí)現(xiàn)。系統(tǒng)先用頁(yè)分配器分配以頁(yè)為最小單位的連續(xù)物理地址,然后kmalloc
在此基礎(chǔ)上根據(jù)調(diào)用者的需要進(jìn)行切分。如果分配超過(guò)KMALLOC_MAX_CACHE_SIZE
,則使用kmalloc_large
進(jìn)行大內(nèi)存分配,即調(diào)用頁(yè)分配器分配內(nèi)存。(后續(xù)仔細(xì)學(xué)習(xí))
4)kmalloc
分配的內(nèi)存在物理上連續(xù),可用于DMA設(shè)備。vmalloc
分配的內(nèi)存是線(xiàn)性地址連續(xù),物理地址不連續(xù),不可用于DMA設(shè)備。
size
:分配內(nèi)存的大小,以字節(jié)為單位;
flags
:分配內(nèi)存的類(lèi)型,包括:
1)GFP_USER
:可能會(huì)引起休眠,用于為用戶(hù)空間分配內(nèi)存。
2)GFP_KERNEL
:可能會(huì)引起休眠,用于內(nèi)核內(nèi)存正常分配。
3)GFP_ATOMIC
:不會(huì)引起休眠,可用于中斷處理程序中內(nèi)存分配。
4)GFP_HIGHUSER
:從高端內(nèi)存中分配內(nèi)存。
5)GFP_DMA
:用于DMA內(nèi)存分配。
6)其它類(lèi)型見(jiàn):include/linux/gfp.h
GFP
可理解為get free page
。
返回分配內(nèi)存的首地址,是虛擬地址(線(xiàn)性地址)。
正所謂有借有還,再借不難。每次kmalloc
,都要有對(duì)應(yīng)的內(nèi)存釋放函數(shù)kfree
。定義文件:mm/slub.c
,如下:
void kfree(const void *x)
以上就是Linux中如何使用kmalloc內(nèi)核內(nèi)存分配函數(shù),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。