深入理解 Slab / Buddy 分配器與 MMU 映射機制


📖 推薦閱讀:《Yocto項目實戰教程:高效定制嵌入式Linux系統》
🎥 更多學習視頻請關注 B 站:嵌入式Jerry


深入理解 Slab / Buddy 分配器與 MMU 映射機制

在現代 Linux 內核中,物理內存的管理和虛擬地址的映射是系統性能和資源調度的核心。本文將系統講解 Slab 分配器和 Buddy 分配器如何管理物理內存,并進一步分析 MMU 如何通過四級頁表將這些物理內存映射到虛擬地址空間。


在這里插入圖片描述

一、Buddy 分配器:以頁為單位的物理內存管理

Buddy 分配器是 Linux 核心的物理頁分配器,它以 2^n 頁為單位分配連續的內存塊,適合于大塊內存分配需求。

基本功能

  • 分配單位:1 頁 = 4KB (x86_64)
  • 支持 2^n 頁的分配(如 4KB, 8KB, 16KB, …, 1MB 等)
  • 重構形成 Buddy 對,便于合并和釋放

示例

請求 16KB 內存:

alloc_pages(GFP_KERNEL, 2)  // 2^2 = 4 頁 = 16KB

返回一個連續的 16KB 物理地址指針


二、Slab 分配器:對象級別的內存管理

Slab 分配器用于小塊內存分配,不能簡單通過 buddy 分配器分配不同顏色大小的內存塊。Slab 通常依賴于 buddy 分配器進行基礎頁分配,然后將頁內分割為小對象。

示例

kmalloc(64, GFP_KERNEL) // 分配 64 字節
  • slab 分配器會找到 64-byte 的 cache
  • 如果無空,則從 buddy 分配 1 頁 (4KB)
  • 切割為 64-byte * 64 個對象

三、MMU 與四級頁表映射機制

由于操作系統對多連續和線性虛擬內存的需求,需要通過四級頁表把虛擬地址 (VA) 映射成物理地址 (PA),用于 MMU 轉換。

四級頁表結構詳解(以 x86_64 為例)

頁表級別位數索引項數控制范圍
PGD(頂層)9512512 GB
PUD(上層)95121 GB
PMD(中間)95122 MB
PTE(底層)95124 KB
頁內偏移12-4 KB

48 位虛擬地址 = 9 + 9 + 9 + 9 + 12

四級頁表拆解結構圖:

|<----- 9 ---->|<---- 9 ---->|<---- 9 ---->|<---- 9 ---->|<-- 12 -->|
+--------------+-------------+-------------+-------------+----------+
| PGD Index    | PUD Index   | PMD Index   | PTE Index   | Offset   |
+--------------+-------------+-------------+-------------+----------+
  • PGD:Page Global Directory(頁全局目錄)
  • PUD:Page Upper Directory(頁上級目錄)
  • PMD:Page Middle Directory(頁中級目錄)
  • PTE:Page Table Entry(頁表項)
  • Offset:頁內偏移

四級頁表查找流程圖

graph TD;A[虛擬地址 (VA)] --> B[CR3 - PGD 基地址]B --> C[PGD 索引]C --> D[PUD 索引]D --> E[PMD 索引]E --> F[PTE 索引]F --> G[頁框號 + Offset 得到物理地址]

四級頁表轉換詳細步驟

  1. CR3 寄存器中保存 PGD(頁全局目錄)的物理地址。
  2. 取虛擬地址的高 9 位,找到 PGD 的索引項,得到下一級 PUD 的物理地址。
  3. 取虛擬地址次高 9 位,找到 PUD 的索引項,得到下一級 PMD 的物理地址。
  4. 再取 9 位,查找 PMD 的索引項,獲得 PTE 的物理地址。
  5. 最低的 9 位用于查找 PTE 表中的頁表項(含物理頁框號 PFN)。
  6. 最后的 12 位頁內偏移,加到物理頁框基地址上,形成最終物理地址。

示例:虛擬地址到物理地址

假設虛擬地址為:0x00007F12_3456789A

分解:

  • PGD 索引:[47:39] = 0x0F
  • PUD 索引:[38:30] = 0x3C
  • PMD 索引:[29:21] = 0x15
  • PTE 索引:[20:12] = 0x1A
  • Offset:[11:0] = 0x89A

假設每級查找后頁表物理地址分別如下:

  1. PGD[0x0F] -> PUD @ 0x00200000
  2. PUD[0x3C] -> PMD @ 0x00300000
  3. PMD[0x15] -> PTE @ 0x00400000
  4. PTE[0x1A] -> PFN = 0x00500000

最終物理地址:

0x00500000 + 0x89A = 0x0050089A
完整映射流程(結構示意圖):
graph TD;VA[虛擬地址 0x00007F12_3456789A]VA --> PGD[PGD[0x0F] @ 0x00100000]PGD --> PUD[PUD[0x3C] @ 0x00200000]PUD --> PMD[PMD[0x15] @ 0x00300000]PMD --> PTE[PTE[0x1A] @ 0x00400000]PTE --> PA[物理頁框 0x00500000]PA --> FINAL[最終物理地址 0x0050089A]

四、Slab/Buddy 分配與 MMU 映射的關系

  1. Buddy 分配器分配物理頁,供:

    • 用戶端虛擬內存(進程空間)
    • 內核空間內存(kmalloc/slab/cache)
    • 內核模塊、頁表、內核堆棧等
  2. Slab 分配器依賴 buddy 分配頁,將頁切割為對象,重用已分配物理內存塊

  3. MMU + 四級頁表完成虛擬地址空間到這些物理頁的映射。進程或內核訪問虛擬地址時,MMU 通過四級頁表找到實際物理頁,實現隔離、保護和高效內存訪問。


五、核心要點總結

  • Buddy / Slab 都分配物理內存,只不過粒度和用途不同
  • 虛擬地址通過四級頁表結構映射到物理地址,MMU 保證進程空間隔離和內存保護
  • 四級頁表結構的每一級都影響性能和內存消耗,實際 Linux 支持巨頁(1GB/2MB)減少多級查表

六、參考流程圖

graph TD;U[用戶/內核分配虛擬內存] --> K[Slab/Buddy 向內核申請物理頁]K --> MMU[MMU 建立虛擬到物理映射(四級頁表)]MMU --> X[進程/內核通過虛擬地址訪問數據]X --> MMU2[MMU 查頁表,定位物理地址]MMU2 --> RAM[物理內存訪問]


📖 推薦閱讀:《Yocto項目實戰教程:高效定制嵌入式Linux系統》
🎥 更多學習視頻請關注 B 站:嵌入式Jerry


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93760.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93760.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Layui核心語法快速入門指南

Layui 基本語法學習指南 Layui 是一個經典的模塊化前端框架&#xff0c;以其輕量易用、組件豐富著稱。以下是 Layui 的核心語法結構和使用方法&#xff1a; 一、模塊加載機制&#xff08;核心基礎&#xff09; // 標準模塊加載語法 layui.use([module1, module2], function()…

基于百度 iframe 框架與語音解析服務的數字人交互系統實現

在智能化交互場景中,數字人作為人機交互的重要載體,其語音交互能力與指令響應效率直接影響用戶體驗。本文將詳細介紹如何基于百度提供的 iframe 框架與語音解析服務,實現數字人語音播報、文字展示及指令響應的完整業務流程,涵蓋從插件初始化到實時語音交互的全鏈路實現邏輯…

高防服務器租用的優勢有哪些?

高防服務器具有著強大的防護能力&#xff0c;可以幫助企業抵御各種網絡攻擊&#xff0c;其中包括大規模的DDOS攻擊&#xff0c;高防服務器中還有著防火墻、流量清洗和負載均衡等多種安全技術&#xff0c;能夠保證業務持續穩定的運行&#xff0c;降低了企業整體的損失和安全風險…

7.28 進制交換|迭代器模式|map|子集按位或|帶參遞歸

lc701.二叉搜索樹插入void dfs不行TreeNode* dfs&#xff0c;帶接受參數處理的dfs當為空的時候&#xff0c;就可以添加插入if (!root){return new TreeNode(val);}插入位置root->left insertIntoBST(root->left, val);class Solution {public:TreeNode* insertIntoBST(T…

方法學習(二)

.一、變量作為實參使用&#xff1a;1.定義一個方法&#xff0c;比較兩個整數的大小&#xff0c;如果第一個整數比第二個整數大&#xff0c;返回true否則返回false。public static void main(String[] args) {int i 3;int j 5;//傳遞的是i和j&#xff0c;但是真正傳遞的是i和j…

計算機視覺CS231n學習(1)

面向視覺識別的卷積神經網絡 CS231n Introduction計算機視覺的歷史 the history of computer vision 重要節點&#xff1a;1959 Hubel & Wiesel 利用和人比較相像的貓的視覺神經做實驗&#xff1a;簡單細胞反應燈的位置&#xff1b;復雜細胞反應燈的位置和移動&#xff1b;…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博內容IP地圖可視化分析實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博內容IP地圖可視化分析實現 視頻在線地…

Z20K118庫中寄存器及其庫函數封裝-SYSCTRL庫

1. 系統設備識別寄存器(SCM)7個位域。 記錄設備信息。Z20K11x[FAM_ID:Z20K/Z20M,SUBF_ID:1/3,SER_ID:1/4]特征ID版本號FLASH存儲器大小封裝類型。1-1 SYSCTRL_DeviceId_t SYSCTRL_GetDeviceId(void)讀取設備信息。2.獨一ID號寄存器&#xff08;SCM&#xff09;4個該寄存器存儲完…

007TG洞察:波場TRON上市觀察,Web3流量工具的技術解析與應用

引言&#xff1a;波場TRON&#xff08;TRX&#xff09;登陸資本市場及近期加密市場熱點&#xff08;如MEME幣&#xff09;&#xff0c;凸顯了實時流量捕獲與轉化在Web3領域的戰略地位。對于技術團隊而言&#xff0c;構建支撐全球業務的Web3平臺&#xff0c;核心挑戰在于&#x…

STM32——HAL 庫MDK工程創建

總&#xff1a;STM32——學習總綱 參考工程&#xff1a; 實驗0-3&#xff0c;新建工程實驗-HAL庫版本 前置知識&#xff1a; STM32——HAL庫 一、HAL 庫 MDK工程新建步驟簡介 例&#xff1a; 各個文件夾內容&#xff1a; 1.1 Drivers 1.2 Middlewares 1.3 Output 1.4 Pro…

【圖像處理】霍夫變換:霍夫變換原理、霍夫空間、霍夫直線、霍夫圓詳解與代碼示例

霍夫變換詳解與代碼示例 霍夫變換&#xff08;Hough Transform&#xff09;是一種用于檢測圖像中幾何形狀&#xff08;如直線、圓&#xff09;的特征提取技術。其核心思想是將圖像空間中的點映射到參數空間&#xff08;霍夫空間&#xff09;&#xff0c;通過累積投票機制識別形…

Java WEB技術-序列化和反序列化認識(SpringBoot的Jackson序列化行為?如何打破序列化過程的駝峰規則?如何解決學序列化循環引用問題?)

一、什么是序列化和反序列化 在java項目中&#xff0c;對象序列化和反序列化通常用于對象的存儲或網絡傳輸等。如&#xff1a;服務端創建一個JSON對象&#xff0c;對象如何在網絡中進行傳輸呢&#xff1f;我們知道網絡傳輸的數據通常都是字節流的形式&#xff0c;對象想要在網絡…

【生活系列】MBTI探索 16 種性格類型

博客目錄一、MBTI 的四個核心維度1. 精力來源&#xff1a;外向&#xff08;E&#xff09;vs 內向&#xff08;I&#xff09;2. 信息獲取方式&#xff1a;感覺&#xff08;S&#xff09;vs 直覺&#xff08;N&#xff09;3. 決策方式&#xff1a;思考&#xff08;T&#xff09;v…

innovus在ccopt_design時設置update io latency

我正在「拾陸樓」和朋友們討論有趣的話題,你?起來吧? 拾陸樓知識星球入口 往期文章:

電腦出現英文字母開不了機怎么辦 原因與修復方法

當您按下電腦開機鍵&#xff0c;屏幕上卻只顯示一串串陌生的英文字母&#xff0c;無法正常進入系統時&#xff0c;這通常是電腦在向您“求救”。這種情況可能由多種原因引起&#xff0c;從外部設備沖突到系統文件損壞&#xff0c;都可能導致電腦無法啟動。不必過于焦慮&#xf…

CSS和XPATH選擇器對比

1、優缺點比較特性CSS選擇器XPath語法復雜度簡潔易讀較為復雜性能通常更快可能較慢向上遍歷不支持支持&#xff08;可選擇父元素&#xff09;文本內容選擇有限支持完全支持索引選擇支持&#xff08;:nth-child&#xff09;支持&#xff08;position()&#xff09;瀏覽器兼容性優…

libomxil-bellagio移植到OpenHarmony

當使用mesa3dcangh提供的amd顯卡驅動時&#xff0c;想利用 Mesa 提供的圖形硬件加速能力&#xff0c;來支持視頻編解碼操作時。需要依賴libomxil-bellagio庫&#xff0c;現在成果分享如下&#xff1a; 基礎知識 1.OpenHarmony中mesa3d amd顯卡驅動編譯 2.OpenHarmony中基于G…

uvm-tlm-sockets

TLM 2.0引入了套接字(Socket)機制&#xff0c;實現發起方(initiator)與目標方(target)組件間的異步雙向數據傳輸。套接字與端口(port)和導出(export)同源&#xff0c;均繼承自uvm_port_base基類。發起事務的組件使用發起方套接字(initiator socket)&#xff0c;稱為發起方&…

AI 如何評價股票:三七互娛(SZ:002555),巨人網絡(SZ:002558)

三七互娛&#xff08;SZ:002555&#xff09;作為國內領先的游戲公司&#xff0c;其股票表現需結合財務健康度、行業地位、戰略布局及潛在風險綜合評估。以下從多維度展開分析&#xff1a; 一、財務表現&#xff1a;增長乏力與高分紅并存營收與利潤雙降 2025年Q1營收42.43億元&a…

Vibe Coding:AI驅動開發的安全暗礁與防護體系

當OpenAI聯合創始人Andrej Karpathy在2025年初的推文里首次提及"Vibe Coding"時&#xff0c;這個概念迅速在開發者社區引發共鳴——它描繪了一種誘人的開發模式&#xff1a;開發者用自然語言描述需求&#xff0c;AI接管代碼生成、修改甚至調試&#xff0c;整個過程以…