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

相关推荐
AlfredZhao12 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346618 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪19 小时前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈2 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
凡人叶枫2 天前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
2601_961875242 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant