一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(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 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我們都知道在用戶(hù)空間動(dòng)態(tài)申請(qǐng)內(nèi)存用的函數(shù)是 malloc(),這個(gè)函數(shù)在各種操作系統(tǒng)上的使用是一致的,對(duì)應(yīng)的用戶(hù)空間內(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)銷(xiāo)小,因此 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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)注

    8

    文章

    3125

    瀏覽量

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

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64872
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    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次下載

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

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

    AN207 GD32G5x3三角函數(shù)加速器TMU的使用說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《AN207 GD32G5x3三角函數(shù)加速器TMU的使用說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 01-21 17:30 ?2次下載
    AN207 GD32G5x3三角<b class='flag-5'>函數(shù)</b>加速器TMU的使用<b class='flag-5'>說(shuō)明</b>

    如何把兩個(gè)數(shù)據(jù)返回給調(diào)用函數(shù)

    已經(jīng)知道函數(shù)會(huì)返回兩個(gè)數(shù)據(jù),提前申請(qǐng)兩個(gè)元素的內(nèi)存,并且把數(shù)組作為參數(shù)傳遞過(guò)去,把返回值放在數(shù)組中就行。 第三種,定義一個(gè)全局的結(jié)構(gòu)體變量,這樣可以不用傳參也不用返回,直接操作全局?jǐn)?shù)據(jù)。 比較典型的錯(cuò)誤寫(xiě)法有兩種
    的頭像 發(fā)表于 01-08 10:15 ?412次閱讀

    stdio.h實(shí)現(xiàn)了printf函數(shù)?

    里面實(shí)現(xiàn)了 printf。 實(shí)際上并不是,這里就涉及了頭文件和庫(kù)的區(qū)別。 頭文件一般存放大家都要用的東西,比如函數(shù)的聲明,結(jié)構(gòu)體的聲明,命名新的類(lèi)型等等。 stdio.h 頭文件,里面也只是聲明了一下
    的頭像 發(fā)表于 12-18 10:28 ?609次閱讀

    同樣是函數(shù),在C和C++中有什么區(qū)別

    同樣是函數(shù),在 C 和 C++ 中有什么區(qū)別? 第一個(gè)返回值。 C語(yǔ)言的函數(shù)可以不寫(xiě)返回值類(lèi)型,編譯器會(huì)默認(rèn)為返回 int。 但是 C++ 的函數(shù),除了構(gòu)造和析構(gòu)這兩個(gè)特殊的
    的頭像 發(fā)表于 11-29 10:25 ?911次閱讀

    SUMIF函數(shù)與SUMIFS函數(shù)區(qū)別

    SUMIF函數(shù)和SUMIFS函數(shù)都是Excel中用于條件求和的函數(shù),它們可以幫助用戶(hù)根據(jù)特定的條件對(duì)數(shù)據(jù)進(jìn)行求和。盡管它們的基本功能相似,但在使用場(chǎng)景和功能上存在一些差異。以下是對(duì)這兩個(gè)函數(shù)
    的頭像 發(fā)表于 10-30 09:51 ?7527次閱讀

    如何申請(qǐng)xilinx IP核的license

    在使用FPGA的時(shí)候,有些IP核是需要申請(qǐng)后才能使用的,本文介紹如何申請(qǐng)xilinx IP核的license。
    的頭像 發(fā)表于 10-25 16:48 ?1408次閱讀
    如何<b class='flag-5'>申請(qǐng)</b>xilinx IP核的license

    CAN/CANFD卡接口函數(shù)使用說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《CAN/CANFD卡接口函數(shù)使用說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 10-15 17:35 ?0次下載

    請(qǐng)問(wèn)TAS6424E-Q1和TAS6424-Q1的區(qū)別主要有什么 是否有官方的說(shuō)明文檔

    請(qǐng)問(wèn)TAS6424E-Q1和TAS6424-Q1的區(qū)別是否有官方的說(shuō)明文檔,除了數(shù)據(jù)手冊(cè)之外,多謝!
    發(fā)表于 10-09 10:11

    向IEEE機(jī)構(gòu)申請(qǐng)MAC地址的申請(qǐng)流程

    所有設(shè)備在投入市場(chǎng)銷(xiāo)售使用前該臺(tái)設(shè)備都必須寫(xiě)入MAC地址,以便設(shè)備后續(xù)使用的識(shí)別與安全性監(jiān)控。而MAC地址的申請(qǐng)方法主要可以通過(guò)兩種渠道進(jìn)行:直接向IEEE申請(qǐng)或通過(guò)國(guó)內(nèi)的代理機(jī)構(gòu)申請(qǐng)。以下是英利
    的頭像 發(fā)表于 09-29 17:52 ?814次閱讀
    向IEEE機(jī)構(gòu)<b class='flag-5'>申請(qǐng)</b>MAC地址的<b class='flag-5'>申請(qǐng)</b>流程

    公有IP與私有IP之間的區(qū)別

    今天我們來(lái)分享私有IP地址和公有IP地址的有什么區(qū)別?主要從接入方式、特點(diǎn)以及各自的優(yōu)勢(shì)來(lái)說(shuō)明
    的頭像 發(fā)表于 09-21 10:49 ?1091次閱讀

    遠(yuǎn)程患者監(jiān)測(cè)申請(qǐng)簡(jiǎn)介

    電子發(fā)燒友網(wǎng)站提供《遠(yuǎn)程患者監(jiān)測(cè)申請(qǐng)簡(jiǎn)介.pdf》資料免費(fèi)下載
    發(fā)表于 09-10 10:43 ?0次下載
    遠(yuǎn)程患者監(jiān)測(cè)<b class='flag-5'>申請(qǐng)</b>簡(jiǎn)介

    怎么申請(qǐng)MAC地址?不同申請(qǐng)方式的區(qū)別是什么?

    分享申請(qǐng)藍(lán)牙設(shè)備MAC地址的主要步驟和渠道:MAC地址申請(qǐng)渠道直接通過(guò)IEEE申請(qǐng):IEEE提供了多種MAC地址塊服務(wù),包括MACAddressBlockLarge
    的頭像 發(fā)表于 08-22 16:55 ?1464次閱讀
    怎么<b class='flag-5'>申請(qǐng)</b>MAC地址?不同<b class='flag-5'>申請(qǐng)</b>方式的<b class='flag-5'>區(qū)別</b>是什么?

    面試常考+1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組

    在嵌入式開(kāi)發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針和指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場(chǎng)景,對(duì)于提升嵌入式程序的效率和質(zhì)量至關(guān)重要。一、指針函數(shù)函數(shù)指針指針
    的頭像 發(fā)表于 08-10 08:11 ?1456次閱讀
    面試???1:<b class='flag-5'>函數(shù)</b>指針與指針<b class='flag-5'>函數(shù)</b>、數(shù)組指針與指針數(shù)組