在setup_arch中调用setup_machine_fdt来匹配最合适的mdesc
mdesc = setup_machine_fdt(__atags_pointer);__atags_pointer为dtb的地址
其中调用of_flat_dt_match_machine--->of_flat_dt_match_machine 来匹配
所有的mdesc都是用
DT_MACHIE_START和MACHINE_END来定义
比如
DT_MACHINE_START(RK3288_DT, "Rockchip RK3288 (Flattened Device Tree)") .smp = smp_ops(rockchip_smp_ops), .map_io = rk3288_dt_map_io, .init_time = rk3288_dt_init_timer, .dt_compat = rk3288_dt_compat, .init_late = rk3288_init_late, .reserve = rk3288_reserve, .restart = rk3288_restart, MACHINE_END
这里面有个很关键的匹配数据do_compat。这个是一个char*数组指向兼容的字符串。
of_flat_dt_match_machine把所有的DT_MACHINE_START定义结构的dt_compat和传给内核的dtb中根节点下compatible属性的兼容字符串比较。得到分数最高的一个。
最终确定这个mdesc
比如.dt_compat = rk3288_dt_compat
static const char * const rk3288_dt_compat[] __initconst = { "rockchip,rk3288", NULL, };
并且在rk3288.dtsi中包含有
/ { compatible = "rockchip,rk3288"; rockchip,sram = <&sram>; interrupt-parent = <&gic>;
所以如果是rk3288就会得到RK3288_DT的desc