设备书的特殊节点-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 函数就会执行,然后一切就按照上图中所示的流程开始运行。

### U-Boot 中设备节点 `chosen` 的作用 在嵌入式开发环境中,U-Boot 使用设备树(Device Tree, DT)来描述硬件配置。设备节点 `chosen` 是一个特殊节点,在引导过程中起着至关重要的作用。 #### 节点 `chosen` 的主要功能 节点 `chosen` 主要用于指定一些由固件提供给操作系统的关键参数和内存区域。这些信息对于操作系统的正常启动至关重要。具体来说: - **标准输入/输出设备**:定义了系统默认的标准输入、输出以及错误流所使用的设备[^1]。 ```c chosen { stdout-path = "serial0:115200"; stdin-path = "serial0:115200"; }; ``` - **初始RAM盘位置**:当使用 initramfs 或者其他类型的 RAM 文件系统作为根文件系统时,可以通过此节点告知内核其所在的位置[^3]。 ```c chosen { linux,initrd-start = <0x80000>; linux,initrd-end = <0x90000>; }; ``` - **命令行参数传递**:允许向内核传递额外的启动参数,比如设置 root 文件系统路径或其他必要的选项[^2]。 ```c chosen { bootargs = "console=ttyS0,115200 root=/dev/mmcblk0p2 rw earlyprintk"; }; ``` #### 配置方法 为了让 U-Boot 支持并正确处理设备树中的 `chosen` 节点,通常需要完成以下几个方面的准备工作: - 确认编译配置已启用对 FDT (Flattened Device Tree) 库的支持,即确保项目中包含了宏定义 `CONFIG_OF_LIBFDT`。 - 修改或创建相应的 DTS (Device Tree Source) 文件,并加入上述提到的相关属性到 `chosen` 下面去。 - 编写合适的环境变量脚本以便能够动态调整某些值,例如通过串口控制台修改启动参数等。 综上所述,通过对 `chosen` 节点合理地进行配置可以极大地简化 Linux 内核及其外围组件之间的交互过程,同时也提高了整个平台移植性和灵活性。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

One Piece&

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

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

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

打赏作者

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

抵扣说明:

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

余额充值