dts->dtb->内核解析dtb->device_node->platform_device
uboot还是通过bootm(do_bootm_linux)去启动内核,通过bootargs,过兼容tag传参与dtb传参数,kernel启动通过r0-r2传参数,ro=0,r1=machid,r2就是tag或者dtb,kernel_entry->自解压代码
自解压部分arch/arm/boot/compressed/head.S
CONFIG_ARM_APPEND_DTB(把zImage变成zImage-dtb)
CONFIG_ARM_ATAG_DTB_COMPAT(uboot通过tag传参了,内核要能接受tag传参并转成dtb来追加到原来的dtb)
atags_to_fdt(tag转换成fdt,即生成/chosen节点)
bl decompress_kernle 真正执行解压kernel转换成可执行的elf格式
bne __enter_kernel(mov pc r4 ) 跳转到内核
kernel第一阶段arch/arm/kernel/head.S
在__mmap_switched函数
str r2, [r6] @save atags pointer
.long __atags_pointer @r6
b start_kernel1
kernel第二阶段init/main.c start_kernel函数
set_arch(&command_line)
struct machine_desc定义在arch/arm/include/asm/mach目录下,kernle启动时会解析dtb中的模块信息,然后动态生成machine_desc
mdesc = setup_machine_fdt(__atags_pointer);
arm_memblock_init(mdesc)
request_standard_resources
unflatten_device_tree /*解包dtb操作*/
arm_dt_init_cpu_maps //提取了cpu有关的节点,然后操作硬件设置cpu
of_flat_dt_match_machine
段属性:.arch.info.init __arch_info_begin __arch_info_end
early_init_dt_scan_nodes
of_scan_falt_dt
deadbeef(asan)
dtb解开后,of_root成为了解开后的dtb数据结结构的根结点指针,就是很多个device_node结构体变量形成的树状指针链接。
of_find_node_by_path