目录
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主要的工作就是在当前处理的结点和系统中其它节点的内存域之间建立一种等级次序,之后将根据这种次序来分配内存。
内存定义了两条内存域的排序规则:
- 按照从低廉到昂贵的顺序创建单个节点内存域的排序规则:
high zone->normal zone->DMA zone - 对于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

本文详细介绍了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`根据内存大小决定是否启用流动分组机制。整个过程确保了内存的有效管理和分配。
最低0.47元/天 解锁文章
1279

被折叠的 条评论
为什么被折叠?



