page_alloc lowmem_reserve_ratio_sysctl_handler lowmem_reserve_ratio_sysctl_handler()是/proc/sys/vm/lowmem_reserve_ratio的 sysctl 处理函数负责响应用户对该参数的读写请求并在写入后重新计算各 zone 的lowmem_reserve[]数组。核心实现static int lowmem_reserve_ratio_sysctl_handler(const struct ctl_table *table, int write, void *buffer, size_t *length, loff_t *ppos) { int rc; rc proc_dointvec_minmax(table, write, buffer, length, ppos); if (rc) return rc; if (write) setup_per_zone_lowmem_reserve(); return 0; }逐步解析1. 标准整数数组读写rc proc_dointvec_minmax(table, write, buffer, length, ppos); if (rc) return rc;proc_dointvec_minmax()标准 sysctl 整数数组处理函数。lowmem_reserve_ratio是一个整数数组sysctl_lowmem_reserve_ratio[MAX_NR_ZONES]所以这里处理的是数组而非单个整数。用户读时返回各 zone 的 ratio 值用户写时解析输入的整数序列并写入数组。带_minmax后缀表示写入时检查每个值是否在允许范围内。2. 写操作后重新计算保留量if (write) setup_per_zone_lowmem_reserve();调用前面讲过的setup_per_zone_lowmem_reserve()遍历所有在线节点和 zone根据新的 ratio 重新计算每个 zone 的lowmem_reserve[]。ratio 变了每个 zone 需要为更高 zone 保留的页数也随之变化必须重新计算。注意setup_per_zone_lowmem_reserve()内部还会调用calculate_totalreserve_pages()更新全局汇总值。3. 读操作如果write 0只执行proc_dointvec_minmax()把当前数组值复制给用户不做额外处理。sysctl 表定义{ .procname lowmem_reserve_ratio, .data sysctl_lowmem_reserve_ratio, .maxlen sizeof(sysctl_lowmem_reserve_ratio), .mode 0644, .proc_handler lowmem_reserve_ratio_sysctl_handler, .extra1 SYSCTL_ZERO, .extra2 one_thousand, },最小值 0最大值 1000或某个上限。默认值前面讲过DMA/DMA32 为 256Normal 为 32HIGHMEM/MOVABLE 为 0。与前面 handler 的对比handler控制参数写后调用计算目标min_free_kbytes_sysctl_handlermin_free_kbytessetup_per_zone_wmarks()各 zone 水位watermark_scale_factor_sysctl_handlerwatermark_scale_factorsetup_per_zone_wmarks()各 zone 水位间距sysctl_min_unmapped_ratio_sysctl_handlermin_unmapped_ratiosetup_min_unmapped_ratio()pgdat-min_unmapped_pagessysctl_min_slab_ratio_sysctl_handlermin_slab_ratiosetup_min_slab_ratio()pgdat-min_slab_pageslowmem_reserve_ratio_sysctl_handlerlowmem_reserve_ratio[]setup_per_zone_lowmem_reserve()各 zonelowmem_reserve[]它们结构一致标准读写 写后重算。总结lowmem_reserve_ratio_sysctl_handler()是vm.lowmem_reserve_ratio的sysctl 读写入口它通过proc_dointvec_minmax()完成整数数组的标准读写和范围检查写操作后调用setup_per_zone_lowmem_reserve()重新计算所有 zone 的lowmem_reserve[]并更新totalreserve_pages。它让用户能够动态调整各 zone 的低端内存保留比例是内存保护机制可配置性的关键实现。