我们接着看linux初始化内存的下半部分,等内存初始化后就可以进入真正的内存管理了,初始化我总结了一下,大体分为三步:
-
物理内存进系统前
-
用memblock模块来对内存进行管理
-
页表映射
-
zone初始化
前两步在linux里分别对应如下操作:
-
fixed map 加载dtb :Uboot会将kernel image和dtb拷贝到内存中,并且将dtb物理地址告知kernel
-
系统解析dtb里的内存参数:kernel需要从该物理地址上读取到dtb文件并解析,才能得到最终的内存信息
上面两个步骤可以简单参考上篇文章,本文在上面2个步骤的基础上延续向下讲,进入 paging_init()和 bootmem_init()
paging_init
void __init paging_init(void)
{
phys_addr_t pgd_phys = early_pgtable_alloc();//分配一页大小的物理内存放进pgd
pgd_t *pgd = pgd_set_fixmap(pgd_phys);
map_kernel(pgd);//将内核的各个段进行映射&nbs