色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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() 分配的內存上。

審核編輯:符乾江

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

    關注

    8

    文章

    3028

    瀏覽量

    74100
  • 函數
    +關注

    關注

    3

    文章

    4333

    瀏覽量

    62691
  • malloc
    +關注

    關注

    0

    文章

    52

    瀏覽量

    73
收藏 人收藏

    評論

    相關推薦

    stdio.h實現了printf函數?

    里面實現了 printf。 實際上并不是,這里就涉及了頭文件和庫的區別。 頭文件一般存放大家都要用的東西,比如函數的聲明,結構體的聲明,命名新的類型等等。 stdio.h 頭文件,里面也只是聲明了一下
    的頭像 發表于 12-18 10:28 ?145次閱讀

    同樣是函數,在C和C++中有什么區別

    同樣是函數,在 C 和 C++ 中有什么區別? 第一個返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++ 的函數,除了構造和析構這兩個特殊的
    的頭像 發表于 11-29 10:25 ?334次閱讀

    SUMIF函數與SUMIFS函數區別

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

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

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

    向IEEE機構申請MAC地址的申請流程

    所有設備在投入市場銷售使用前該臺設備都必須寫入MAC地址,以便設備后續使用的識別與安全性監控。而MAC地址的申請方法主要可以通過兩種渠道進行:直接向IEEE申請或通過國內的代理機構申請。以下是英利
    的頭像 發表于 09-29 17:52 ?345次閱讀
    向IEEE機構<b class='flag-5'>申請</b>MAC地址的<b class='flag-5'>申請</b>流程

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

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

    函數發生器、信號發生器和波形發生器的區別

    在電子測試和測量領域,函數發生器、信號發生器和波形發生器都是重要的測試儀器,它們各自具有獨特的功能和應用場景。本文將詳細介紹這三種發生器的原理、功能以及它們之間的區別
    的頭像 發表于 05-15 14:49 ?1614次閱讀

    函數發生器和示波器的區別

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

    IMEI號申請條件與申請周期指南

    在現代社會中,無線通信設備已經成為人們生活和工作的必備品,而IMEI號則是每個設備的唯一標識符。然而,要想讓您的設備在市場上合規上市,您需要了解IMEI號的申請條件以及申請周期,以便順利完成申請流程
    的頭像 發表于 04-22 17:18 ?732次閱讀
    IMEI號<b class='flag-5'>申請</b>條件與<b class='flag-5'>申請</b>周期指南

    請問stm32g0的range1 range2有什么區別

    哪里有關于Range1 Range2的區別說明?
    發表于 04-01 07:19

    函數指針與回調函數的應用實例

    通常我們說的指針變量是指向一個整型、字符型或數組等變量,而函數指針是指向函數函數指針可以像一般函數一樣,用于調用函數、傳遞參數。
    的頭像 發表于 03-07 11:13 ?408次閱讀
    <b class='flag-5'>函數</b>指針與回調<b class='flag-5'>函數</b>的應用實例

    函數發生器和信號發生器的區別和聯系

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

    函數發生器中的高阻輸出和50歐輸出的區別是什么

    高阻輸出和50歐輸出是函數發生器中常見的兩種輸出方式,它們在使用場景、電路設計及特性等方面存在一些區別。本文將詳細介紹這兩種輸出方式及其區別,內容會從以下幾個方面展開: 輸出特性和電路設計 使用場
    的頭像 發表于 02-23 15:56 ?4226次閱讀

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

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

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

    CCC認證的申請流程以及該類型產品的發證周期。以下是CCC認證申請流程的大致步驟:1.申請準備:準備好申請材料,包括申請表、產品
    的頭像 發表于 01-11 16:33 ?613次閱讀
    路由器CCC認證<b class='flag-5'>申請</b>流程,發證周期多長?
    主站蜘蛛池模板: 久久资源365| 暖暖高清视频免费| 扒开老师粉嫩的泬10P| 亚洲一级电影| 亚洲AV久久久久久久无码 | 国产精品久久毛片A片软件爽爽| 成人在线视频免费看| 成人无码在线超碰视频| 国模沟沟一区二区三区| 国产亚洲日韩欧美视频| 国产一区内射最近更新| 快播成电影人网址| 十大禁止安装的黄台有风险| 我半夜摸妺妺的奶C了她软件| 亚洲国产精品嫩草影院| 三级电影免费看| 偷窥欧美wc经典tv| 亚洲AV无码国产精品色午夜情| 607080老太太AW| qvod12| 灌饱娇嫩H将军公主最新章节| 久久精品一区| 男助理憋尿PLAY灌尿BL出去| 歪歪爽蜜臀AV久久精品人人槡| 永久免费的污视频网站| AV福利无码亚洲网站麻豆| 赤兔CHINESE最新男18GUY| 哒哒哒高清视频在线观看| 换脸国产AV一区二区三区| 麻豆精品人妻一区二区三区蜜桃| 欧美最猛12teevideos| 无人影院在线播放视频| 97成人碰碰在线人妻少妇| 第一次处破女18分钟免费| 久久偷拍人| 日韩亚洲国产中文字幕欧美| 亚洲AV成人无码999WWW| www.99在线| 久久中文字幕无线观看| 亚洲国产精品久久又爽黄A片| 白丝女仆被啪到深夜漫画|