91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

申請(qǐng)函數(shù)kmalloc、kzalloc、vmalloc區(qū)別說(shuō)明

Linux內(nèi)核補(bǔ)給站 ? 來(lái)源:Linux內(nèi)核補(bǔ)給站 ? 作者:Linux內(nèi)核補(bǔ)給站 ? 2022-05-19 16:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我們都知道在用戶空間動(dòng)態(tài)申請(qǐng)內(nèi)存用的函數(shù)是 malloc(),這個(gè)函數(shù)在各種操作系統(tǒng)上的使用是一致的,對(duì)應(yīng)的用戶空間內(nèi)存釋放函數(shù)是 free()。注意:動(dòng)態(tài)申請(qǐng)的內(nèi)存使用完后必須要釋放,否則會(huì)造成內(nèi)存泄漏,如果內(nèi)存泄漏發(fā)生在內(nèi)核空間,則會(huì)造成系統(tǒng)崩潰。

那么,在內(nèi)核空間中如何申請(qǐng)內(nèi)存呢?一般我們會(huì)用到 kmalloc()、kzalloc()、vmalloc() 等,下面我們介紹一下這些函數(shù)的使用以及它們之間的區(qū)別。

kmalloc()

函數(shù)原型:

void *kmalloc(size_t size, gfp_t flags);

kmalloc() 申請(qǐng)的內(nèi)存位于物理內(nèi)存映射區(qū)域,而且在物理上也是連續(xù)的,它們與真實(shí)的物理地址只有一個(gè)固定的偏移,因?yàn)榇嬖谳^簡(jiǎn)單的轉(zhuǎn)換關(guān)系,所以對(duì)申請(qǐng)的內(nèi)存大小有限制,不能超過(guò)128KB。

較常用的 flags(分配內(nèi)存的方法):

GFP_ATOMIC —— 分配內(nèi)存的過(guò)程是一個(gè)原子過(guò)程,分配內(nèi)存的過(guò)程不會(huì)被(高優(yōu)先級(jí)進(jìn)程或中斷)打斷;

GFP_KERNEL —— 正常分配內(nèi)存;

GFP_DMA —— 給 DMA 控制器分配內(nèi)存,需要使用該標(biāo)志(DMA要求分配虛擬地址和物理地址連續(xù))。

flags 的參考用法:

|– 進(jìn)程上下文,可以睡眠GFP_KERNEL |– 進(jìn)程上下文,不可以睡眠GFP_ATOMIC ||– 中斷處理程序GFP_ATOMIC ||– 軟中斷GFP_ATOMIC ||– TaskletGFP_ATOMIC |– 用于DMA的內(nèi)存,可以睡眠GFP_DMA | GFP_KERNEL |– 用于DMA的內(nèi)存,不可以睡眠GFP_DMA |GFP_ATOMIC

對(duì)應(yīng)的內(nèi)存釋放函數(shù)為:

void kfree(const void *objp);

kzalloc()

kzalloc() 函數(shù)與 kmalloc() 非常相似,參數(shù)及返回值是一樣的,可以說(shuō)是前者是后者的一個(gè)變種,因?yàn)?kzalloc() 實(shí)際上只是額外附加了__GFP_ZERO標(biāo)志。所以它除了申請(qǐng)內(nèi)核內(nèi)存外,還會(huì)對(duì)申請(qǐng)到的內(nèi)存內(nèi)容清零。

/** * kzalloc - allocate memory. The memory is set to zero. * @size: how many bytes of memory are required. * @flags: the type of memory to allocate (see kmalloc). */static inline void *kzalloc(size_t size, gfp_t flags){    return kmalloc(size, flags | __GFP_ZERO);}

kzalloc() 對(duì)應(yīng)的內(nèi)存釋放函數(shù)也是 kfree()。

vmalloc()

函數(shù)原型:

void *vmalloc(unsigned long size);

vmalloc() 函數(shù)則會(huì)在虛擬內(nèi)存空間給出一塊連續(xù)的內(nèi)存區(qū),但這片連續(xù)的虛擬內(nèi)存在物理內(nèi)存中并不一定連續(xù)。由于 vmalloc() 沒(méi)有保證申請(qǐng)到的是連續(xù)的物理內(nèi)存,因此對(duì)申請(qǐng)的內(nèi)存大小沒(méi)有限制,如果需要申請(qǐng)較大的內(nèi)存空間就需要用此函數(shù)了。

對(duì)應(yīng)的內(nèi)存釋放函數(shù)為:

void vfree(const void *addr);

注意:vmalloc() 和 vfree() 可以睡眠,因此不能從中斷上下文調(diào)用。

總結(jié)

kmalloc()、kzalloc()、vmalloc() 的共同特點(diǎn)是:

用于申請(qǐng)內(nèi)核空間的內(nèi)存;

內(nèi)存以字節(jié)為單位進(jìn)行分配;

所分配的內(nèi)存虛擬地址上連續(xù);

kmalloc()、kzalloc()、vmalloc() 的區(qū)別是:

kzalloc 是強(qiáng)制清零的 kmalloc 操作;(以下描述不區(qū)分 kmalloc 和 kzalloc)

kmalloc 分配的內(nèi)存大小有限制(128KB),而 vmalloc 沒(méi)有限制;

kmalloc 可以保證分配的內(nèi)存物理地址是連續(xù)的,但是 vmalloc 不能保證;

kmalloc 分配內(nèi)存的過(guò)程可以是原子過(guò)程(使用 GFP_ATOMIC),而 vmalloc 分配內(nèi)存時(shí)則可能產(chǎn)生阻塞;

kmalloc 分配內(nèi)存的開(kāi)銷小,因此 kmalloc 比 vmalloc 要快;

一般情況下,內(nèi)存只有在要被 DMA 訪問(wèn)的時(shí)候才需要物理上連續(xù),但為了性能上的考慮,內(nèi)核中一般使用 kmalloc(),而只有在需要獲得大塊內(nèi)存時(shí)才使用 vmalloc()。例如,當(dāng)模塊被動(dòng)態(tài)加載到內(nèi)核當(dāng)中時(shí),就把模塊裝載到由 vmalloc() 分配的內(nèi)存上。

審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3210

    瀏覽量

    76365
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67504
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    383
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

    次分配粒度" 巧妙解決了外碎片問(wèn)題,而我們申請(qǐng)內(nèi)核內(nèi)存的所有操作,最終都要通過(guò)伙伴系統(tǒng)提供的核心函數(shù)來(lái)完成。
    的頭像 發(fā)表于 02-10 16:58 ?3630次閱讀
    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存<b class='flag-5'>申請(qǐng)</b><b class='flag-5'>函數(shù)</b>詳解:從原理到實(shí)戰(zhàn)

    函數(shù)信號(hào)發(fā)生器和任意波形信號(hào)發(fā)生器區(qū)別詳解

    函數(shù)發(fā)生器提供了一個(gè)預(yù)置列表,里面列出了它可以生成的波形或碼型。 在函數(shù)發(fā)生器中,用戶可以更改頻率、幅度和偏移等波形參數(shù),還可添加簡(jiǎn)單的失真。 任意波形發(fā)生器更為復(fù)雜,能夠仿真真實(shí)世界中的信號(hào)
    的頭像 發(fā)表于 02-09 16:24 ?145次閱讀
    <b class='flag-5'>函數(shù)</b>信號(hào)發(fā)生器和任意波形信號(hào)發(fā)生器<b class='flag-5'>區(qū)別</b>詳解

    函數(shù)指針介紹

    這種函數(shù)應(yīng)該都很熟悉,其實(shí)就是一個(gè)函數(shù),然后返回值是一個(gè) int 類型,是一個(gè)數(shù)值 int *fun(int x,int y); 這和上面那個(gè)函數(shù)唯一的區(qū)別就是在
    發(fā)表于 01-21 08:11

    函數(shù)指針及指針函數(shù)區(qū)別

    !請(qǐng)看下面   指針函數(shù):   當(dāng)一個(gè)函數(shù)聲明其返回值為一個(gè)指針時(shí),實(shí)際上就是返回一個(gè)地址給調(diào)用函數(shù),以用于需要指針或地址的表達(dá)式中。   格式:   類型說(shuō)明符 *
    發(fā)表于 12-12 06:34

    LUA例程-常用的回調(diào)函數(shù)使用說(shuō)明

    詳細(xì)說(shuō)明LUA腳本函數(shù)功能和對(duì)應(yīng)的應(yīng)用實(shí)例。對(duì)于LUA腳本編程有很大的幫助和提高技能。
    發(fā)表于 11-24 16:43 ?0次下載

    發(fā)布元服務(wù)配置隱私說(shuō)明

    如果檢測(cè)到元服務(wù)中涉及獲取敏感隱私權(quán)限或者使用受限開(kāi)放權(quán)限,需要填寫“應(yīng)用隱私說(shuō)明”。 注意 如果軟件包中聲明使用了受限開(kāi)放權(quán)限,請(qǐng)確保創(chuàng)建的發(fā)布Profile也申請(qǐng)了對(duì)應(yīng)權(quán)限,否則元服務(wù)審核時(shí)將會(huì)
    發(fā)表于 11-24 15:19

    如何為印度服務(wù)器申請(qǐng)和配置反向DNS記錄?

    恒訊科技為您提供為印度服務(wù)器申請(qǐng)和配置反向DNS(rDNS/PTR記錄)的完整指南。了解為何反向DNS對(duì)郵件送達(dá)率、網(wǎng)絡(luò)安全和服務(wù)器信譽(yù)至關(guān)重要,并遵循我們的分步說(shuō)明,輕松完成從申請(qǐng)到驗(yàn)證的全過(guò)程
    的頭像 發(fā)表于 10-28 10:12 ?624次閱讀

    ulog_tag_lvl_filter_set()函數(shù)無(wú)法實(shí)現(xiàn)按照文檔說(shuō)明那樣實(shí)現(xiàn)按模塊過(guò)濾,怎么解決?

    ulog_tag_lvl_filter_set()函數(shù)無(wú)法實(shí)現(xiàn)按照文檔說(shuō)明那樣實(shí)現(xiàn)按模塊過(guò)濾,比如過(guò)濾掉所有drv.xxx的日志
    發(fā)表于 10-10 07:30

    詳解hal_entry入口函數(shù)

    當(dāng)使用RTOS時(shí),程序從main函數(shù)開(kāi)始進(jìn)行線程調(diào)度;當(dāng)沒(méi)有使用RTOS時(shí),C語(yǔ)言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry函數(shù)。由于我們新建的工程是沒(méi)有選用RTOS的,因此,
    的頭像 發(fā)表于 07-25 15:34 ?1987次閱讀

    MSP430常用內(nèi)聯(lián)函數(shù)說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《MSP430常用內(nèi)聯(lián)函數(shù)說(shuō)明.docx》資料免費(fèi)下載
    發(fā)表于 06-05 17:20 ?0次下載

    函數(shù)指針的六個(gè)常見(jiàn)應(yīng)用場(chǎng)景

    函數(shù)指針在嵌入式開(kāi)發(fā)中有著廣泛的應(yīng)用,它讓代碼更加靈活,減少冗余,提高可擴(kuò)展性。很多時(shí)候,我們需要根據(jù)不同的情況動(dòng)態(tài)調(diào)用不同的函數(shù),而函數(shù)指針正是實(shí)現(xiàn)這一需求的重要工具。本文將介紹六個(gè)常見(jiàn)的
    的頭像 發(fā)表于 04-07 11:58 ?1476次閱讀
    <b class='flag-5'>函數(shù)</b>指針的六個(gè)常見(jiàn)應(yīng)用場(chǎng)景

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個(gè)關(guān)鍵特性,通過(guò)該函數(shù),用戶可以增強(qiáng)對(duì)任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?1080次閱讀

    解鎖TSMaster fifo函數(shù):報(bào)文讀取的高效方法

    前言:TSMaster目前有兩種讀取報(bào)文的模式:回調(diào)函數(shù)模式和fifo模式。fifo函數(shù)是TSMaster近期新增的函數(shù),本文將重點(diǎn)介紹fifo模塊。關(guān)于回調(diào)函數(shù)的使用方法可以參考幫助
    的頭像 發(fā)表于 03-14 20:04 ?1150次閱讀
    解鎖TSMaster fifo<b class='flag-5'>函數(shù)</b>:報(bào)文讀取的高效方法

    STM32H7 ADC_IRQHandler和ADC3_IRQHandler這兩個(gè)中斷入口函數(shù)在使用上有什么區(qū)別?

    STM32H7,ADC_IRQHandler和ADC3_IRQHandler這兩個(gè)中斷入口函數(shù)在使用上有何區(qū)別?
    發(fā)表于 03-11 07:28

    充電樁廠家申請(qǐng)CCC認(rèn)證要準(zhǔn)備哪些材料?

    充電樁廠家申請(qǐng)CCC證書需要準(zhǔn)備哪些材料?充電樁CCC認(rèn)證需要提交的資料分為產(chǎn)品技術(shù)文件和工廠質(zhì)量體系文件兩大類。以下是全球通檢測(cè)整理的詳細(xì)資料清單及說(shuō)明:一、產(chǎn)品技術(shù)文件1.認(rèn)證申請(qǐng)書(實(shí)驗(yàn)室提供
    的頭像 發(fā)表于 03-10 16:55 ?982次閱讀
    充電樁廠家<b class='flag-5'>申請(qǐng)</b>CCC認(rèn)證要準(zhǔn)備哪些材料?