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

linux-内核结构体

vma结构体定义在include/linux/mm_types.h中。
每一段(比如代码段、堆、栈)都由一个vma结构体来描述。
它记录了这段内存的起止地址、权限(读写执行)以及背后的存储介质(是匿名内存还是映射了文件)。
权限隔离:代码段需要“可读可执行但不可写”(防止代码被篡改),堆栈段需要“可读可写但不可执行”(防止代码注入攻击)。VMA 通过 vm_flags 精确控制这些权限。
按需分配
映射管理
通过Linux的proc文件系统直观地看到一个进程的VMA布局:
cat /proc/<PID>/maps


mm_struct 的定义位于 include/linux/mm_types.h
进程内存描述符mm_struct
mm_struct是Linux 内核中用于描述进程整个虚拟地址空间的核心数据结构。
每个拥有独立地址空间的进程(即用户态进程)都有一个 mm_struct,它被挂载在进程的 task_struct 中。
mm_struct的核心作用是管理进程从0到TASK_SIZE(用户空间上限)的整个虚拟内存布局。
它负责:
组织 VMA:管理所有 vm_area_struct,描述代码段、数据段、堆、栈等区域。
管理页表:持有进程的页全局目录(PGD)指针,这是虚拟地址到物理地址转换的起点。
pgd: 指向页全局目录(Page Global Directory)的指针。当进程被调度到CPU 上运行时,内核会将这个pgd的值加载到CPU的页表基址寄存器(如x86的 CR3)中,从而完成地址空间的切换。
统计信息:记录进程的内存使用量(如驻留集大小 RSS)。
同步控制:提供锁机制,确保多线程环境下对内存布局的并发访问是安全的。

内核线程(如 kthreadd)没有用户态地址空间,因此其 task_struct->mm 指针为 NULL。


task_struct
task_struct 对象是通过内核的 Slab 分配器(或 SLUB/SLOB)进行分配的。
Slab 分配的内存位于内核虚拟地址空间中。用户空间程序运行在用户虚拟地址空间,两者是隔离的。
Slab 分配器服务的对象主要分为两大类:专用内核对象和通用内存块。
专用内核对象(特定数据结构)
这是 Slab 分配器最核心的用途。内核为每种频繁使用的核心数据结构创建一个专属的缓存(Cache),专门用于生产该类型的对象。
进程管理相关
task_struct:这是最典型的例子。进程描述符是内核中最频繁分配和释放的对象之一(每次 fork 或 exit 都会涉及)。Slab 为它维护了一个专用缓存(如 task_struct),确保进程创建和销毁极快。
cred:用于存储进程的安全凭证(如 UID、GID)。
vm_area_struct:用于描述进程的虚拟内存区域(VMA)。
文件系统相关
inode:索引节点,代表文件系统中的文件元数据。
dentry:目录项,用于缓存文件路径,加速路径查找。
file / filp:表示打开的文件对象。
网络协议栈相关
sk_buff:网络套接字缓冲区,用于在网络层传输数据包。由于网络包处理极其频繁,Slab 对它的性能至关重要。
sock:套接字结构体。
内存管理相关
mm_struct:内存描述符,描述进程的整个地址空间。


伙伴系统(Buddy System)
伙伴系统就是 Linux物理内存的“大管家”。它通过“二分法分裂”来满足分配请求,通过“自动合并”来回收碎片。它不直接处理字节级的分配,而是以页(Page)为单位,为上层(如Slab)提供连续的物理内存块。
Linux 内核伙伴系统(Buddy System)的核心代码主要位于内核源码树的 mm/ 目录下。
最核心的文件是 mm/page_alloc.c,它包含了内存分配与释放的主要逻辑。

http://www.jsqmd.com/news/619066/

相关文章:

  • BepInEx快速入门三部曲:3分钟掌握Unity游戏插件注入终极教程
  • 人脸识别静电测试方案|车间ESD门禁联动、调试及故障排查
  • 模拟量采集模块:多点位同步采样,数据一致性更高
  • 2026年软件测试黄金证书全解析:赋能职业进阶的核心认证体系
  • 你的Windows 11为什么越用越慢?可能是这些“隐形负担“在作祟
  • 没钱没设备?STM32入门不用买板!纯仿真0成本学习攻略|系列第1篇
  • 从能用到性能: gcsfuse 中`CreateEmptyFile` 配置项的设计演进分析颇
  • 模拟量采集模块:农机作业监测,传感信号稳定采集
  • MIKEURBAN前处理—JPG格式下垫面数据矢量化
  • Java生产者消费者模式实战解析
  • 内涵:文本识别论文CRNN
  • 保姆级避坑指南:在Ubuntu 20.04 + ROS Noetic下,用PX4和Gazebo给Livox Mid360雷达跑通Faster-LIO建图仿真
  • translategemma-27b-it效果展示:中文合同关键条款图→英文法律术语精准映射
  • GenomicSEM实战指南:从GWAS摘要数据到复杂遗传模型的完整解析
  • OpenClaw语音交互:Qwen3-14B实现本地语音指令识别
  • 如何一键智能优化浏览器字体渲染:告别模糊文字,享受Mac级阅读体验
  • AI原生研发不是“加AI”,而是重写研发契约(附百度文心、讯飞星火、通义千问团队签署的《AI-Native开发宪章》核心条款)
  • Redis持久化:从AOF到RDB,如何实现数据不丢失?偬
  • .NET 诊断技巧 | 日志框架原理、手写日志框架学习赡
  • STM32H7实战指南:Cache配置与性能调优
  • 如何快速获取百度网盘提取码:开源工具的终极实战指南
  • 如何通过Win11Debloat实现Windows 11终极优化:完整指南与实战技巧
  • 测试左移×AI原生×实时反馈:2026奇点大会验证的“零缺陷交付”新公式——含GitHub Star超1.2k的开源工具链实测对比
  • Allegro 23.1 快速放置报错?手把手教你用DB Doctor批量更新旧版封装(附脚本)
  • coze
  • 在超大数据集下 DuckDB 与 MySQL 查询速度对比匝
  • MongoDB(90)如何使用Mongoose进行ORM操作?
  • Linux部署DVWA实战:从Access Denied到数据库用户权限全解析
  • Java面试题47:一文深入了解Nginx
  • Python Scrcpy Client实战解析:构建高效的Android设备远程控制方案