36 内存生命周期与塑造它的角色
# 36 内存生命周期与塑造它的角色
在Linux内核中,内存通过一系列构成生命周期的职责进行管理。这些角色(请求者、分配器、访问者、所有者、释放器等)并非显式声明,而是通过函数、结构和约定来体现。
这个过程始于内核子系统(如文件系统、网络栈或驱动程序)使用kmalloc、vmalloc或alloc_pages请求内存,这是请求者的角色。
分配器(主要在mm/中实现,由slab、slub、buddy或vmalloc支持)选择一个内存区域,更新struct page或struct folio中的元数据,并返回一个指针。它授予访问权,但不跟踪内存的使用方式或时间。
访问者使用该内存存储内核结构、缓冲区或状态,这需要精确操作。诸如越界访问或释放后使用等错误并非源于分配,而是源于误用。
所有权通过引用计数或RCU跟踪。像sk_buff、inode和net_device这样的结构管理自身的生命周期,当引用数降至零时,该内存就有资格释放。
释放器使用kfree、vfree或__free_pages释放内存,将其返回给分配器。分配器可能将其合并到空闲列表或应用中毒模式,但不验证正确性,这仍是所有者的责任。
误用由KASAN、page_owner和kmemleak等跟踪器捕获,它们暴露释放后使用、跟踪分配位置并报告泄漏。这些工具支持开发,但不属于核心内存路径。
诸如ftrace、perf和eBPF等观察者监控时间、频率和分配行为,它们提供洞察而不影响逻辑。
访问控制由SELinux、AppArmor和cgroups执行,它们在分配前评估凭证并应用策略,其角色是执行约束,而非直接管理内存。
在压力下,内核调用回收器(kswapd、收缩器和OOM逻辑)从缓存和匿名页面回收内存,这些操作独立于原始分配器运行。
页面也可能被迁移器移动以进行压缩、大分配或NUMA平衡,这些操作在保留数据的同时更新映射。
在硬件边界,内存管理单元(MMU)维护页表并执行权限,错误在硬件中隔离无效访问。
尽管此逻辑的大部分位于mm/中,但没有单个模块管理整个生命周期,每项职责由内核的不同部分处理。内存安全不是通过中央监督来维护的,而是通过一致的边界和协调来维护的。
内核中的内存流经函数和结构,而非声明。这些角色未被命名但真实存在,通过设计执行并通过纪律维护。