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

 最近再阅读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我

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值