认识设备树(四)——内核对DTB文件的解析

前言

本文关注的主要是内核如何处理DTB文件中记录的设备信息,会分析内核解析DTB文件的主体流程,不会关注所有细节,同时,也不会关注对特定设备信息的处理,比如对有关中断的设备信息的处理,相关内容在做相应模块的笔记时再细究(学习linux的中断管理时会分析内核对DTB中有关中断的部分的处理)。

1 从u-boot传参到__atags_pointer

前文已经说过,DTB文件由u-boot传递给内核,u-boot在跳转到内核时,会把一些关键的信息通过参数(实际使用通用寄存器r0、r1、r2)传递给内核:

  • r0:通常设置为0;
  • r1:传递的是ATAGS时,通常设置为板子的machine id;传递的是设备树时,该参数无用;
  • r2:通常设置为ATAGS或DTB在内存中的起始地址。

可见,当u-boot向内核传递DTB文件时,内核真正要关注的只有r2寄存器中存放的DTB文件的内存起始地址。内核会在启动的汇编阶段把这个地址保存到全局变量

### 实现内核设备树二进制文件(DTB)的分离加载 在U-Boot或其他引导加载程序中,可以实现Linux内核设备树二进制文件(DTB)的分离加载。这通常涉及几个关键步骤来配置环境变量并执行相应的命令。 #### 配置环境变量 为了使内核能够找到DTB,在启动过程中设置`fdtcontroladdr`是非常重要的。该地址指向存储器中的实际位置,其中放置了展开后的扁平化设备树结构(FDT)[^1]。 ```bash setenv fdt_high "0xffffffff" setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p2 rw earlyprintk" ``` 上述命令设置了FDT的最大允许地址以及传递给内核的参数字符串;这里假设串口作为控制台,并指定了根文件系统的路径。 #### 加载内核DTB到内存 通过TFTP、NFS或者其他方式把内核镜像(`uImage`)和对应的DTB下载至指定RAM区域: ```bash tftp ${kernel_addr_r} uImage tftp ${fdt_addr_r} myboard.dtb ``` 这两条语句分别获取了压缩形式下的内核映像及其关联的平台描述符表——即所谓的Device Tree Blob (DTB),并将它们安置于预先定义好的物理地址处。 #### 启动过程定制 一旦所有必需组件都已就位,则可通过调用特定函数完成最终阶段的工作: ```bash bootm ${kernel_addr_r} - ${fdt_addr_r} ``` 此指令告知U-Boot按照所提供的参数去解析位于`${kernel_addr_r}`处的内核代码段,并利用来自`${fdt_addr_r}`的数据初始化硬件抽象层(HAL),从而顺利进入操作系统运行状态。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值