设备树与.config文件|它们有区别吗?
是的,它们是不同的,在不同的时间和目的下发挥着不同的作用。
.config文件是内核构建过程中的一个组成部分。.config文件是控制内核构建的数据,也就是说,其内容由makefiles使用。.config文件可以被定制为专门为某个特定版本的SBC构建内核。或者,.config文件可以指定一个拥有大量功能、子系统和驱动程序以支持多种能力和SBC支持家族的内核。这样的内核镜像可以被任何兼容的板子引导。
.config文件由配置符号行组成,例如CONFIG_xxx=...。字符串或数值常量的分配很少见,但确实存在,例如CONFIG_LOCALVERSION="my_version"和CONFIG_INIT_ENV_ARG_LIMIT=32。通常,分配为y以确认配置项已启用。禁用的配置项未分配n,而是注释掉,例如# CONFIG_xxx is not set。可以将“tristate”配置项分配为m以确认该配置项已启用,但作为可加载模块(而不是静态链接,即内置)进行构建。
请注意,尽管内核源代码可能包含预处理器指令(例如条件编译的#ifdef),利用与.config符号相同的CONFIG_xxx符号,但这些符号并不等同。内核源代码不读取或使用.config文件。相反,.config文件被转换为一个C头文件,其中包含每个启用的CONFIG_xxx行的预处理器语句和一个#define,并存储在include/generated/autoconf.h中(对于旧版本,确切路径已更改)。正是autoconf.h文件定义了内核源代码中使用的CONFIG_xxx符号。请注意,将在.config中分配为m的tristate配置项,在autoconf.h文件中变为#define CONFIG_xxx_MODULE 1,而不仅仅是#define CONFIG_xxx 1。
设备树(Device Tree)仅被 Linux 内核中少数 CPU 架构使用。
设备树(blob)是用于告知正在执行的内核其硬件环境(即目标板)的数据。它还通过使用“compatible”属性字符串告知内核要初始化哪些设备驱动程序。
无论有多少设备驱动程序静态链接到内核或可用作可加载模块,只有在存在引用该设备驱动程序的 DT 设备节点时才会初始化设备驱动程序(例如,请参见
Driver code in kernel module doesn't execute?)。
(例外情况是具有自我识别设备的总线,例如 USB 和 PCI/PCIe,它们有不同的过程来初始化其设备驱动程序。)
设备树在被执行的内核利用之前需要经过几个转换步骤。
特定板子的 DT 源文件存在于一个
.dts和可选的
.dtsi(包含)文件中,这些文件编译成一个
.dtb文件,也称为 DT blob。
在引导期间,内核将加载 DT blob,然后将其从“平面”组织转换为内核内存中的树形结构。
内核例程(例如设备驱动程序)使用由
of_*()例程提供的方法访问 DT(其中“of”代表开放基金会)。