page_alloc free_reserved_page

发布时间:2026/10/18 6:05:38
page_alloc free_reserved_page free_reserved_page()是内核中用于释放单个保留页reserved page的底层函数。它是free_reserved_area()的核心执行单元负责把一页从“保留”状态转为“可分配”状态并归还给伙伴系统。核心实现void free_reserved_page(struct page *page) { ClearPageReserved(page); init_page_count(page); page_mapcount_reset(page); page-mapping NULL; adjust_managed_page_count(page, 1); __free_reserved_page(page); } EXPORT_SYMBOL(free_reserved_page);逐步解析1. 清除PageReserved标志ClearPageReserved(page);PG_reserved标志表示该页不参与常规内存管理——不能被分配、回收或迁移。保留页如内核镜像、initrd、设备内存都带这个标志。清除它意味着这页现在可以进入伙伴系统了。2. 初始化引用计数init_page_count(page);把页的引用计数设为 1。这是页进入伙伴系统前的必要状态——伙伴系统要求空闲页的引用计数为 1表示“仅被 buddy 引用”。3. 重置映射计数和 mappingpage_mapcount_reset(page); page-mapping NULL;page_mapcount_reset()把_mapcount重置为 -1表示未被任何页表映射。page-mapping NULL清除可能残留的 address_space 关联。这两步确保页没有遗留的映射状态否则free_pages_prepare()的校验会失败。4. 调整管理页计数adjust_managed_page_count(page, 1);前面讲过的adjust_managed_page_count()把该页计入 zone 的managed_pages同时更新totalram_pages和可能的totalhigh_pages。这是关键一步——保留页原本不计入managed_pages释放后必须加入否则水位计算、lowmem reserve 等会失准。5. 归还伙伴系统__free_reserved_page(page);实际把页释放给伙伴系统。这个内部函数通常做static inline void __free_reserved_page(struct page *page) { __free_page(page); /* 或 free_frozen_pages */ }即调用__free_page()等价于__free_pages(page, 0)把页作为 order-0 释放。与free_reserved_area()的关系free_reserved_area(start, end, poison, s) └── for each page in range: ├── (可选) memset 毒化 └── free_reserved_page(page) // ← 这里 ├── ClearPageReserved ├── init_page_count ├── page_mapcount_reset ├── page-mapping NULL ├── adjust_managed_page_count(page, 1) └── __free_reserved_page(page)free_reserved_area()负责遍历范围、对齐、毒化、打印日志free_reserved_page()负责单页的状态转换和释放。为什么需要这么复杂保留页和普通页的“生命周期起点”不同状态保留页普通空闲页PG_reserved置位清除引用计数0 或特殊值1仅 buddy 引用_mapcount可能残留-1mapping可能非 NULLNULL计入managed_pages否是直接调用__free_page()会因为这些状态不一致而触发bad_page()或破坏伙伴系统。free_reserved_page()逐项修正这些状态确保页“干净”地进入伙伴系统。典型使用场景1.free_reserved_area()的循环体释放__init段、initrd、设备保留内存等。2. 驱动释放预留内存某些驱动在初始化时用memblock_reserve()保留内存用完通过free_reserved_page()逐页归还。3. CMA 区域初始化CMA 预留区域建立后页从保留状态转为可管理。总结free_reserved_page()是保留页的“净化与释放”函数它清除PG_reserved、初始化引用计数、重置映射状态、更新managed_pages计数最后通过__free_reserved_page()把页归还伙伴系统。它与free_reserved_area()配合是内核把启动专用内存或设备预留内存转化为通用可分配内存的底层执行单元确保页以“干净、一致”的状态进入伙伴系统。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询