page_alloc __build_all_zonelists

发布时间:2026/10/17 6:48:57
page_alloc __build_all_zonelists __build_all_zonelists()是build_all_zonelists()的底层执行函数负责遍历系统中所有在线节点为每个节点构建 zonelist。核心实现static int __build_all_zonelists(void *data) { int nid; int cpu; pg_data_t *self data; for_each_online_node(nid) { pg_data_t *pgdat NODE_DATA(nid); build_zonelists(pgdat); } for_each_possible_cpu(cpu) per_cpu_pages_init(per_cpu(boot_pageset, cpu), per_cpu(boot_zonestats, cpu)); mminit_verify_zonelist(); cpuset_init_current_mems_allowed(); return 0; }关键步骤解析1. 遍历所有在线节点for_each_online_node(nid) { pg_data_t *pgdat NODE_DATA(nid); build_zonelists(pgdat); }对每个在线 NUMA 节点调用build_zonelists()前面讲过的为其构建ZONELIST_FALLBACK和ZONELIST_NOFALLBACK。在 UMA 系统中只有一个节点此循环只执行一次。2. 初始化 boot pagesetfor_each_possible_cpu(cpu) per_cpu_pages_init(per_cpu(boot_pageset, cpu), ...);初始化每个可能 CPU 的boot_pageset。这些是引导阶段的 per-CPU 页缓存在真正的 per-CPU 分配器就绪之前使用。它们的high0、batch1使得放入的页会立即转交给伙伴系统避免在早期缓存页。3. 验证与 cpuset 初始化mminit_verify_zonelist()在调试配置下验证构建的 zonelist 是否正确。cpuset_init_current_mems_allowed()将当前任务的mems_allowed掩码置为全部节点。调用上下文__build_all_zonelists()由build_all_zonelists()调用系统启动阶段SYSTEM_BOOTING通过build_all_zonelists_init()间接调用传入NULL遍历所有在线节点。内存热插拔传入具体的pgdat指针只构建该节点的 zonelist。build_all_zonelists()被标记为__ref因为它会调用__meminit注解的辅助函数但在内存热插拔时也需要被调用。总结__build_all_zonelists()是 zonelist 构建的遍历执行层它遍历所有在线节点对每个节点调用build_zonelists()构建分配回退列表同时初始化引导阶段的 per-CPU 页缓存boot_pageset并完成 zonelist 验证和 cpuset 初始化。它是build_all_zonelists()在启动和热插拔场景下的实际工作函数。

关于本文作者

来自尧图内容编辑团队

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

尧图内容编辑团队

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

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

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

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

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

网站改版的5个关键决策

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

获取专属建站方案

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

立即免费咨询