主初始化函数在main.c中,主要研究以下几个部分:

1.node的初始化

2.zone的空间分配

3.node的zonelist的初始化

blog

https://7r1pl3j.github.io/2022/11/17/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/#Linux-%E4%B8%89%E7%A7%8D%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B

终于是理解了node,zone,pfn以及page。

setup_arch(&command_line)

涉及到cpu与node之间关系的建立以及,node与内存之间映射关系的建立

在建立关系之前需要有一个分配器来完成内存的分配,因此需要bootstrap,需要先初始化一个笨重的分配器,来进行最初的内存分配,直到高级的分配器完全建立。

涉及部分数据结构如下:

//分别是获得io,和分配节点的部分代码
u16 *cpu_to_apicid = early_per_cpu_ptr(x86_cpu_to_apicid);
cpu_to_node_map[cpu] = node;
.............
/*node,zone初始化的主要代码,过于长*/
init_cpu_to_node();
init_gi_nodes();

build_all_zonelists

此函数第一部分来设置zonelists列表,node在初始化的过程中通过node_zones字段来引用内存但是还不能被使用,需要通过初始化zonelist之后才能使用,初始化zonelist分为热插拔和初始化两种情况。

其中涉及到的主要的操作如下:

//用来定位zone
struct zoneref {
struct zone *zone; /* Pointer to actual zone */
int zone_idx; /* zone_idx(zoneref->zone) */
};
//例子:
//指向当前节点的 zonelist,_zonerefs 是用于存储内存区域(zone)的数据结构。
zonerefs = pgdat->node_zonelists[ZONELIST_FALLBACK]._zonerefs;
//用来定位node
extern struct pglist_data contig_page_data;
static inline struct pglist_data *NODE_DATA(int nid)
{
return &contig_page_data;
}

此函数第二部分来设置vm_total_pages,Get the number of free pages beyond high watermark in all zones.

进而考虑是否需要禁止mobile来减少内存碎片(如果内存较少就没有必要开启此功能。)

mm_init

内容好多,先研究slab初始化吧

kmem_cache_init(void)