linux内核中设备树如何存放
linux内核中设备树如何存放详细介绍
在 Linux 内核中,设备树(Device Tree,DT)的存放和组织遵循特定的目录结构和编译规则,以下是详细说明:
一、
源代码中的设备树文件位置
设备树源文件(.dts 和 .dtsi)主要存放在内核源码的 arch/<架构>/boot/dts/ 目录下,按架构和厂商 / 平台分类:
plaintext
arch/├── arm/boot/dts/ # ARM架构设备树
│ ├── vendor/ # 厂商目录(如freescale、ti、qcom等)
│ ├── platform/ # 平台相关设备树(如通用ARM平台)
│ ├── <具体开发板>.dts # 开发板专属设备树(如imx6ul-evk.dts)
│ └── *.dtsi # 共享头文件(可被多个.dts包含)
├── arm64/boot/dts/ # ARM64架构设备树
├── x86/boot/dts/ # x86架构设备树(主要用于嵌入式x86平台)
└── ... # 其他架构(如powerpc、mips等)
.dts文件:具体开发板或平台的设备树描述,包含硬件节点(如 CPU、外设、总线等)。.dtsi文件:设备树头文件,用于定义可复用的节点(如公共外设配置、CPU 信息),通过#include在.dts中引用。
二、
编译后的设备树二进制文件(.dtb)
编译内核时,设备树源文件会被编译为二进制格式(DTB,Device Tree Binary),存放位置为:
plaintext
arch/<架构>/boot/dts/<具体.dtb文件>
例如:
- ARM 架构:
arch/arm/boot/dts/imx6ul-evk.dtb - ARM64 架构:
arch/arm64/boot/dts/rockchip/rk3568.dtb
编译设备树的命令为:
bash
dtbsARCH架构 dtbs
三、
设备树的核心组件与组织方式
- 分层结构:
- 根节点(/):描述整个系统的基本信息(如兼容字符串、型号)。
- 总线节点(如
pci@10000000、i2c@12c0000):挂载外设的总线控制器。 - 外设节点:具体设备(如 GPIO、UART、USB 控制器)的配置,包含属性(如
compatible、寄存器地址、中断信息)。
- 复用机制:
- 通过
#include "xxx.dtsi"引用公共头文件,避免重复编写通用配置(如 CPU 型号、总线基地址)。 - 使用
&符号引用已定义的节点(如修改现有总线节点的子节点)。
- 通过
- 设备树叠加(Device Tree Overlays):
- 存放在
arch/<架构>/boot/dts/overlays/或自定义目录,用于动态修改设备树(如添加 / 删除外设节点),编译后生成.dtbo文件。
- 存放在
四、
内核配置与解析
- 内核配置选项:
- 启用设备树支持:需配置
CONFIG_OF(Device Tree Support),相关子选项在Device Drivers > Device Tree Support中。 - 具体架构可能需要额外配置(如
CONFIG_ARM_DEVICE_TREE对 ARM 架构)。
- 启用设备树支持:需配置
- 启动时加载:
- 引导程序(如 U-Boot、GRUB)加载对应的
.dtb文件,并通过启动参数(如dtb=xxx.dtb)传递给内核。 - 内核在启动阶段通过
of_init()解析 DTB,生成设备模型(struct device_node)。
- 引导程序(如 U-Boot、GRUB)加载对应的
五、
文档与工具
- 内核文档:设备树详细规范位于
Documentation/devicetree/目录,如:bindings/:各外设的设备树绑定规范(如Documentation/devicetree/bindings/gpio/)。devicetree-basics.rst:设备树基础语法和结构。
- 编译工具:
dtc(Device Tree Compiler)用于手动编译.dts到.dtb(通常由内核 Makefile 自动调用)。
总结
设备树在 Linux 内核中的存放结构清晰,按架构和厂商分层组织,源码以 .dts/.dtsi 存在,编译后生成 .dtb 供内核加载。通过复用头文件和分层描述,设备树实现了硬件无关性,简化了多平台适配。如需定制设备树,需在对应架构的 arch/<架构>/boot/dts/ 目录下编写或修改文件,并通过内核配置启用支持。