Linux在启动过程中,需要用Machine和设备树进行匹配.
设备树部分配置如下:
/ {
model = "SMDK24440";
compatible = "samsung,smdk2440";
chosen {
bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";
};
};
首先,我们来讲和Machine进行匹配Machine的定义如下:
static const char *const smdk2440_dt_compat[] __initconst = {
"samsung,smdk2440",
NULL
};MACHINE_START(S3C2440, "SMDK2440")
/* Maintainer: Ben Dooks <ben-linux@fluff.org> */
.atag_offset = 0x100,
.dt_compat = smdk2440_dt_compat,
.init_irq = s3c2440_init_irq,
.map_io = smdk2440_map_io,
.init_machine = smdk2440_machine_init,
.init_time = smdk2440_init_time,
MACHINE_END
这个Machine是通过链接脚本链接到内核镜像里去的,一个内核可能会有多个MACHINE,链接请搜索.arch.info.init
匹配过程如下,另外,这里面也顺带把chosen>bootargs的填充调用也标识出来了.
start_kernel
setup_arch
setup_machine_fdt
//这里面会取出所有的MACHINE来进行遍历
of_flat_dt_match_machine(mdesc_best, arch_get_next_mach);
while ((data = get_next_compat(&compat))) {
score = of_flat_dt_match(dt_root, compat); //分小者胜利
of_fdt_match
while (*compat) { //这个遍历是遍历一个MACHINE的dt_compat数组
of_fdt_is_compatible
//取出根节点下的compatible,来和MACHINE进行匹配
cp = fdt_getprop(blob, node, "compatible", &cplen);
of_compat_cmp
}
}
early_init_dt_scan_nodes();
//这个遍历是取出chosen的bootargs,并填充到boot_command_line
of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);