当前位置: 首页 > news >正文

深入理解 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.dtcms.com/a/308900.html

相关文章:

  • React 路由守卫
  • 构型空间(Configuration Space,简称C-space)
  • 【计算机组成原理】第二章:数据的表示和运算(上)
  • Linux 系统管理-13-系统负载监控
  • 向日葵 远程控制软件下载及安装教程!
  • spring cloud ——gateway网关
  • 解决提示词痛点:用AI智能体自动检测矛盾、优化格式的完整方案
  • 数据结构:多项式求值(polynomial evaluation)
  • 【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step5—Nginx安装
  • 20250731在荣品的PRO-RK3566开发板的Android13下解决敦泰的FT8206触控芯片的只有4点触控功能
  • Redis过期策略
  • Apache RocketMQ 中 Topic 的概念、属性、行为约束和最佳实践
  • Docker 初学者需要了解的几个知识点 (五):建容器需要进一步了解的概念
  • 【生活系列】MBTI探索 16 种性格类型
  • C++入门自学Day3-- c++类与对象(赋值运算符与拷贝构造)
  • 【Linux】虚拟地址空间
  • 智能图书馆管理系统开发实战系列(三):前端工程化实践 - Electron + React + TypeScript
  • docker运行时目录/var/lib/docker 学习
  • 面试笔记【16:9区域问题】
  • diffusion原理和代码延伸笔记1——扩散桥,GOUB,UniDB
  • 如何提前识别项目风险?主要方法分享
  • MemoRizz:AI的“超级大脑”工具,实现持久记忆与上下文智能管理
  • 【智能体agent】入门之--2.2框架---autoGen
  • 第十三天:蛇形矩阵
  • SpringBoot3.x入门到精通系列:1.1 简介与新特性
  • 【网络安全】gcc和gdb是什么-GNU Compiler Collection和GNU Debugger?
  • 钢筋计数误差↓78%!陌讯多模态融合算法在建筑地产AI质检的落地实践
  • ACL 2024 大模型方向优秀论文:洞察NLP前沿​关键突破
  • window怎么安装pyqt6以及 安装 pythonqt6 会遇到的问题和怎么解决
  • Linux基础复习:字符输入与输出