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,它包含了内存分配与释放的主要逻辑。

相关推荐
小张同学a.24 分钟前
LAMP架构2
linux·运维·网络·架构·负载均衡
千河殇 多想和她26 分钟前
如何在Reaonix中使用CodeGraph以及CodeGraph效果实测经验分享
linux·运维·ubuntu
躺不平的理查德39 分钟前
CMAKE备忘录
linux·运维·服务器
面对疾风叭!哈撒给1 小时前
Linux ARM架构的docker和docker-compose离线安装
linux·docker·架构
阿虎儿1 小时前
Linux 下为局域网 IP(如 192.168.1.100)打造不受浏览器警告的自签名 SSL/TLS 证书
linux·安全·https
小王C语言2 小时前
虚拟机开机过程中关机,再次开机没有分配 IP
linux·网络·tcp/ip
薛定谔的悦2 小时前
光储系统 AEMS 模块的光伏控制模式设计
linux·能源·储能·bms
码农客栈3 小时前
U-Boot详解(三)之启动流程详解
linux·uboot
say_fall3 小时前
【Linux系统编程】文件操作基础:C标准库、系统调用、fd是什么和fd与FILE*的关系
android·linux·c语言
邪修king3 小时前
Re:Linux系统篇(六):动静态库 & 链接机制【完整透彻版】
linux·运维·服务器