第02节_对设备树中平台信息的处理(选择machine_desc)_P.zip

内核映像文件,它可以支持多种单板,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结构体 有个段属性值,编译的时候,他们会放在一块。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值