设备书的特殊节点-chosen

前言:
参考自正点原子和博客:
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 函数就会执行,然后一切就按照上图中所示的流程开始运行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One Piece&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值