ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

page_alloc __free_pages_core

page_alloc __free_pages_core __free_pages_core()是内存初始化阶段的核心释放函数负责将引导内存boot memory和延迟初始化deferred init的内存页归还给伙伴系统。核心作用与背景它的主要职责是在系统启动早期将memblock管理的内存页释放给伙伴分配器使其成为可用的空闲内存。与常规的__free_pages_ok()不同它需要处理内存初始化上下文meminit_context带来的特殊语义。参数解析参数含义page页块首页order页块阶数context内存初始化上下文MEMINIT_EARLY或MEMINIT_HOTPLUG关键流程1. 页块迁移类型设置在释放之前如果页块按 pageblock 对齐pageblock_aligned会调用set_pageblock_migratetype()将其标记为MIGRATE_MOVABLE。这样做的目的是在启动时强制内核分配保留自己的块避免不可移动的内核分配在启动过程中散布到整个地址空间从而减少碎片。2. 调用__free_pages_ok()最终委托给__free_pages_ok()执行实际的释放操作将页块加入伙伴系统的空闲链表。调用场景__free_pages_core()主要在以下路径中被调用memblock_free_all()→free_low_memory_core_early()系统启动时释放所有低端内存。deferred_free_range()在CONFIG_DEFERRED_STRUCT_PAGE_INIT启用时延迟初始化线程批量释放内存页对于对齐的 pageblock 会调用__free_pages_core(page, pageblock_order)。memblock_free_late()释放保留内存区域修复了延迟初始化下页面永久保留的问题。与MEMINIT_HOTPLUG的交互context参数区分了内存初始化的来源MEMINIT_EARLY启动早期初始化内存映射中可能存在空洞需要检查pfn有效性。MEMINIT_HOTPLUG内存热插拔路径页面需要被标记为PageReserved等待后续 online 阶段处理。总结__free_pages_core()是内存初始化阶段的释放守门人它根据上下文设置页块迁移类型然后调用__free_pages_ok()将引导内存和延迟初始化内存归还给伙伴系统。它的存在确保了系统启动时内存的有序释放同时为后续的内存管理如反碎片、热插拔奠定了正确的初始状态。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进