page_alloc_sysctl_init()是页面分配器在启动阶段注册 sysctl 参数表的初始化函数。它的职责非常单一:把前面讲过的page_alloc_sysctl_table注册到/proc/sys/vm/目录下。核心实现void __init page_alloc_sysctl_init(void) { register_sysctl_init("vm", page_alloc_sysctl_table); }关键点解析1.register_sysctl_init()的作用把page_alloc_sysctl_table数组注册到/proc/sys/vm/目录下。数组中的每个条目对应一个 sysctl 文件(如/proc/sys/vm/min_free_kbytes)。注册后,用户即可通过/proc/sys/vm/*读写这些参数。2.register_sysctl_init与register_sysctl的区别register_sysctl():标准注册函数,返回struct ctl_table_header *,调用方需自行处理失败和生命周期。register_sysctl_init():启动初始化专用的包装,内部调用register_sysctl()并在失败时panic或WARN——因为 sysctl 注册失败属于严重启动错误,不应静默忽略。用__init标记函数,启动完成后函数体可被卸载。3. 注册时机该函数通常在start_kernel()或mm_init()的启动流程中被调用,位于内存管理子系统初始化完成、sysctl 框架就绪之后。与page_alloc_sysctl_table的关系page_alloc_sysctl_init() └── register_sysctl_init("vm", page_alloc_sysctl_table) ├── 创建 /proc/sys/vm/min_free_kbytes → min_free_kbytes_sysctl_handler ├── 创建 /proc/sys/vm/watermark_scale_factor → watermark_scale_factor_sysctl_handler ├── 创建 /proc/sys/vm/watermark_boost_factor → watermark_boost_factor_sysctl_handler ├── 创建 /proc/sys/vm/percpu_pagelist_high_fraction → percpu_pagelist_high_fraction_sysctl_handler ├── 创建 /proc/sys/vm/lowmem_reserve_ratio → lowmem_reserve_ratio_sysctl_handler ├── 创建 /proc/sys/vm/min_unmapped_ratio → sysctl_min_unmapped_ratio_sysctl_handler ├── 创建 /proc/sys/vm/min_slab_ratio → sysctl_min_slab_ratio_sysctl_handler └── 创建 /proc/sys/vm/numa_zonelist_order → numa_zonelist_order_handler设计背景2023 年的内核清理中,Kefeng Wang 将这些原本散落在kernel/sysctl.c中的页面分配器参数统一移入mm/page_alloc.c,并配套引入page_alloc_sysctl_init()在文件内完成注册。这使页面分配器的 sysctl 定义、处理函数和注册逻辑内聚在同一个文件中,便于维护,也避免了kernel/sysctl.c的臃肿。总结page_alloc_sysctl_init()是页面分配器 sysctl 的注册入口:它通过register_sysctl_init("vm", page_alloc_sysctl_table)把min_free_kbytes、watermark_scale_factor、lowmem_reserve_ratio、numa_zonelist_order等参数注册到/proc/sys/vm/下,使用户能够动态调整页面分配器的核心行为。它是 2023 年 sysctl 代码内聚化重构的产物,让mm/page_alloc.c自包含其可调参数的完整生命周期。
page_alloc_sysctl_init()是页面分配器在启动阶段注册 sysctl 参数表的初始化函数。它的职责非常单一:把前面讲过的page_alloc_sysctl_table注册到/proc/sys/vm/目录下。核心实现void __init page_alloc_sysctl_init(void) { register_sysctl_init("vm", page_alloc_sysctl_table); }关键点解析1.register_sysctl_init()的作用把page_alloc_sysctl_table数组注册到/proc/sys/vm/目录下。数组中的每个条目对应一个 sysctl 文件(如/proc/sys/vm/min_free_kbytes)。注册后,用户即可通过/proc/sys/vm/*读写这些参数。2.register_sysctl_init与register_sysctl的区别register_sysctl():标准注册函数,返回struct ctl_table_header *,调用方需自行处理失败和生命周期。register_sysctl_init():启动初始化专用的包装,内部调用register_sysctl()并在失败时panic或WARN——因为 sysctl 注册失败属于严重启动错误,不应静默忽略。用__init标记函数,启动完成后函数体可被卸载。3. 注册时机该函数通常在start_kernel()或mm_init()的启动流程中被调用,位于内存管理子系统初始化完成、sysctl 框架就绪之后。与page_alloc_sysctl_table的关系page_alloc_sysctl_init() └── register_sysctl_init("vm", page_alloc_sysctl_table) ├── 创建 /proc/sys/vm/min_free_kbytes → min_free_kbytes_sysctl_handler ├── 创建 /proc/sys/vm/watermark_scale_factor → watermark_scale_factor_sysctl_handler ├── 创建 /proc/sys/vm/watermark_boost_factor → watermark_boost_factor_sysctl_handler ├── 创建 /proc/sys/vm/percpu_pagelist_high_fraction → percpu_pagelist_high_fraction_sysctl_handler ├── 创建 /proc/sys/vm/lowmem_reserve_ratio → lowmem_reserve_ratio_sysctl_handler ├── 创建 /proc/sys/vm/min_unmapped_ratio → sysctl_min_unmapped_ratio_sysctl_handler ├── 创建 /proc/sys/vm/min_slab_ratio → sysctl_min_slab_ratio_sysctl_handler └── 创建 /proc/sys/vm/numa_zonelist_order → numa_zonelist_order_handler设计背景2023 年的内核清理中,Kefeng Wang 将这些原本散落在kernel/sysctl.c中的页面分配器参数统一移入mm/page_alloc.c,并配套引入page_alloc_sysctl_init()在文件内完成注册。这使页面分配器的 sysctl 定义、处理函数和注册逻辑内聚在同一个文件中,便于维护,也避免了kernel/sysctl.c的臃肿。总结page_alloc_sysctl_init()是页面分配器 sysctl 的注册入口:它通过register_sysctl_init("vm", page_alloc_sysctl_table)把min_free_kbytes、watermark_scale_factor、lowmem_reserve_ratio、numa_zonelist_order等参数注册到/proc/sys/vm/下,使用户能够动态调整页面分配器的核心行为。它是 2023 年 sysctl 代码内聚化重构的产物,让mm/page_alloc.c自包含其可调参数的完整生命周期。