设备树-Linux启动时的平台匹配与传参bootargs

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);



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值