前言:
参考自正点原子和博客:
https://www.cnblogs.com/targethero/p/5089124.html
正文:
chosen
chosen 并不是一个真实的设备, chosen 节点主要是为了 uboot 向 Linux 内核传递数据,重点是 bootargs 参数。一般.dts 文件中 chosen 节点通常为空或者内容很少。
但是,当我们进入到/proc/device-tree/chosen 目录里面,会发现多了 bootargs 这个
属性:
查看里面的内容:
由此,我们可以推出:
chosen这个节点就是将uboot里面的bootargs环境变量值,传递给linux内核,作为命令行参数,cmd line.
现在有两个疑点:
①、我们并没有在设备树中设置 chosen 节点的 bootargs 属性,那么chosen中 bootargs
这个属性是怎么产生的?
②、为何 bootargs 文件的内容和 uboot 中 bootargs 环境变量的值一样?它们之间有什么关系。
解答这个问题:
通过在uboot源码里面,进行全局查找,最后在在uboot源码里面,有个函数fdt_chosen(),用到了chosen这个变量。对这个函数进行分析,我们可以知道,这个函数的内容是:
1)、调用函数 fdt_find_or_add_subnode 从设备树(.dtb)中找到 chosen 节点,如果没有
找到的话就会自己创建一个 chosen 节点。
2)、读取 uboot 中 bootargs 环境变量的内容。
3)、调用函数 fdt_setprop 向 chosen 节点添加 bootargs 属性,并且 bootargs 属性的值
就是环境变量 bootargs 的内容。
对函数fdt_chosen()继续进行查找,发现他的调用关系是这个样子的:
框起来的部分就是函数 do_bootm_linux 函数的执行流程,也就是说:
do_bootm_linux 函数会通过一系列复杂的调用,最终通过 fdt_chosen 函数在 chosen 节点中加入了 bootargs 属性。而我们通过 bootz 命令启动 Linux 内核的时候会运行 do_bootm_linux 函数,至此,真相大白,一切事情的源头都源于如下命令:
bootz 80800000 – 83000000
当我们输入上述命令并执行以后, do_bootz 函数就会执行,然后一切就按照上图中所示的流程开始运行。