内核源码--------mm_init_cpumask(&init_mm);

回到start_kernel,来看函数mm_init_cpumask(&init_mm),从表面意思,可以猜出是初始化内存的,先看看init_mm这个变量是怎么来的?,定位到init_mm

struct mm_struct init_mm = {
.mm_rb = RB_ROOT,
.pgd = swapper_pg_dir,
.mm_users = ATOMIC_INIT(2),
.mm_count = ATOMIC_INIT(1),
.mmap_sem = __RWSEM_INITIALIZER(init_mm.mmap_sem),
.page_table_lock =  __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
.mmlist = LIST_HEAD_INIT(init_mm.mmlist),
INIT_MM_CONTEXT(init_mm)
};

可以看出初始化init_mm这个值的,主要是填充mm_struct结构体的相关变量,具体细节有时间在研究,先把握住主方向,回到mm_init_cpumask(&init_mm)函数,定位到该函数

static inline void mm_init_cpumask(struct mm_struct *mm)
{
#ifdef CONFIG_CPUMASK_OFFSTACK
mm->cpu_vm_mask_var = &mm->cpumask_allocation;
#endif
cpumask_clear(mm->cpu_vm_mask_var);
}

没有定义宏 CONFIG_CPUMASK_OFFSTACK,不执行mm->cpu_vm_mask_var = &mm->cpumask_allocation;定位到函数cpumask_clear(mm->cpu_vm_mask_var);

/**
 * cpumask_clear - clear all cpus (< nr_cpu_ids) in a cpumask
 * @dstp: the cpumask pointer
 */
static inline void cpumask_clear(struct cpumask *dstp)
{
bitmap_zero(cpumask_bits(dstp), nr_cpumask_bits);
}

从英文注释,函数的目的是清除cpumask变量中的所有CPU,该部分涉及“位图”知识点,后面补充介绍。

你可能感兴趣的:(内核源码阅读笔记)