文章目录
boot
1. kernel dtb 重新布局 // 不是共有部分,arm32独有
2. 各级别页表及开启MMU
3. 调用 start_kernel
4. 提供 start_kernel boot 过程中的回调
setup_arch
运行时的回调
1BOOT
1.1. kernel dtb 重新布局
如果 kernel 被压缩了,或者 kernel 被(loader) 加载的位置 不是 kernel 想要的
则会 进行重新 搬运 kernel // 1.解压缩的时候,如果目的地址和当前地址有重叠,要搬运自身到 稍微靠后的地址。而后解压缩
目前只有arm32 的zImage 会 做 Image 的重新搬运
对于arm32 ,如果你直接加载Image ,Image 不会将其自己 重新搬运
一般情况下 dtb 不会 被搬运
arm32/64 rv32/64 都不会
该 过程中 基本没有用到 该文 中描述的 公共API
1.2. 各级别页表及开启MMU
swapper_pg_dir 不是一个arch 漏出符号,但是在 VMSA(虚拟内存系统架构) 中起到了很重要的作用
不同的架构用了 不同的临时内核页表(管理了Image/dtb和fixmap的映射关系) 名称 ,总结如下
arm32 : swapper_pg_dir
arm64 : init_pg_dir
rv32/64 : early_pg_dir
不同的架构用到了不同的 MMU 开启技术(MMU切换页表),总结如下
arm32 : swapper_pg_dir 中的 identity mapping VA=PA,无缝切换
arm64 : idmap_pg_dir VA=PA,无缝切换
rv32/64 : trampoline_pg_dir VA!=PA,利用异常处理来切换到VA
该 过程中 值用到了 该文 中描述的 mem 相关API
"Image .head.text段 的 第一条指令"(一般用arch/xxx/kernel/head.S 中的 __HEAD 索引) 到 "start_kernel" 工作是
建立1级映射机制(fdt Image,mmu on时的映射)
1级别的页表(其实是段表)(4/8字节)一个对应1/2/4MB空间。
arm32 : 4字节 : 1MB
arm64 : 8字节 : 2MB
rv64 : 8字节 : 2MB
rv32 : 4字节 : 4MB
需要创建Image所在内存位置的映射即可,不需要创建所有内存的映射
1.3. 调用 start_kernel
1.4. 提供 start_kernel boot 过程中的回调
1.4.1 setup_arch
清老页表,创建新页表,切换到新页表
1.4.2 earlycon & early_printk
./drivers/tty/serial/earlycon.c // 该层架构无关,底层架构相关
./arch/xxx/kernel/early_printk.c // 架构相关 // 目前有 x86/mips/arm32 提供了 early_printk , rv/arm64 不提供
2.运行时的回调
2.1 进程切换
switch_mm