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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

申請函數kmalloc、kzalloc、vmalloc區(qū)別說明

Linux內核補給站 ? 來源:Linux內核補給站 ? 作者:Linux內核補給站 ? 2022-05-19 16:13 ? 次閱讀

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

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

kmalloc()

函數原型:

void *kmalloc(size_t size, gfp_t flags);

kmalloc() 申請的內存位于物理內存映射區(qū)域,而且在物理上也是連續(xù)的,它們與真實的物理地址只有一個固定的偏移,因為存在較簡單的轉換關系,所以對申請的內存大小有限制,不能超過128KB。

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

GFP_ATOMIC —— 分配內存的過程是一個原子過程,分配內存的過程不會被(高優(yōu)先級進程或中斷)打斷;

GFP_KERNEL —— 正常分配內存;

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

flags 的參考用法:

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

對應的內存釋放函數為:

void kfree(const void *objp);

kzalloc()

kzalloc() 函數與 kmalloc() 非常相似,參數及返回值是一樣的,可以說是前者是后者的一個變種,因為 kzalloc() 實際上只是額外附加了__GFP_ZERO標志。所以它除了申請內核內存外,還會對申請到的內存內容清零。

/** * 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() 對應的內存釋放函數也是 kfree()。

vmalloc()

函數原型:

void *vmalloc(unsigned long size);

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

對應的內存釋放函數為:

void vfree(const void *addr);

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

總結

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

用于申請內核空間的內存;

內存以字節(jié)為單位進行分配;

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

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

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

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

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

kmalloc 分配內存的過程可以是原子過程(使用 GFP_ATOMIC),而 vmalloc 分配內存時則可能產生阻塞;

kmalloc 分配內存的開銷小,因此 kmalloc 比 vmalloc 要快;

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

審核編輯:符乾江

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

    關注

    8

    文章

    2979

    瀏覽量

    73824
  • 函數
    +關注

    關注

    3

    文章

    4285

    瀏覽量

    62333
  • malloc
    +關注

    關注

    0

    文章

    52

    瀏覽量

    64
收藏 人收藏

    評論

    相關推薦

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

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

    CAN/CANFD卡接口函數使用說明

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

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

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

    函數發(fā)生器和示波器的區(qū)別

    在電子工程領域中,函數發(fā)生器和示波器是兩種不可或缺的工具。它們各自在電子信號的產生、觀測和分析中發(fā)揮著重要的作用。然而,盡管它們都與電子信號有關,但函數發(fā)生器和示波器在功能、應用、設計原理等方面存在顯著的區(qū)別。本文將詳細探討這兩
    的頭像 發(fā)表于 05-15 11:46 ?782次閱讀

    請問stm32g0的range1 range2有什么區(qū)別?

    哪里有關于Range1 Range2的區(qū)別說明?
    發(fā)表于 04-01 07:19

    函數發(fā)生器和信號發(fā)生器的區(qū)別和聯(lián)系

    發(fā)生器的區(qū)別和聯(lián)系,包括它們的基本原理、工作方式、應用領域以及各自的優(yōu)缺點等。 一、基本原理 函數發(fā)生器 函數發(fā)生器是一種能夠產生各種波形信號的電子設備。它工作的基本原理是使用頻率合成技術,通過將不同頻率的正弦波
    的頭像 發(fā)表于 02-23 16:10 ?1999次閱讀

    使用PKCS#11標準API的HSE訪問方案 AN14072申請說明

    電子發(fā)燒友網站提供《使用PKCS#11標準API的HSE訪問方案 AN14072申請說明.pdf》資料免費下載
    發(fā)表于 01-23 15:37 ?0次下載
    使用PKCS#11標準API的HSE訪問方案 AN14072<b class='flag-5'>申請說明</b>

    路由器CCC認證申請流程,發(fā)證周期多長?

    CCC認證的申請流程以及該類型產品的發(fā)證周期。以下是CCC認證申請流程的大致步驟:1.申請準備:準備好申請材料,包括申請表、產品
    的頭像 發(fā)表于 01-11 16:33 ?543次閱讀
    路由器CCC認證<b class='flag-5'>申請</b>流程,發(fā)證周期多長?

    移植ADV7180驅動時,在執(zhí)行探測函數adv7180_probe的kzalloc分配內存時返回NULL,可確實還有內存是怎么回事?

    移植ADV7180驅動時,在執(zhí)行探測函數adv7180_probe的kzalloc分配內存時返回NULL,可確實還有內存,這是怎么回事?
    發(fā)表于 12-12 07:00

    settimeout和setinterval有哪些區(qū)別

    settimeout和setinterval有哪些區(qū)別? setTimeout和setInterval都是JavaScript中的定時器函數,用于在指定的時間間隔后執(zhí)行一段代碼。盡管它們在某些方面
    的頭像 發(fā)表于 12-09 14:32 ?1724次閱讀

    嵌入式C編碼中函數的規(guī)范

    ◎ 一個函數僅完成一件功能 ◎ 重復代碼應該盡可能提煉成函數。 說明:重復代碼提煉成函數可以帶來維護成本的降低。重復代碼是不良代碼最典型的特征之一。在“代碼能用就不改”的指導原則之下,
    的頭像 發(fā)表于 12-07 14:33 ?337次閱讀

    wps的vlookup函數的使用方法及實例

    WPS Office是一款功能全面的辦公軟件,其中的VLOOKUP函數在數據分析和處理中非常常用。在本文中,我們將詳細介紹WPS Office中VLOOKUP函數的使用方法,并提供一些實例來說明
    的頭像 發(fā)表于 12-01 10:58 ?3700次閱讀

    XLOOKUP函數怎么使用

    的語法和參數 XLOOKUP函數的語法如下: =XLOOKUP(要查找的值,查找范圍,返回范圍,[未找到值的返回結果],[查找方式],[搜索模式]) 參數說明如下: 要查找的值:表示你需要查找的值,在查找范圍中要匹配的值。 查找范圍:表示你要在哪個單元格范圍內進行查找。
    的頭像 發(fā)表于 12-01 10:54 ?2086次閱讀

    range()函數的用法是什么

    range()函數是Python中的內置函數,用于生成一個整數序列,可以用于循環(huán)或創(chuàng)建列表。 range()函數的基本語法是: range(start, stop, step) 參數說明
    的頭像 發(fā)表于 11-21 14:46 ?3692次閱讀

    append()和insert()函數區(qū)別

    在Python中, append() 和 insert() 是用于修改列表的兩個常用函數。這兩個函數的主要區(qū)別在于元素添加的位置和方式。 首先,讓我們來了解一下 append() 函數
    的頭像 發(fā)表于 11-21 14:44 ?2650次閱讀