void __init build_all_zonelists(void)
{
int i;
for(i = 0 ; i < numnodes ; i++)
build_zonelists(NODE_DATA(i));//NODE_DATA(i)宏定义可以找到i号内存node对应的discontig_node_data[i]
printk("Built %i zonelists/n", numnodes);
}
build_zonelists()函数调用分两种请款,我们来浅析一下吧。
支持非统一内存访问(即配置了CONFIG_NUMA选项,该选项一般用于多处理器系统)
static void __init build_zonelists(pg_data_t *pgdat)
{
int i, j, k, node, local_node;
int prev_node, load;
struct zonelist *zonelist;//先要介绍一个结构体--struct zonelist. struct zonelist {
//struct zone *zones[MAX_NUMNODES * MAX_NR_ZONES + 1]; };
//其实就是就是一个指针数组,这个数组里面的每个成员都是一个struct zone,最多可以容纳整个系统的
//所有页区数。
DECLARE_BITMAP(used_mask, MAX_NUMNODES);//这个宏定义其实就是申明一个used_mask[1]这样的数组。
/* initialize zonelists */
for (i = 0; i < GFP_ZONETYPES; i++) {
zonelist = pgdat->node_zonelists + i;//node_zonelists页区列表结构数组,其实就是上面介绍的zonelist结构类型。