设备树与 .Config 文件 |它们不同吗?

问题描述

我将 Linux device tree 读作定义设备硬件的数据结构(存在的组件,如 I2C、USB 等)

问题:这与告诉要为内核编译的设备驱动程序的生成文件的 .config 文件有何不同,即设备中存在哪些模块?

解决方法

设备树与 .Config 文件 |它们有什么不同吗?

是的,它们是不同的,并且在不同的时间用于不同的目的。

.config 文件是内核构建过程的一个组成部分。 .config 文件是控制内核构建的数据,也就是说,它的内容被 makefile 使用。
可以自定义 .config 文件以专门为 SBC 的一个特定版本构建内核。
或者,.config 文件可以指定具有大量功能、子系统和驱动程序的内核,以支持 SBC 的各种功能和支持系列。这样的内核映像可以由任何兼容的主板启动。


.config 文件由多行配置符号组成,例如CONFIG_xxx=...
字符串或数字常量的赋值很少见,但确实存在,例如CONFIG_LOCALVERSION="my_version"CONFIG_INIT_ENV_ARG_LIMIT=32
通常赋值为 y 以确认配置项已启用。
被禁用的配置项不会被分配 n,而是被注释掉,例如# CONFIG_xxx is not set
可以为“三态”配置项分配 m 以确认该配置项已启用但构建为可加载模块(而不是静态链接,也称为内置模块)。

请注意,尽管内核源代码可能包含使用与 .config 符号相同的 CONFIG_xxx 符号的预处理器指令(例如 #ifdef 用于条件编译),但这些符号是不等价。
内核源代码不读取或使用 .config 文件。
而是将 .config 文件转换为带有 #define 的预处理器语句的 C 头文件,用于每个启用的 CONFIG_xxx 行,并存储在 include/generated/autoconf 中.h(旧版本的确切路径已更改)。
autoconf.h 文件定义了内核源代码中使用的 CONFIG_xxx 符号。
请注意,在 .config 中分配 m 的三态配置项在 autoconf.h 文件中变为 #define CONFIG_xxx_MODULE 1,而不仅仅是 {{ 1}}。


Linux 内核中只有少数 CPU 架构使用设备树。
设备树(blob)是通知执行内核其硬件环境(即目标板)的数据。它还通知内核要初始化哪些设备驱动程序(使用 #define CONFIG_xxx 1 属性字符串)。
无论有多少设备驱动程序静态链接到内核或可用作可加载模块,只有当存在引用该设备驱动程序的 DT 设备节点时才会初始化设备驱动程序(例如,请参阅 Driver code in kernel module doesn't execute?)。
(具有自识别设备的总线除外,例如 USB 和 PCI/PCIe,它们具有不同的设备驱动程序初始化程序。)


设备树在被正在执行的内核使用之前经历了几次转换。
特定电路板的 DT 源文件作为一个 .dts 和可选的 .dtsi(包含)文件存在,这些文件编译为 .dtb 文件,又名 DT blob。
它是在引导期间随内核加载的 DT blob,然后从其“扁平”组织转换为内核内存中的树结构。
内核例程,例如设备驱动程序,使用 of_*() 例程提供的方法访问 DT(其中“of”用于 Open Foundation)。