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

Device Tree Vs .Config file | Are they different?

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

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

Device Tree Vs .Config file | Are they different?

是的,它们是不同的,在不同的时间有不同的用途。

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


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

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


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


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