news 2026/10/6 2:50:20

page_alloc zone_names

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
page_alloc zone_names

zone_names[]——每个 zone 类型对应的人类可读名称字符串数组。它是 zone 的"名字表",用于打印、调试、/proc输出等。mcrjnjfbr


一、作用与类型

char * const zone_names[MAX_NR_ZONES] = { ... };
  • 类型:char * const [MAX_NR_ZONES]

    • char *:指向字符串的指针。

    • const修饰指针本身:数组元素(指针)不可修改,即初始化后不能再让zone_names[i]指向别的字符串。

    • 指向的字符串内容是字面量(本身就在只读段),也不能改。

  • 维度:MAX_NR_ZONES,即系统支持的最大 zone 数量。

  • 索引:用ZONE_DMA、ZONE_DMA32、ZONE_NORMAL……这些枚举值作为下标。

  • 值:对应的名字字符串,如"DMA"、"Normal"。

核心用途:根据 zone 索引快速拿到可打印的名字。

printk("zone %s: ...", zone_names[zone_idx]);

比如/proc/zoneinfo、/proc/buddyinfo、内存热插拔日志、OOM 报告等都会用到。


二、逐项解析

1.ZONE_DMA→"DMA"

#ifdef CONFIG_ZONE_DMA "DMA", #endif
  • 只在配置了CONFIG_ZONE_DMA的架构上存在。

  • 对应16MB 以下的 DMA 可用内存(老式 ISA 设备)。

2.ZONE_DMA32→"DMA32"

#ifdef CONFIG_ZONE_DMA32 "DMA32", #endif
  • 只在配置了CONFIG_ZONE_DMA32的架构上存在(典型是x86_64)。

  • 对应4GB 以下、32 位设备可寻址的内存。

3.ZONE_NORMAL→"Normal"

"Normal",
  • 无条件存在,所有架构都有。

  • 内核可直接访问的普通内存,是分配的主力。

4.ZONE_HIGHMEM→"HighMem"

#ifdef CONFIG_HIGHMEM "HighMem", #endif
  • 只在 32 位架构(如 x86_32、ARM 某些配置)上存在。

  • 高端内存,内核不能直接线性映射,需kmap临时映射。

5.ZONE_MOVABLE→"Movable"

"Movable",
  • 无条件存在(现代内核)。

  • 可移动内存 zone,用于减少碎片、支持内存热插拔。

  • 用户态可移动页优先放这里,便于规整/迁移。

6.ZONE_DEVICE→"Device"

#ifdef CONFIG_ZONE_DEVICE "Device", #endif
  • 只在配置了CONFIG_ZONE_DEVICE时存在。

  • 对应设备内存(如 GPU 显存、持久内存 PMEM、HMM 设备内存),通过devm_memremap_pages()注册到内存管理。

  • 特殊:这些页可能不对应真正的 RAM。


三、为什么用指定初始化器?

注意这里没有写[ZONE_DMA] = "DMA",而是按顺序列出:

char * const zone_names[MAX_NR_ZONES] = { #ifdef CONFIG_ZONE_DMA "DMA", // 对应 ZONE_DMA #endif #ifdef CONFIG_ZONE_DMA32 "DMA32", // 对应 ZONE_DMA32 #endif "Normal", // 对应 ZONE_NORMAL ... };
  • 这是顺序初始化,依赖于zone 枚举的定义顺序与数组顺序严格一致。

  • zone 枚举在include/linux/mmzone.h中定义,顺序正是:

    ZONE_DMA, ZONE_DMA32, ZONE_NORMAL, ZONE_HIGHMEM, ZONE_MOVABLE, ZONE_DEVICE, ...
  • 条件编译保证:开启哪个 zone,数组里就补上对应项,顺序仍对齐。

  • 这是一种隐式约定:如果枚举顺序改了,这里也必须同步改,否则名字会错位。

对比前面的sysctl_lowmem_reserve_ratio[]用的是[ZONE_DMA] = 256指定初始化器,那种写法更安全(不依赖顺序)。而这里用顺序初始化,可能是历史原因或为了简洁,但维护时需要小心。


四、与MAX_NR_ZONES

  • MAX_NR_ZONES是 zone 类型的最大数量(枚举总数),编译期常量。

  • 数组大小必须 ≥ 实际 zone 数量。

  • 条件编译保证:只有实际存在的 zone 才占数组项,未定义项默认为NULL(因为数组是静态存储,未初始化元素为 0)。

    • 所以zone_names[idx]对未编译进来的 zone 是NULL,访问前应确保 idx 有效。


五、典型使用场景

1./proc/zoneinfo、/proc/buddyinfo

Node 0, zone DMA Node 0, zone DMA32 Node 0, zone Normal

这些名字就来自zone_names[]。

2. 打印 zone 信息

pr_info("Node %d, zone %s\n", nid, zone_names[zone_idx]);

3. 内存热插拔 / OOM 报告

  • 热插拔日志会打印 zone 名。

  • OOM killer 报告里也会显示 zone。

4. 调试与追踪

  • dump_page()、show_free_areas()等会用到。


六、与前面内容的呼应

前面出现过的这里的对应
sysctl_lowmem_reserve_ratio[MAX_NR_ZONES]同样以 zone 枚举为索引
ZONE_DMA/ZONE_DMA32/ZONE_NORMAL/ZONE_HIGHMEM/ZONE_MOVABLE这里的数组项一一对应
CONFIG_ZONE_DEVICE新增的"Device"项
MAX_NR_ZONES数组维度

它们共同构成"zone 维度的配置/名字表",是 zone 相关代码的基础设施。


七、小结表

索引(枚举)名字条件含义
ZONE_DMA"DMA"CONFIG_ZONE_DMA16MB 以下 DMA 内存
ZONE_DMA32"DMA32"CONFIG_ZONE_DMA324GB 以下 32 位可寻址
ZONE_NORMAL"Normal"无条件内核可直接访问的普通内存
ZONE_HIGHMEM"HighMem"CONFIG_HIGHMEM高端内存(需 kmap)
ZONE_MOVABLE"Movable"无条件可移动内存,反碎片/热插拔
ZONE_DEVICE"Device"CONFIG_ZONE_DEVICE设备内存(GPU/PMEM/HMM)

一句话总结

zone_names[]是 zone 索引到可读名称的映射表,按 zone 枚举顺序用条件编译逐项填充,供打印、/proc输出和调试使用;它依赖枚举与数组顺序严格一致,未编译进的 zone 项为NULL。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 2:49:17

基于YOLO姿态估计和XGBoost的零售店铺盗窃行为实时检测系统

摘要:随着零售业的快速发展,商品失窃问题日益严重,传统的视频监控系统依赖人工监控,效率低下且成本高昂。针对上述问题,本文提出了一种基于深度学习的智能盗窃行为检测系统,以实现对零售环境中可疑行为的自…

作者头像 李华
网站建设 2026/10/6 2:49:16

OpenCV 在 C# 中的“低代码开发”,核心思路是把常用的视觉算法封装成可视化工作流节点,在图形界面里拖拽连线完成算法编排,然后一键导出 C# 代码调用

OpenCV 在 C# 中的“低代码开发”,核心思路是把常用的视觉算法封装成可视化工作流节点,在图形界面里拖拽连线完成算法编排,然后一键导出 C# 代码调用。它解决的是传统 OpenCvSharp 开发中“每个算子都要手写代码、调参靠反复编译”的效率问题…

作者头像 李华
网站建设 2026/10/6 2:49:02

组网第六课:物理层到底在干嘛——从比特到信号的魔法

组网第六课:物理层到底在干嘛——从比特到信号的魔法 文章目录组网第六课:物理层到底在干嘛——从比特到信号的魔法一、物理层到底负责什么?二、常见的介质与编码从编码到接口:信号在介质上的旅程三、介质三兄弟:铜、光…

作者头像 李华
网站建设 2026/10/6 2:48:33

从协议转换到语音转码:公专融合对讲系统工程落地全拆解

1. 引言:公专融合,专网通信行业的必然演进方向 在专网通信领域,长期存在两种技术路线并行的局面:一类是 DMR、ePDT 等自建数字专网,优势是脱离公网独立运行、低时延、高可靠,短板是覆盖范围受基站部署限制…

作者头像 李华
网站建设 2026/10/6 2:47:55

Anritsu 2602A:频谱仪的几种测量怎么自动跑

Anritsu MS2602A 是一台频谱分析仪。看它的驱动里都有哪些 VI,能看出这类设备的测量其实分成好几种:读频域、读噪声、读平均功率、读频偏……这篇按这几种分别说说。01 第一种:读频率最基础的一种——告诉你信号在哪个频率上。这听起来太简单…

作者头像 李华
网站建设 2026/10/6 2:46:36

随着互联网技术的快速发展,网页自动化操作在数据采集、系统测试、流程自动化等领域发挥着越来越重要的作用

随着互联网技术的快速发展,网页自动化操作在数据采集、系统测试、流程自动化等领域发挥着越来越重要的作用。Selenium 是目前最主流的 Web 自动化测试框架之一,它支持多种编程语言,能够模拟真实用户在浏览器中的操作行为。Python 作为一门简洁…

作者头像 李华