溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Linux中如何使用kmalloc內(nèi)核內(nèi)存分配函數(shù)

發(fā)布時(shí)間:2021-06-21 18:55:55 來(lái)源:億速云 閱讀:429 作者:Leah 欄目:互聯(lián)網(wǎng)科技

本篇文章給大家分享的是有關(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)核基于slubCONFIG_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è)備。

二、參數(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)性地址)。

四、kfree

正所謂有借有還,再借不難。每次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è)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI