type
status
date
slug
summary
tags
category
icon
password
URL
linux内核源码解析02–启动代码分析之固定映射
Linux初始化过程页表建立
Linux初始化过程,会依次建立如下页表映射:
1.恒等映射:页表基地址idmap_pg_dir;
2.粗粒度内核镜像映射:即上篇博文里的“第二次建立页表映射”,页表基地址init_pg_dir;
3.fixmap映射:页表基地址为init_pg_dir,待paging_init之后为swapper_pg_end;
4.细粒度内核镜像映射:页表基地址为swapper_pg_dir;
5.线性映射: 页表基地址为swapper_pg_dir;
6.用户空间页表映射:页表基地址task->mm->pgd;
上篇已经解析了1和2映射,这篇解析fixmap映射。
fixmap映射的由来:
建立了恒等映射和粗粒度内核页表映射,只能保证内核镜像的正常访问,此时尚未建立内存管理子系统,如果想访问bootloader传入的dtb,或者其他io设备,还是无法实现的,因此Linux提出了fixmap.
fixmap:将一段固定虚拟地址映射到dtb,以及想要访问的IO设备地址(比如串口,用于早期的打印调试);


1.fixmap映射
源码参考arch/arm64/kernel/setup.c文件:
early_fixmap_init函数
early_ioremap_init函数
上述填充完页表和计算准备虚拟地址,在early_ioremap函数,实际建立映射关系;
early_ioremap函数
earlycon
在driver/tty/serail/earlycon.c文件,earlycon_map函数实际做ioremap映射
3.dtb映射
设备树,通过虚拟地址获取内存信息和板级信息;
setup_machine_fdt(__fdt_pointer);///设备树映射
建立映射后,即可以通过虚拟地址访问dtb内容;内核通过dtb收集了内存布局信息后,会通过memblock模块进行管理。最后资源保存在memblock的memory type数组中;
该部分内容会用在后续的内存子系统建立中(伙伴系统初始化);