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

相关推荐
吠品40 分钟前
高性能JS数组操作:何时选用push、unshift、splice或扩展运算符?
linux·服务器·数据库
fish_xk1 小时前
Linux中的指令和权限
linux·运维·服务器
暴力求解1 小时前
Linux---内核态
linux·运维·服务器
mounter6251 小时前
深入理解 Linux 网络新特性:netkit 中的 RX/TX Queue Leasing 与 TCP Devmem
linux·服务器·网络·tcp/ip·kernel
dvjr cloi2 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos
zhouwy1132 小时前
Linux系统管理命令大全
linux·运维
zhangrelay2 小时前
三分钟云课实践速通--单片机原理与应用--Arduino--SimulIDE--
linux·单片机·嵌入式硬件·学习·ubuntu
zzzyyy5382 小时前
Linux之缓冲区
linux·运维·服务器
hwscom2 小时前
Linux服务器如何进行安全加固,防止黑客攻击(Windows也适用)
linux·服务器·安全
lzh200409193 小时前
Linux管道(Pipe)深度指南:从原理到实战
linux·c++