ARM Linux 驱动开发篇---Linux设备树特殊节点及linux内核解析dtb文件过程--- Ubuntu20.04

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》

⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录

前言

一、特殊节点

[1.1、aliases 子节点](#1.1、aliases 子节点)

1.2、chosen子节点

[二、Linux 内核解析 DTB 文件](#二、Linux 内核解析 DTB 文件)

总结


前言

上一期博客我们介绍了如何向节点追加或修改内容,以及尝试创建一个小型的模板设备树。本期博客我们来介绍一下跟节点下的两个特殊子节点,并介绍一下linux内核如何解析DTB文件。


一、特殊节点

在设备树的根节点 / 中,有两个非常特殊、不对应真实物理设备 的子节点:aliaseschosen。它们不描述硬件,却在内核启动、驱动匹配、设备访问中起到关键作用。本节我们就结合 I.MX6ULL 实例,彻底搞懂这两个节点的作用与原理。

1.1、aliases****子节点

aliases 字面意思就是别名 。它的作用非常纯粹:为设备树中其他长路径节点起一个简短别名,方便内核、驱动、应用层快速引用

打开 imx6ull.dtsi,可以看到类似如下定义:

复制代码
aliases {
    can0 = &flexcan1;
    can1 = &flexcan2;

    ethernet0 = &fec1;
    ethernet1 = &fec2;

    gpio0 = &gpio1;
    gpio1 = &gpio2;

    spi0 = &ecspi1;
    spi1 = &ecspi2;
    spi2 = &ecspi3;
    spi3 = &ecspi4;

    usbphy0 = &usbphy1;
    usbphy1 = &usbphy2;
};

作用说明

右边 &flexcan1、&fec1 是节点标签(label),指向真实设备节点。

左边 can0、ethernet0、gpio0 是我们给它起的别名。

内核、驱动、用户空间可以直接使用 can0、spi0、uart0 这类简短名字来访问对应设备。

1.2、chosen子节点

chosen 并不是一个真实的设备,chosen 节点主要是为了 uboot 向 Linux 内核传递数据,重点是 bootargs 参数。一般.dts 文件中 chosen 节点通常为空或者内容很少,imx6ull-alientek-emmc.dts 中 chosen 节点内容如下所示:

复制代码
chosen {
    stdout-path = &uart1;  // 标准输出使用 UART1
};

上述代码中可以看出, chosen 节点仅仅设置了属性" stdout-path ",表示标准输出使用 uart1 。但是当我们进入到 /proc/device-tree/chosen 目录里面,会发现多了 bootargs 这个属性,如下图 所示:

这里出来两个关键疑问

  1. 我们没在设备树里写 bootargs,它哪来的?

  2. 为什么内容和 U-Boot 中 bootargs 一模一样?

答案:是 U-Boot 启动内核时,动态写入设备树的!

U-Boot 在使用 bootz/bootm 启动 Linux 内核前,会:
找到内存中的 .dtb 文件;
找到或自动创建 chosen 节点;
读取 U-Boot 环境变量 bootargs;
动态向设备树写入 bootargs 属性;
再把修改后的 dtb 地址传给内核。

二、Linux内核解析DTB****文件

Linux 内核在启动的时候会解析 DTB 文件,然后在/proc/device-tree 目录下生成相应的设备树节点文件。接下来我们简单分析一下 Linux 内核是如何解析 DTB 文件的,流程如下图所示:


从上图 中可以看出,在 start_kernel 函数中完成了设备树节点解析的工作,最终实际工作的函数为 unflatten_dt_node 。


总结

本期博客主要介绍了跟节点下的两个特殊子节点,并介绍一下linux内核如何解析DTB文件。

相关推荐
码农客栈15 小时前
U-Boot详解(三)之启动流程详解
linux·uboot
say_fall15 小时前
【Linux系统编程】文件操作基础:C标准库、系统调用、fd是什么和fd与FILE*的关系
android·linux·c语言
邪修king15 小时前
Re:Linux系统篇(六):动静态库 & 链接机制【完整透彻版】
linux·运维·服务器
严谨的麻辣烫1 天前
Linux sysctl 网络参数调优实战:高并发与长连接场景下的内核配置
linux·网络·php
阡陌..1 天前
Ubuntu 22.04 离线环境完全配置指南:从 GCC 到 NVIDIA 驱动再到 Samba 共享
linux·运维·ubuntu
toooooop81 天前
如何用 ss + ps 精准定位本机 Redis 的“隐形”消费者?
linux·数据库·redis·缓存
重生的黑客1 天前
Linux 进程程序替换与自定义 Shell:从 exec 函数族到命令行解释器
linux·运维·服务器·shell
北极糊的狐1 天前
阿里云服务器-命令2-Linux 系统实时资源监视器 top 命令详解(进程级实时资源监控)
linux·运维·服务器
三言老师1 天前
clear与history历史命令管理实操
linux·运维·服务器·网络·centos
味悲1 天前
Linux 环境下 DNS 服务器搭建
linux·运维·服务器