最近再阅读LINUX内核内存部分源码,边读便记录,就当知识积累了。(这里分析源码版本是linux 5.7-rc4)

在linux源码中内存无论是以UMA还是NUMA的计算机类型,都是以【NODE->ZONE->PAGE】的数据结构形式管理。这篇文章主要分享的是NODE数据结构中一个重要的组成元素zones[MAX_NR_ZONES]的大小,话不多说,先附上相关部分源码如下(源码所在文件路径是include/linux/mmzone.h):

typedef struct pglist_data {

struct zone node_zones[MAX_NR_ZONES];

上述代码【pglist_data】这个结构体描述了【NODE】的组成数据元素,其中【node_zones】数组是今天的主角,这是一个【zone】类型的数组,数组含有【MAX_NR_ZONES】个元素,相信阅读过《深入Linux内核架构》这本书的,里面有一句话说【该数组总是有三个的】,但是在这个版本的内核,你会发现这句话不一定是百分正确的了(如果你不相信请往下看)。

首先我们试图找到这个【MAX_NR_ZONES】宏定义在哪,这里有一个坑,当你试图在整个linux源码文件中寻找它时,你会现这样一段代码(在这个kernel/bounds.c文件中),

// SPDX-License-Identifier: GPL-2.0

/*

* Generate definitions needed by the preprocessor.

*生成预处理程序所需的定义

......

DEFINE(MAX_NR_ZONES, __MAX_NR_ZONES);

......

说明这个【MAX_NR_ZONES】宏定义是动态生成出来的,而且貌似和【__MAX_NR_ZONES】有一定的关系,为了验证我的猜想,我又继续如下操作,回到include/linux/mmzone.h这个文件中去,有一段代码如下:

enum zone_type {

#ifdef CONFIG_ZONE_DMA

ZONE_DMA,

#endif

#ifdef CONFIG_ZONE_DMA32

ZONE_DMA32,

#endif

ZONE_NORMAL,

#ifdef CONFIG_HIGHMEM

ZONE_HIGHMEM,

#endif

ZONE_MOVABLE,

#ifdef CONFIG_ZONE_DEVICE

ZONE_DEVICE,

endif

__MAX_NR_ZONES

}

这是一个枚举类型,里面最多含有ZONE_DMA,ZONE_DMA32,ZONE_NORMAL,ZONE_HIGHMEM,ZONE_MOVABLE,ZONE_DEVICE这6种,【__MAX_NR_ZONES】用来表示这个枚举类型中含有元素的个数,具体的个数根据【.config文件】(编译过内核的都知道这个文件)配置不同而不同。

到此,我们可以回顾一下zones[MAX_NR_ZONES]数组大小的来源,首先根据【.config】文件确定了【enum zone_type】这个枚举中【__MAX_NR_ZONES】个数,进而在【kernel/bounds.c】这个文件中确定了【MAX_NR_ZONES】个数大小,最后在【typedef struct pglist_data】结构体中确定了NODE中所包含ZONE的数量。

为了验证上述逻辑,我在个人机器(64位)上查询了【/proc/zoneinfo】这个文件,文件描述了是5种ZONE(并不是《深入Linux内核架构》这本书的所说的三个)。

这篇文章就先写到这,以作备忘,接下来就是去学习每一种ZONE的含义了。

PS: 本人技术能力有限,如果文章中有不对的地方还请大神们不要吝啬,可以疯狂diss我

Linux内核手帐之内存管理源码分析(一)相关推荐

  1. Linux内核 eBPF基础:kprobe原理源码分析:源码分析

    Linux内核 eBPF基础 kprobe原理源码分析:源码分析 荣涛 2021年5月11日 在 <Linux内核 eBPF基础:kprobe原理源码分析:基本介绍与使用>中已经介绍了kp ...

  2. Linux内核 eBPF基础:kprobe原理源码分析:基本介绍与使用示例

    Linux内核 eBPF基础 kprobe原理源码分析:基本介绍与使用示例 荣涛 2021年5月11日 kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术. 利用kpro ...

  3. Linux内核 eBPF基础:Tracepoint原理源码分析

    Linux内核 eBPF基础 Tracepoint原理源码分析 荣涛 2021年5月10日 1. 基本原理 需要注意的几点: 本文将从sched_switch相关的tracepoint展开: 关于st ...

  4. 分享一篇glibc 2.30内存管理源码分析

    分享一篇glibc 2.30内存管理源码分析,出于时间关系文章中可能存在问题(如纰漏.或者解释不顺,后续我会持续更新修正),还请大家海涵,大家互相探讨,也多多希望大家指出文章中问题,我及时斧正.本文只 ...

  5. 内存管理源码分析1-ARMV8-AARCH64 MMU 及 linux页表映射过程

    MMU的作用,主要是完成地址的翻译,无论是main-memory地址(DDR地址),还是IO地址(设备device地址),在开启了MMU的系统中,CPU发起的指令读取.数据读写都是虚拟地址,在ARM ...

  6. linux内核手帐_linux N卡 steam启动失败解决方案 (32位 库缺失)

    摘要 关于解决 Steam.sh 报错 VERSION_ID: 未绑定的变量 下方 libGL error:  unable ****** rm对应steam官方库后的必装依赖 记录一下之前遇到的li ...

  7. Presto内存管理源码分析

    1. 内存池初始化 初始化代码在LocalMemoryManager中,启动时将内存分为3个内存池,分别是: RESERVED_POOL:预留内存池,用于执行最耗费内存资源的查询. GENERAL_P ...

  8. Linux内核之浅谈内存寻址

    Linux内核之浅谈内存寻址 前言 最近在看内存寻址的内容,略有所得,发此文与大家一起交流.我们知道计算机是由硬件和软件组成,硬件主要包括运算器.控制器.存储器.输入设备和输出设备,软件主要是操作系统 ...

  9. linux源码文件名,Linux中文件名解析处理源码分析

    Linux中文件名解析处理源码分析 前言 Linux中对一个文件进行操作的时候,一件很重要的事情是对文件名进行解析处理,并且找到对应文件的inode对象,然后创建表示文件的file对象.在此,对文件名 ...

最新文章

  1. docker nginx部署前端项目
  2. numpy.where用法
  3. 自定义最大高度的ViewGroup
  4. php pdo mysql存储过程_MySQL从PHP PDO中的存储过程检索变量
  5. C++开发中的pImpl方法
  6. [ACM] hdu 1232 畅通工程(并查集)
  7. 在读博士一作发Nature,学校重奖50万!
  8. 安全模式 提权_记一次渗透挖洞提权实战
  9. 原创:PHP乱码怎么办?五种方法彻底解决PHP乱码问题
  10. 漂亮easyui皮肤组件html模板,EasyUI美化皮肤主题大包Insdep Theme
  11. Linux下的围棋软件,在Linux下和电脑下围棋
  12. 少儿编程市场调研分析
  13. 五禽戏 (中国传统健身方法)
  14. 小熊派鸿蒙开发板,小熊派-鸿蒙#183;季开发板入门(一)
  15. 《老子》古本学习札记
  16. LightOJ1197 Help Hanzo —— 大区间素数筛选
  17. Django搭建在线教育平台(一)
  18. JavaScript-ES6-基础语法
  19. PMP-16项目整合管理-制定项目管理计划
  20. 计算机科学与探索期刊审稿周期,计算机科学与探索杂志

热门文章

  1. 控制工程笔记5|二阶系统
  2. 谷歌浏览器登录不上 sarai浏览器可以登录的问题
  3. [NCTF2019]True XML cookbook
  4. 万网企业邮箱与阿里云邮箱的SMTP、POP设置
  5. 论文中的表格也需要查重吗?
  6. 2021-08-29 网安实验-WEB专题-捉迷藏
  7. vue组件_组件通信_todo案例
  8. zencart修改产品默认图片路径
  9. 控制回路:DI、DO、AI、AO信号是什么?
  10. oracle查询不等于条件包含null值