Linux 内核内存管理子系统全面解析与体系构建

一、前言: 为什么内存管理是核心知识

内存管理是 Linux 内核最核心也最复杂的子系统之一,其作用包括:

  • 为软件提供独立的虚拟内存空间,实现安全隔离
  • 分配/回收物理内存资源,维持系统稳定
  • 支持不同类型的内存分配器,最优化性能
  • 应对内存压力,培育回收策略,防止系统 OOM

对于 Linux 内核/嵌入式/系统级程序员而言,熟悉内存管理系统是基础能力。


在这里插入图片描述

二、全局观察:内存管理子系统结构

纵向分层:内存管理三大场景

分层功能关键组件
地址转换机制虚拟地址 → 物理地址MMU, 分段+分页, TLB
物理页级管理分配和回收物理页struct page, zone, buddy
内核对象分配提供高效率小内存块分配SLAB/SLUB, kmalloc, vmalloc

横向分模块:实际功能分布

  • 虚拟内存管理 (VMM)
  • 分页/页表机制
  • 物理内存分配器 (Buddy System)
  • 内核小对象分配器 (SLAB)
  • 页面回收与 swap 机制

三、核心模块分析

1. 分段 + 分页:地址转换的基石

  • 分段(Segmentation):只在 x86 有效,Linux 采用 flat model,基本忽略
  • 分页(Paging):进程地址分成页,用页表维护,支持缺页中断、TLB、COW、hugetlb

2. 物理内存管理:Buddy System

  • 分配 granularity :页(page)
  • 划分为 zone(DMA/Normal/HighMem)
  • 通过 free_area 链表管理 2^n 大小页块
  • 分裂与合并策略,避免碎片

3. SLAB 分配器:小对象高效分配

  • 构成:cache 结构,内部 slab,实际物理 page
  • 分配路径:kmalloc → kmem_cache_alloc → slab 内分配
  • 支持 slab 装慎化 (object constructor), 并免别重复初始化
  • SLUB 是高性能环境下默认分配器

4. 页面回收 & Swap

  • 回收模型:后台线程 kswapd + 前端直接回收 direct reclaim
  • 培育 LRU 列表:active/inactive 分类,区分文件页和匿名页
  • swap 把匿名页写入 swap 分区,重新读取时产生 swapin
  • zswap/zram 提供内存压缩缓存,降低 swap IO
  • OOM Killer 根据计算的 score 选择被杀死程序

四、怎样建立自己的学习体系

1. 给自己定位和目标

  • 对内核加载/进程场景关注:先看 VMM + Buddy
  • 对性能有需求:深挑 SLAB/回收

2. 系统学习路线

  1. 了解 Linux 虚拟内存分配 (mm_struct / vma)
  2. 缺页处理流程 (do_page_fault -> handle_mm_fault)
  3. 页表结构 PGD → PTE 分析
  4. Buddy 分配器:alloc_pages()
  5. kmalloc 分配路径
  6. swap / reclaim 进阶分析

3. 配合实操 + 清单

  • 观看 /proc/meminfo /proc/slabinfo
  • 使用 kmemleak / slabtop 进行分析
  • 用 GDB/QEMU 追踪页表处理
  • 建立一份居住的进度清单 + 思维图

五、面试角度应对模型

面试常见问题

问题基本回答思路
Linux 是否使用分段?采用 Flat Model,没有分段隔离
Buddy 如何合并或分裂页块?2^n 分裂,同级 Buddy 合并
SLAB 和 Buddy 关系?SLAB 依赖 Buddy 分配整页,内部再分裂
kmalloc 与 vmalloc 区别kmalloc 返回连续物理内存,vmalloc 是虚拟连续
swap 与 zswap 差别swap 是硬盘 IO,zswap 是 RAM 压缩
OOM 如何选择杀死进程oom_score, memory usage, badness 算法

面试要点分析

  • 是否掌握核心数据结构 (page/mm_struct/slab cache)
  • 是否知道基本处理流程 (缺页、oom、swap)
  • 能否用简洁词说清楚动画软件设计者的同理

六、总结:架设体系解阶式学习

  1. 总观基本组成:分段,分页,物理,SLAB,swap
  2. 接通内核组件:形成动态场景连接
  3. 配合清单、思维图、代码进阶
  4. 最后进入一些特殊场景:NUMA、缓存分析、优化相关

这是一份基于概念 + 结构 + 应用性问题的学习根基,也是深入 Linux Kernel 必经之路。

如果需要,我可以继续给出“面向面试”的项目化问题和标准答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鼠标的拖动效果

1、变量的设置 let isDragging false; let startX; let startY; let endX; let endY; let box null;isDragging : 表示是否推拽startX、startY:表示起始坐标,相对于元素endX、endY:表示结束坐标,相对于元素box&…

SwaggerFuzzer:一款自动化 OpenAPI/Swagger 接口未授权访问测试工具

SwaggerFuzzer 🌐 一款自动化 OpenAPI/Swagger 接口未授权访问测试工具🚀 工具介绍:SwaggerFuzzer✨ 核心功能亮点🚀 快速使用🧰 支持参数 📌 项目结构📥 获取与下载 🌐 一款自动化 …

文献阅读:Exploring Autoencoder-based Error-bounded Compression for Scientific Data

目录 论文简介动机:为什么作者想要解决这个问题?贡献:作者在这篇论文中完成了什么工作(创新点)?规划:他们如何完成工作?离线训练阶段:在线压缩阶段 理由:通过什么实验验证它们的工作…

【业务框架】3C-相机-Cinemachine

概述 插件,做相机需求,等于相机老师傅多年经验总结的工具 Feature Transform:略Control Camera:控制相机参数Noise:增加随机性Blend:CameraBrain的混合列表指定一个虚拟相机到另一个相机的过渡&#xff…

设计一个算法:删除非空单链表L中结点值为x的第一个结点的前驱结点

目录 单链表的存储结构定义如下 快慢指针法 三指针法版本① 三指针法版本② 单链表的存储结构定义如下 typedef struct{Elemtype data;struct Node* next; }LNode,*LinkList; 快慢指针法 void deleteprex(LinkList L, Elemtype e) {if (L NULL || L->next NULL ||…

【Qt】:设置新建类模板

完整的头文件模板 #ifndef %FILENAME%_H #define %FILENAME%_H/*** brief The %CLASSNAME% class* author %USER%* date %DATE%*/ class %CLASSNAME% { public:%CLASSNAME%();~%CLASSNAME%();// 禁止拷贝构造和赋值%CLASSNAME%(const %CLASSNAME%&) delete;%CLASSNAME%&a…

​**​CID字体​**​ 和 ​**​Simple字体​**​

在PDF中,字体类型主要分为 ​​CID字体​​ 和 ​​Simple字体​​ 两大类,它们的主要区别在于编码方式和适用场景。以下是它们的详细对比: ​​1. CID字体(CID-keyed Fonts)​​ CID(Character Identifie…

计组_导学

2025.05.31:老汤讲408计组学习笔记 导学 第1章计算机系统概述:对计算机系统有全局的认识第2章总线系统:简单且独立,不会依赖其他内容,它是被依赖的第3章主存储器:只有了解主存储器的内部结构,才能理解在主存中是如何存储二进制的第4章数据的表示与运算:各种编码以及计算…

【GPT模型训练】第二课:张量与秩:从数学本质到深度学习的基础概念解析

这里写自定义目录标题 张量(Tensor)的定义关键特点:示例: 张量的秩(Rank)示例:“秩”的拼音常见混淆点 总结 张量(Tensor)的定义 在数学和物理学中,张量是一…

RabbitMQ work模型

Work 模型是 RabbitMQ 最基础的消息处理模式,核心思想是 ​​多个消费者竞争消费同一个队列中的消息​​,适用于任务分发和负载均衡场景。同一个消息只会被一个消费者处理。 当一个消息队列绑定了多个消费者,每个消息消费的个数都是平摊的&a…

【Linux操作系统】基础开发工具(yum、vim、gcc/g++)

文章目录 Linux软件包管理器 - yumLinux下的三种安装方式什么是软件包认识Yum与RPMyum常用指令更新软件安装与卸载查找与搜索清理缓存与重建元数据 yum源更新1. 备份现有的 yum 源配置2. 下载新的 repo 文件3. 清理并重建缓存 Linux编辑器 - vim启动vimVim 的三种主要模式常用操…

73常用控件_QFormLayout的使用

目录 代码⽰例: 使⽤ QFormLayout 创建表单. 除了上述的布局管理器之外, Qt 还提供了 QFormLayout , 属于是 QGridLayout 的特殊情况, 专 ⻔⽤于实现两列表单的布局. 这种表单布局多⽤于让⽤⼾填写信息的场景. 左侧列为提⽰, 右侧列为输⼊框 代码⽰例: 使⽤ QFormLayout 创…

兰亭妙微 | 医疗软件的界面设计能有多专业?

从医疗影像系统到手术机器人控制界面,从便携式病原体检测设备到多平台协同操作系统,兰亭妙微为众多医疗设备研发企业,打造了兼具专业性与可用性的交互界面方案。 我们不仅做设计,更深入理解医疗场景的实际需求: 对精…

鸿蒙开发修改版本几个步骤

鸿蒙开发修改版本几个步骤 比如:5.0.4(16)版本改为5.0.2(14)版本 一、项目下的build-profile.json5 "products": [{"name": "default","signingConfig": "default&qu…

Flask 基础与实战概述

一、Flask 基础知识 什么是 Flask? Flask 是一个基于 Python 的轻量级 Web 框架(微框架)。 特点:核心代码简洁,给予开发者更多选择空间。 与 Django 对比: Django 创建空项目生成多个文件,Flask 仅需一个文件即可实现简单应用(如 "Hello, World!")。 Flask …

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…

Java严格模式withResolverStyle解析日期错误及解决方案

在Java中使用DateTimeFormatter并启用严格模式(ResolverStyle.STRICT)时,解析日期字符串"2025-06-01"报错的根本原因是:模式字符串中的年份格式yyyy被解释为YearOfEra(纪元年份),而非…

Java中的泛型底层是怎样的

Java 泛型深入底层原理解析:类型擦除与桥方法的真相 一、Java中的伪泛型 Java 从 JDK 1.5 引入泛型之后,大大提升了代码的类型安全性与可读性。但泛型的底层实现并不像 C 的模板机制那样是“真正的泛型”,Java 的泛型是伪泛型,在…

Spring Boot 从Socket 到Netty网络编程(上):SOCKET 基本开发(BIO)与改进(NIO)

前言 无论是软件还是硬件的本质都是要解决IO问题(输入、输出),再说回网络编程本质上都是基于TCP/UP的开发,socket是在此基础上做的扩展与封装,而Netty又是对socket做的封装。本文旨在通过相关案例对socket进行探讨。 一…