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

相关推荐
Lonely 净土34 分钟前
Linux 运维文件写入操作
linux·运维·服务器·文件管理
吠品3 小时前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器
深念Y6 小时前
从 Windows 迁移到 Linux 开发环境的记录
linux·windows·链接·bun·ram·imdisk
知无不研7 小时前
Linux I/O复用之epoll
linux·服务器·epoll·socket编程
fb_123458 小时前
Linux运维封神|SELinux详解+CentOS7启动原理+Root密码重置+开机故障排查实战
linux·运维·服务器
苏宸啊8 小时前
linux网络编程udp服务器和客户端代码编写(echo版本和字典版本)
linux·网络
~|Bernard|8 小时前
Linux 定时任务(Cron)完整教程
linux·运维·服务器
小雪崩8 小时前
嵌入式学习 day25:哈希表及排序与查找
linux·c语言·数据结构·学习·排序算法
深念Y9 小时前
linux桌面快捷方式开关脚本编写中的几个常见坑
linux·运维·服务器·快捷方式·桌面·kde
奇树谦9 小时前
HDD 为什么适合顺序大文件读写:从 RAID 5 到 RAID 50 的原理与性能分析
linux·运维·网络