📖 推荐阅读:《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;整个过程以…