linux-内核结构体
vma结构体定义在include/linux/mm_types.h中。每一段比如代码段、堆、栈都由一个vma结构体来描述。它记录了这段内存的起止地址、权限读写执行以及背后的存储介质是匿名内存还是映射了文件。权限隔离代码段需要“可读可执行但不可写”防止代码被篡改堆栈段需要“可读可写但不可执行”防止代码注入攻击。VMA 通过 vm_flags 精确控制这些权限。按需分配映射管理通过Linux的proc文件系统直观地看到一个进程的VMA布局cat /proc/PID/mapsmm_struct 的定义位于 include/linux/mm_types.h进程内存描述符mm_structmm_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_structtask_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它包含了内存分配与释放的主要逻辑。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2503458.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!