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

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

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

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

Linux內(nèi)核大塊內(nèi)存申請(qǐng):從場(chǎng)景到落地全解析

jf_44130326 ? 來(lái)源:Linux1024 ? 2026-02-09 16:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、為什么需要大塊內(nèi)核內(nèi)存

先明確場(chǎng)景,避免盲目選擇分配方式:

1.DMA傳輸場(chǎng)景:網(wǎng)卡、硬盤(pán)等外設(shè)的DMA控制器,要求內(nèi)存物理地址連續(xù)(無(wú)法識(shí)別虛擬地址映射),且需一次性分配大尺寸緩沖區(qū)(如1GB網(wǎng)絡(luò)幀緩存)。

2.大型內(nèi)核緩存:文件系統(tǒng)(如EXT4)的索引緩存、數(shù)據(jù)庫(kù)內(nèi)核的內(nèi)存池,需要持續(xù)占用GB級(jí)內(nèi)存,且需虛擬地址連續(xù)(方便指針遍歷)。

3.虛擬化場(chǎng)景KVM虛擬機(jī)的內(nèi)存分配、容器運(yùn)行時(shí)的共享內(nèi)存,需為Guest OS分配大塊連續(xù)內(nèi)存,保障運(yùn)行性能。

4.高性能設(shè)備驅(qū)動(dòng)FPGAGPU等加速卡的驅(qū)動(dòng)程序,需分配大塊內(nèi)存用于數(shù)據(jù)批量傳輸,減少IO次數(shù)。

二、3種核心申請(qǐng)方法(附實(shí)操代碼)

Linux內(nèi)核提供3種大塊內(nèi)存分配接口,核心差異在于物理連續(xù)與否性能開(kāi)銷(xiāo),需按需選擇:

1. alloc_pages ():物理連續(xù),DMA首選

?核心特點(diǎn):分配2^order頁(yè)的物理連續(xù)內(nèi)存,返回struct page指針(需手動(dòng)轉(zhuǎn)換為虛擬地址),適合DMA、高性能IO等場(chǎng)景。

?關(guān)鍵參數(shù)

?gfp_mask:分配標(biāo)志(如GFP_KERNEL允許睡眠,GFP_ATOMIC不睡眠);

?order:分配階數(shù)(order=0→1頁(yè),order=1→2頁(yè),,order=10→1GB,最大order由內(nèi)核配置MAX_ORDER決定,默認(rèn)11→2GB)。

?示例代碼

#include#include// 分配1GB物理連續(xù)內(nèi)存(order=10,假設(shè)PAGE_SIZE=4KB)structpage*page =alloc_pages(GFP_KERNEL | __GFP_ZERO,10);if(!page) { pr_err("alloc_pages failedn"); return-ENOMEM;}// 轉(zhuǎn)換為虛擬地址(內(nèi)核虛擬地址=物理地址+PAGE_OFFSET)void*virt_addr =page_address(page);// 釋放內(nèi)存(必須與alloc_pages配對(duì))__free_pages(page,10);

2. __get_free_pages ()alloc_pages封裝,簡(jiǎn)化使用

?核心特點(diǎn)alloc_pages的封裝接口,直接返回虛擬地址(無(wú)需手動(dòng)轉(zhuǎn)換struct page),功能與alloc_pages完全一致,物理連續(xù)。

?示例代碼

// 分配512MB物理連續(xù)內(nèi)存(order=9,4KB*512=2GB?不:order=9→512頁(yè)=2GB?哦,4KB*512=2MB?糾正:4KB*2^9=4KB*512=2048KB=2MB;order=19才是2GB,需注意order計(jì)算)void*virt_addr = (void*)__get_free_pages(GFP_KERNEL | __GFP_ZERO,9);if(!virt_addr) { pr_err("__get_free_pages failedn"); return-ENOMEM;}// 釋放內(nèi)存(與free_pages配對(duì))free_pages((unsignedlong)virt_addr,9);

?注意:__get_free_pages是宏定義,本質(zhì)調(diào)用alloc_pages,僅簡(jiǎn)化地址轉(zhuǎn)換。

3. vmalloc ():虛擬連續(xù),物理離散

?核心特點(diǎn):分配虛擬地址連續(xù)、物理地址離散的大塊內(nèi)存,通過(guò)內(nèi)核頁(yè)表映射實(shí)現(xiàn),適合對(duì)物理連續(xù)性無(wú)要求、但需大尺寸內(nèi)存的場(chǎng)景(如內(nèi)核緩存、低訪(fǎng)問(wèn)頻率緩沖區(qū))。

?優(yōu)勢(shì):支持更大尺寸(理論無(wú)上限,受內(nèi)核虛擬地址空間限制),分配成功率高于物理連續(xù)方式。

?劣勢(shì):訪(fǎng)問(wèn)需經(jīng)過(guò)頁(yè)表轉(zhuǎn)換,性能比alloc_pages低(延遲高~20%),且不支持DMA。

?示例代碼

#include// 分配2GB虛擬連續(xù)內(nèi)存void*virt_addr =vmalloc(2*1024*1024*1024);if(!virt_addr) { pr_err("vmalloc failedn"); return-ENOMEM;}// 可選:初始化內(nèi)存(vmalloc不默認(rèn)清零)memset(virt_addr,0,2*1024*1024*1024);// 釋放內(nèi)存(必須用vfree,不能用kfree)vfree(virt_addr);

三、關(guān)鍵注意事項(xiàng)(避坑核心)

1.物理連續(xù)內(nèi)存稀缺性

?order越大,分配成功率越低(系統(tǒng)運(yùn)行越久,物理內(nèi)存越碎片化),建議盡量降低order(如拆分大內(nèi)存為多個(gè)小order分配)。

?避免在中斷上下文申請(qǐng)物理連續(xù)大塊內(nèi)存(GFP_ATOMIC不允許睡眠,無(wú)法等待內(nèi)存碎片整理)。

1.申請(qǐng)失敗必須處理

?大塊內(nèi)存分配失敗是常態(tài)(尤其物理連續(xù)方式),需返回錯(cuò)誤碼或降級(jí)處理(如改用vmalloc),不可直接使用NULL指針。

1.釋放接口必須配對(duì)

申請(qǐng)接口

釋放接口

錯(cuò)誤用法

alloc_pages()

__free_pages()

vfree ()釋放

__get_free_pages()

free_pages()

kfree ()釋放

vmalloc()

vfree()

free_pages ()釋放

1.性能與場(chǎng)景匹配

?高頻訪(fǎng)問(wèn)的大塊內(nèi)存(如DMA傳輸)用alloc_pages(物理連續(xù),無(wú)頁(yè)表轉(zhuǎn)換開(kāi)銷(xiāo));

?低頻訪(fǎng)問(wèn)的大內(nèi)存(如內(nèi)核日志緩存)用vmalloc(分配成功率高,不浪費(fèi)物理連續(xù)內(nèi)存)。

1.NUMA架構(gòu)優(yōu)化

?CPU節(jié)點(diǎn)服務(wù)器中,用alloc_pages_node(nid, gfp_mask, order)指定節(jié)點(diǎn)分配,避免跨節(jié)點(diǎn)訪(fǎng)問(wèn)(跨節(jié)點(diǎn)延遲是本地的2-3倍)。

1.內(nèi)存泄漏風(fēng)險(xiǎn)

?內(nèi)核內(nèi)存無(wú)GC機(jī)制,申請(qǐng)后必須在模塊卸載、設(shè)備注銷(xiāo)時(shí)釋放,建議用devres機(jī)制(如devm_alloc_pages)自動(dòng)釋放,減少泄漏風(fēng)險(xiǎn)。

四、申請(qǐng)流程可視化(流程圖)

wKgZO2kah4mAQRx5AAIA-CcgP7U613.png

五、知識(shí)腦圖(快速梳理)

wKgZO2kah4mAWfauAAFo4smqTtc557.jpg ?
聲明:本文內(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)注

    4

    文章

    1467

    瀏覽量

    42867
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

    219000
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3209

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Linux內(nèi)核內(nèi)存泄漏怎么辦

    Linux內(nèi)核開(kāi)發(fā)中,Kmemleak是一種用于檢測(cè)內(nèi)核內(nèi)存泄漏的工具。
    發(fā)表于 07-04 11:04 ?1305次閱讀

    Linux內(nèi)存相關(guān)知識(shí)科普

    Linux 內(nèi)核幾種內(nèi)存管理的方法,內(nèi)存使用場(chǎng)景以及內(nèi)存使用的那些坑。**
    發(fā)表于 07-25 14:43 ?1189次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b>相關(guān)知識(shí)科普

    Linux內(nèi)核內(nèi)存規(guī)整總結(jié)

    分配需求,如下圖所示: 內(nèi)存外部碎片導(dǎo)致實(shí)際占用物理頁(yè)不多,但是已無(wú)法申請(qǐng)>=4個(gè)頁(yè)連續(xù)內(nèi)存,理想當(dāng)中我們希望內(nèi)存沒(méi)有外部碎片,如下圖所示: 內(nèi)核
    的頭像 發(fā)表于 11-11 11:17 ?2318次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>內(nèi)存</b>規(guī)整總結(jié)

    Linux內(nèi)核內(nèi)存管理架構(gòu)解析

    內(nèi)存管理子系統(tǒng)可能是linux內(nèi)核中最為復(fù)雜的一個(gè)子系統(tǒng),其支持的功能需求眾多,如頁(yè)面映射、頁(yè)面分配、頁(yè)面回收、頁(yè)面交換、冷熱頁(yè)面、緊急頁(yè)面、頁(yè)面碎片管理、頁(yè)面緩存、頁(yè)面統(tǒng)計(jì)等,而且對(duì)性能也有很高
    的頭像 發(fā)表于 01-04 09:24 ?1944次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>內(nèi)存</b>管理架構(gòu)<b class='flag-5'>解析</b>

    Linux內(nèi)核地址映射模型與Linux內(nèi)核高端內(nèi)存詳解

    Linux 操作系統(tǒng)和驅(qū)動(dòng)程序運(yùn)行在內(nèi)核空間,應(yīng)用程序運(yùn)行在用戶(hù)空間,兩者不能簡(jiǎn)單地使用指針傳遞數(shù)據(jù),因?yàn)?b class='flag-5'>Linux使用的虛擬內(nèi)存機(jī)制,用戶(hù)空間的數(shù)據(jù)可能被換出,當(dāng)
    發(fā)表于 05-08 10:33 ?3812次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>地址映射模型與<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>高端<b class='flag-5'>內(nèi)存</b>詳解

    流程場(chǎng)景落地 在線(xiàn)測(cè)長(zhǎng)儀多方位部署 滿(mǎn)足各種檢測(cè)需求

    在鋼廠(chǎng),不同的位置都有長(zhǎng)度的檢測(cè)需求,如剪切位置、鋼坯位置、成品位置等,在不同的位置部署在線(xiàn)測(cè)長(zhǎng)儀,保證測(cè)量精度,提升產(chǎn)品品質(zhì)。 流程場(chǎng)景落地:這些環(huán)節(jié)“吃勁”,管控效果明顯 在線(xiàn)測(cè)長(zhǎng)儀在鋼鐵生產(chǎn)
    發(fā)表于 11-04 14:23

    Linux內(nèi)存系統(tǒng): Linux 內(nèi)存分配算法

    的大小· 它們的物理地址是連續(xù)的· 頁(yè)塊大小相同4、如何分配 4M 以上內(nèi)存?1) 為何限制大塊內(nèi)存分配· 分配的內(nèi)存越大, 失敗的可能性越大·
    發(fā)表于 08-24 07:44

    Linux內(nèi)存系統(tǒng):內(nèi)存使用場(chǎng)景

    指向的內(nèi)容 copy q,返回 q。并將 p 所指向的內(nèi)存空間刪除3、內(nèi)核態(tài)內(nèi)存分配函數(shù)函數(shù)分配原理最大內(nèi)存其他_get_free_p
    發(fā)表于 08-25 07:42

    嵌入式Linux驅(qū)動(dòng)內(nèi)存

    嵌入式Linux驅(qū)動(dòng)中申請(qǐng)連續(xù)大塊內(nèi)存完善中,未完待續(xù)。。
    發(fā)表于 12-17 07:09

    Linux內(nèi)核的相關(guān)資料推薦

    Linux內(nèi)核主要學(xué)習(xí)內(nèi)容可以分為三大塊:進(jìn)程、內(nèi)存及協(xié)議棧。今天就說(shuō)說(shuō)內(nèi)存泄露的問(wèn)題。相信你在平時(shí)的工作中,應(yīng)該遇到過(guò)下面這些
    發(fā)表于 01-14 08:55

    LINUX內(nèi)核中的內(nèi)存是如何進(jìn)行分配的

    必須申請(qǐng)大塊內(nèi)存時(shí)才使用,例如動(dòng)態(tài)插入模塊時(shí)。7、內(nèi)存分配標(biāo)志1、GFP_KERNEL:表示該次內(nèi)存 分配由
    發(fā)表于 11-04 14:46

    一文解析Linux內(nèi)存系統(tǒng)

    Linux 內(nèi)存是后臺(tái)開(kāi)發(fā)人員,需要深入了解的計(jì)算機(jī)資源。合理的使用內(nèi)存,有助于提升機(jī)器的性能和穩(wěn)定性。本文主要介紹Linux 內(nèi)存組織結(jié)構(gòu)
    的頭像 發(fā)表于 09-01 10:46 ?3074次閱讀
    一文<b class='flag-5'>解析</b><b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b>系統(tǒng)

    Linux內(nèi)核中用GFP_ATOMIC申請(qǐng)內(nèi)存意味著什么

    本文目的 本文補(bǔ)充校正一些Linux內(nèi)核開(kāi)發(fā)者關(guān)于GFP_ATOMIC的認(rèn)知不完整的地方,闡述GFP_ATOMIC與free內(nèi)存watermark的關(guān)系,并明確什么時(shí)候應(yīng)該用GFP_ATOMIC
    的頭像 發(fā)表于 01-04 13:43 ?3964次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>中用GFP_ATOMIC<b class='flag-5'>申請(qǐng)</b><b class='flag-5'>內(nèi)存</b>意味著什么

    Linux內(nèi)核源碼分析-進(jìn)程的哪些內(nèi)存類(lèi)型容易引起內(nèi)存泄漏?

    Linux內(nèi)核主要學(xué)習(xí)內(nèi)容可以分為三大塊:進(jìn)程、內(nèi)存及協(xié)議棧。今天就說(shuō)說(shuō)內(nèi)存泄露的問(wèn)題。相信你在平時(shí)的工作中,應(yīng)該遇到過(guò)下面這些
    發(fā)表于 01-14 13:02 ?6次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>源碼分析-進(jìn)程的哪些<b class='flag-5'>內(nèi)存</b>類(lèi)型容易引起<b class='flag-5'>內(nèi)存</b>泄漏?

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

    Linux 內(nèi)核中,內(nèi)存管理是整個(gè)系統(tǒng)穩(wěn)定運(yùn)行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機(jī)制,更是驅(qū)動(dòng)開(kāi)
    的頭像 發(fā)表于 02-10 16:58 ?3628次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)<b class='flag-5'>內(nèi)存</b><b class='flag-5'>申請(qǐng)</b>函數(shù)詳解:<b class='flag-5'>從</b>原理到實(shí)戰(zhàn)