kernel启动流程-start_kernel的执行_3.build_all_zonelists

本文详细介绍了Linux内核5.10版本中,内存管理的关键过程`build_all_zonelists`。该过程在系统启动时,依据内存成本从低到高建立节点间的内存分配顺序,并初始化每个节点的zone列表。`pg_data_t`结构体描述了内存布局,`build_all_zonelists_init`和`__build_all_zonelists`函数负责构建zone列表,`nr_free_zone_pages`统计可用页面,`page_group_by_mobility_disabled`根据内存大小决定是否启用流动分组机制。整个过程确保了内存的有效管理和分配。

1. 前言

本专题文章承接之前《kernel启动流程_head.S的执行》专题文章,我们知道在head.S执行过程中保存了bootloader传递的启动参数、启动模式以及FDT地址等,创建了内核空间的页表,最后为init进程初始化好了堆栈,并跳转到start_kernel执行。
本文重点介绍start_kernel的build_all_zonelists的主要流程.

kernel版本:5.10
平台:arm64

2. pg_data_t

typedef struct pglist_data {
   
    
	struct zone node_zones[MAX_NR_ZONES];
	struct zonelist node_zonelists[MAX_ZONELISTS];
	int nr_zones;
} pg_data_t; 

先来重点看下pg_data_t结构体,有一段注释

On NUMA machines, each NUMA node would have a pg_data_t to describe it’s memory layout. On UMA machines there is a single pglist_data which describes the whole memory. Memory statistics and page replacement data structures are maintained on a per-zone basis.

注释中说每个NUMA节点都会有一个pg_data_t结构体变量来描述它的内存布局,在UMA机器只会有一个pg_data_t结构体变量来描述所有的内存。每个zone都会自己维护内存统计和页面替换
主要的成员说明如下:

成员 说明
node_zones 本地node的zone数组,不包含其它node
node_zonelists node_zonelists包含对所有节点中所有zone的引用, 它记录了zone的内存分配顺序
nr_zones 当前node的zone数量

3.build_all_zonelists

build_all_zonelists主要的工作就是在当前处理的结点和系统中其它节点的内存域之间建立一种等级次序,之后将根据这种次序来分配内存。
内存定义了两条内存域的排序规则:

  1. 按照从低廉到昂贵的顺序创建单个节点内存域的排序规则:
    high zone->normal zone->DMA zone
  2. 对于N个节点中的m节点来说,为保证不过度使用任一节点, 选择备用节点的顺序为:
    m, m+1, m+2, …, N-1, 0, 1, …, m-1

注:参考自<<深入Linux内核架构>> 内存管理,关于节点的顺序未必适用于5.10,5.10是通过find_next_best_node来寻找下一个最佳节点

|- -build_all_zonelists_init

if (system_state == SYSTEM_B
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值