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

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

先明確場景,避免盲目選擇分配方式:

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

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

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

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

二、3種核心申請方法(附實操代碼)

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

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

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

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

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

?order:分配階數(shù)(order=0→1頁,order=1→2頁,,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配對)__free_pages(page,10);

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

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

?示例代碼

// 分配512MB物理連續(xù)內(nèi)存(order=9,4KB*512=2GB?不:order=9→512頁=2GB?哦,4KB*512=2MB?糾正:4KB*2^9=4KB*512=2048KB=2MB;order=19才是2GB,需注意order計算)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配對)free_pages((unsignedlong)virt_addr,9);

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

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

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

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

?劣勢:訪問需經(jīng)過頁表轉(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)鍵注意事項(避坑核心)

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

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

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

1.申請失敗必須處理

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

1.釋放接口必須配對

申請接口

釋放接口

錯誤用法

alloc_pages()

__free_pages()

vfree ()釋放

__get_free_pages()

free_pages()

kfree ()釋放

vmalloc()

vfree()

free_pages ()釋放

1.性能與場景匹配

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

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

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

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

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

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

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

wKgZO2kah4mAQRx5AAIA-CcgP7U613.png

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

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

    關(guān)注

    4

    文章

    1468

    瀏覽量

    42888
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11763

    瀏覽量

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

    關(guān)注

    9

    文章

    3211

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

    分配需求,如下圖所示: 內(nèi)存外部碎片導(dǎo)致實際占用物理頁不多,但是已無法申請>=4個頁連續(xù)內(nèi)存,理想當(dāng)中我們希望內(nèi)存沒有外部碎片,如下圖所示: 內(nèi)核
    的頭像 發(fā)表于 11-11 11:17 ?2332次閱讀
    <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ù)雜的一個子系統(tǒng),其支持的功能需求眾多,如頁面映射、頁面分配、頁面回收、頁面交換、冷熱頁面、緊急頁面、頁面碎片管理、頁面緩存、頁面統(tǒng)計等,而且對性能也有很高
    的頭像 發(fā)表于 01-04 09:24 ?1956次閱讀
    <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ū)動程序運(yùn)行在內(nèi)核空間,應(yīng)用程序運(yùn)行在用戶空間,兩者不能簡單地使用指針傳遞數(shù)據(jù),因為Linux使用的虛擬內(nèi)存機(jī)制,用戶空間的數(shù)據(jù)可能被換出,當(dāng)
    發(fā)表于 05-08 10:33 ?3815次閱讀
    <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ǎn)品品質(zhì)。 流程場景落地:這些環(huán)節(jié)“吃勁”,管控效果明顯 在線測長儀在鋼鐵生產(chǎn)
    發(fā)表于 11-04 14:23

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

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

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

    指向的內(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ū)動內(nèi)存

    嵌入式Linux驅(qū)動中申請連續(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é)議棧。今天就說說內(nèi)存泄露的問題。相信你在平時的工作中,應(yīng)該遇到過下面這些
    發(fā)表于 01-14 08:55

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

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

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

    Linux 內(nèi)存是后臺開發(fā)人員,需要深入了解的計算機(jī)資源。合理的使用內(nèi)存,有助于提升機(jī)器的性能和穩(wěn)定性。本文主要介紹Linux 內(nèi)存組織結(jié)構(gòu)
    的頭像 發(fā)表于 09-01 10:46 ?3082次閱讀
    一文<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申請內(nèi)存意味著什么

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

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

    Linux內(nèi)核主要學(xué)習(xí)內(nèi)容可以分為三大塊:進(jìn)程、內(nèi)存及協(xié)議棧。今天就說說內(nèi)存泄露的問題。相信你在平時的工作中,應(yīng)該遇到過下面這些
    發(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>類型容易引起<b class='flag-5'>內(nèi)存</b>泄漏?

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

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