设备树和.config文件有什么区别?它们不同吗?

3
我了解到,Linux设备树是一种数据结构,用于定义设备的硬件信息(例如I2C、USB等组件)。
问题:这与.config文件有何不同?.config文件告诉make-file要为内核编译哪些设备驱动程序,即该设备中存在哪些模块?

编译到内核中的驱动程序与实际存在于系统上的设备无关。当然,两者都必须存在才能使设备正常工作。 - stark
1
设备树是描述物理设备的平台描述。配置文件涉及软件中存在的设备驱动程序,可能驱动平台上运行的设备。 - 0andriy
@0andriy,我仍然不明白区分这两者的动机。设备树带来了哪些设备驱动程序没有提供的价值呢? - BiologyEnthusiast
@stark,我不明白为什么编译到内核中的驱动程序与系统上存在的设备无关。没有驱动程序,设备就没有意义。 - BiologyEnthusiast
1个回答

3
设备树与.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”代表开放基金会)。

非常好的解释!如果措辞不是“或者.config文件可以指定一个具有各种功能、子系统和驱动程序的内核,以支持SBC家族的各种能力和支持”,那么我可能会有点困惑。而且,“无论有多少设备驱动程序被静态链接到内核中或作为可加载模块可用,只有在存在引用该设备驱动程序的DT设备节点时,设备驱动程序才会被初始化。”这两个句子基本上是一样的吗?我可以通过发出“make menuconfig”命令手动选择要初始化的设备。我会再读一遍答案。 - BiologyEnthusiast
1
@BiologyEnthusiast -- “我可以通过手动选择设备来初始化,只需发出 .make menuconfig 命令”-- 不,那只能控制构建哪些设备。哪些驱动程序被 初始化 是由板子的 DT 确定的。请参阅 https://dev59.com/7oXca4cB1Zd3GeqPCgl7。DT 仅具有实际存在于板子上的设备节点(应是构建的驱动程序的子集)!你引用的两个句子不同,但互补。 - sawdust
太有道理了!我以为构建的就是初始化的!句子“应该是已构建驱动程序的子集”帮助我理解了它!谢谢! - BiologyEnthusiast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接