内核映像文件,它可以支持多种单板,uImage可以支持多种单板,比如说SMDK2410 ,SMDK2440
JZ2440.
以前没有设备树时,是根据R1来跟machine_desc 下面 的NR, 进行对比,来找到合适的machine_desc
现在使用DTB给内核传参数时,它是怎么选择machine_desc
在设备树文件里面,它有一项,根节点里面 ,它有个model 和 compatible ,根据这个属性的字符串值来找到machine_desc
dts文件中,它要声明,这个板子想要什么样的machine_desc;
compatible= "" ,"" ,"" ; 它的值可能有很多个字符串,如何第1个字符串找不到,就找第2个; 也就是最兼容的 到次之。
在内核源码中, MACHINE_START定义1个结构体,里面有各项Init成员, 还加了1项 .dt_compat = smdk2440_dt_compat;
这1项就是表明MACHINE_START支持哪些单板,它指向1个字符串数组。
const char * smdk2440_dt_compat[] ={
"samsung,smdk2440",
NULL
}; 你可以写入1个或者多个名字
总结: 使用compatible 属性跟machine_desc.dt_compat比较。成绩为最合适的。吻合的compatible取值的位置
因为compatible 可能会有多个字符串 ,用.号分开
函数调用过程:
start_kernel
setup_arch(&command_line);
mdesc= setup_machine_fdt(__atags_pointer); 在这个地址__atags_pointer,既可能包含atag的地址,也有
可能保存的是dtb的地址;假设它是dtb文件,用这个函数setup_machine_fdt来分析,如果不成功的话,再用下面这个函数来分析 setup_machine_tags(__atags_point, __machine_arch_type)
进入这个函数看下:setup_machine_fdt
首先Uboot传进来的是物理地址, 要把它转换为虚拟地址。再判断头部。看头部里面有没MANIC。
再调用of_flat_dt_match_machine(),一个一个取出dt_compat 与设备树中的根节点 compatible进行比较
内核中machine_desc结构体 有个段属性值,编译的时候,他们会放在一块。