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

相关推荐
大侠归来2 分钟前
cJSON 源码解析:parse_string 函数深入剖析
linux·网络·算法
小小、码农4 分钟前
〖Linux进程间通信〗IPC全家桶:匿名管道、FIFO、共享内存、消息队列与信号量一篇打通
linux·运维·服务器
阳光九叶草LXGZXJ6 分钟前
达梦数据库-学习-67-SSL加密认证
linux·运维·数据库·sql·学习·ssl
0+11139 分钟前
Linux --应用层自定义协议与序列化
linux·运维·服务器·网络·tcp
dyxal43 分钟前
Linux Crontab 防重复执行利器:flock 文件锁实战详解(脱敏版)
linux·运维·服务器
niuTaylor44 分钟前
RK3568 Linux SDK 详解:SDK 是什么、板级差异与完整构建流程
linux·运维·服务器
拾贰_C1 小时前
【Ubuntu | port】Linux进程端口号冲突问题解决
linux·运维·ubuntu
0+1111 小时前
Linux --读者写者问题、读写锁与自旋锁
linux
谷哥的小弟1 小时前
CentOS寿终正寝
linux·运维·centos
醇氧1 小时前
nohup 后台启动 uvicorn(仅测试 / 临时运行)
linux·运维·网络·python·python3.11