作者:Xx--尐尐尐尐情绪 | 来源:互联网 | 2023-09-03 17:14
一个编译成uImage或zImage的内核映像文件,它可以支持多种单板。假设编译出来的uImage它可以支持多种单板的类型如下:smdk2410smdk2440jz2440smdk
一个编译成uImage或zImage的内核映像文件,它可以支持多种单板。假设编译出来的uImage它可以支持多种单板的类型如下:
smdk2410
smdk2440
jz2440
smdk2410和smdk2440是三星公司出的公板,国内很多开发板厂家在他们的基础上做出了自己的开发板。这些板子的配置稍有不同,需要做一些单独的初始化,在内核中对于这些单板都有一个machine_desc结构体,里面有Init和nr。
uboot使用atags给内核传参数时,会传入一个机器ID,内核会使用这个机器ID找到最合适的machine_desc,它是如何找的呢?
机器ID用来和machine_desc中的nr进行比较,如果两者相等,表示找到了对应的machine_desc。
当uboot不使用atags传参数,使用设备树给内核传参数时,内核是如何选择对应的machine_desc的呢?
在设备树文件中,在根节点中有个compatible属性,这个属性是一系列字符串,内核就是使用这些字符串来找到合适的machine_desc。
注意这个属性的值是一系列字符串:
比如说
/ {
.......
compatible = "samsung,smdk2440","samsung,smdk2410","samsung,smdk24xx";
.......
}
(1)用户在设备树中声明这块板子想要什么样的machine_desc,可以是一系列的字符串。但是这个地方会有个优先级:
最好内核支持samsung,smdk2440。如果实在找不到支持smdk2440的内核,那么选择次之samsung,smdk2410。如 果连这个都找不到,那么选择samsung,smdk24xx。
(2)内核中的每个machine_desc,需要表明它能支持哪些单板。如何进行表明呢?
使用字符串进行表明machine_desc来表明它可以支持哪些单板。
在内核中MACHINE_START定义一个结构体,里面有各项成员,在这里面其中有一项dt_compat。该项表明 machine_desc这个结构体它所支持的单板类型。它指向一个字符串数组。
(3)有多个machine_desc跟dts吻合,究竟选择哪个呢?代码是如何实现的?
函数调用过程:
start_kernel // init/main.c
setup_arch(&command_line); // arch/arm/kernel/setup.c
mdesc = setup_machine_fdt(__atags_pointer); //_atags_pointer保存的可能是atags的地址,也可能是dtb的地址。 arch/arm/kernel/devtree.c。
early_init_dt_verify(phys_to_virt(dt_phys) // 判断是否有效的dtb, drivers/of/ftd.c
initial_boot_params = params;
mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach); // 找到最匹配的machine_desc, drivers/of/ftd.c
while ((data = get_next_compat(&compat))) {
score = of_flat_dt_match(dt_root, compat);
if (score > 0 && score < best_score) {
best_data = data;
best_score = score;
}
}
machine_desc = mdesc;
以上就是根据设备树中的平台设备信息选择machine_desc的过程
对设备树中平台信息的处理(选择machine_desc)