国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

申請函數kmalloc、kzalloc、vmalloc區別說明

Linux內核補給站 ? 來源:Linux內核補給站 ? 作者:Linux內核補給站 ? 2022-05-19 16:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

kmalloc()

函數原型:

void *kmalloc(size_t size, gfp_t flags);

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

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

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

GFP_KERNEL —— 正常分配內存;

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

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

對應的內存釋放函數為:

void vfree(const void *addr);

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

總結

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

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

內存以字節為單位進行分配;

所分配的內存虛擬地址上連續;

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

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

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

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

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

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

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

審核編輯:符乾江

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

    關注

    9

    文章

    3209

    瀏覽量

    76357
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67499
  • malloc
    +關注

    關注

    0

    文章

    53

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux內核伙伴系統內存申請函數詳解:從原理到實戰

    次分配粒度" 巧妙解決了外碎片問題,而我們申請內核內存的所有操作,最終都要通過伙伴系統提供的核心函數來完成。
    的頭像 發表于 02-10 16:58 ?3630次閱讀
    Linux內核伙伴系統內存<b class='flag-5'>申請</b><b class='flag-5'>函數</b>詳解:從原理到實戰

    函數信號發生器和任意波形信號發生器區別詳解

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

    函數指針介紹

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

    函數指針及指針函數區別

    !請看下面   指針函數:   當一個函數聲明其返回值為一個指針時,實際上就是返回一個地址給調用函數,以用于需要指針或地址的表達式中。   格式:   類型說明符 *
    發表于 12-12 06:34

    LUA例程-常用的回調函數使用說明

    詳細說明LUA腳本函數功能和對應的應用實例。對于LUA腳本編程有很大的幫助和提高技能。
    發表于 11-24 16:43 ?0次下載

    發布元服務配置隱私說明

    如果檢測到元服務中涉及獲取敏感隱私權限或者使用受限開放權限,需要填寫“應用隱私說明”。 注意 如果軟件包中聲明使用了受限開放權限,請確保創建的發布Profile也申請了對應權限,否則元服務審核時將會
    發表于 11-24 15:19

    如何為印度服務器申請和配置反向DNS記錄?

    恒訊科技為您提供為印度服務器申請和配置反向DNS(rDNS/PTR記錄)的完整指南。了解為何反向DNS對郵件送達率、網絡安全和服務器信譽至關重要,并遵循我們的分步說明,輕松完成從申請到驗證的全過程
    的頭像 發表于 10-28 10:12 ?619次閱讀

    ulog_tag_lvl_filter_set()函數無法實現按照文檔說明那樣實現按模塊過濾,怎么解決?

    ulog_tag_lvl_filter_set()函數無法實現按照文檔說明那樣實現按模塊過濾,比如過濾掉所有drv.xxx的日志
    發表于 10-10 07:30

    詳解hal_entry入口函數

    當使用RTOS時,程序從main函數開始進行線程調度;當沒有使用RTOS時,C語言程序的入口函數main函數調用了hal_entry函數。由于我們新建的工程是沒有選用RTOS的,因此,
    的頭像 發表于 07-25 15:34 ?1978次閱讀

    MSP430常用內聯函數說明

    電子發燒友網站提供《MSP430常用內聯函數說明.docx》資料免費下載
    發表于 06-05 17:20 ?0次下載

    函數指針的六個常見應用場景

    函數指針在嵌入式開發中有著廣泛的應用,它讓代碼更加靈活,減少冗余,提高可擴展性。很多時候,我們需要根據不同的情況動態調用不同的函數,而函數指針正是實現這一需求的重要工具。本文將介紹六個常見的
    的頭像 發表于 04-07 11:58 ?1474次閱讀
    <b class='flag-5'>函數</b>指針的六個常見應用場景

    詳解RTOS中的Hook函數

    Hook函數是RTOS中的一個關鍵特性,通過該函數,用戶可以增強對任務管理的控制,定義系統行為。
    的頭像 發表于 03-24 16:14 ?1077次閱讀

    解鎖TSMaster fifo函數:報文讀取的高效方法

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

    STM32H7 ADC_IRQHandler和ADC3_IRQHandler這兩個中斷入口函數在使用上有什么區別

    STM32H7,ADC_IRQHandler和ADC3_IRQHandler這兩個中斷入口函數在使用上有何區別
    發表于 03-11 07:28

    充電樁廠家申請CCC認證要準備哪些材料?

    充電樁廠家申請CCC證書需要準備哪些材料?充電樁CCC認證需要提交的資料分為產品技術文件和工廠質量體系文件兩大類。以下是全球通檢測整理的詳細資料清單及說明:一、產品技術文件1.認證申請書(實驗室提供
    的頭像 發表于 03-10 16:55 ?979次閱讀
    充電樁廠家<b class='flag-5'>申請</b>CCC認證要準備哪些材料?