为什么在引导程序和内核源代码中都需要设备树结构(DTS)文件?

25
Bootloaders(如U-Boot)没有实现Open Firmware API,所以它们需要向内核传递设备树的二进制形式 - LinuxFDTBlob
为什么DTS文件也存在于内核中?这不是多余的吗?
例如,U-boot源代码有以下文件:
arch/arm/dts/tegra124-jetson-tk1.dts 这个文件也可以在Linux源代码下找到:
arch/arm/boot/dts/tegra124-jetson-tk1.dts 尽管内核版本是U-boot版本的4倍,但我想知道这种冗余背后的原因。我认为对于维护者和开发人员来说,同时使用和维护两者都更加困难。

2
这是一个问题,人们已经尝试解决相当长一段时间了 - Notlikethat
看起来他们在接近解决方案时没有完成迁移。 :| - Hamzahfrq
4
它们有不同的用途。u-boot版本允许在几个板上运行不同版本的u-boot。这是[kbuild]标签或config基础设施的一部分,正在进行中。Linux版本用于启动Linux。显然,u-boot是一个简化版,因为没有那么多外设需要启动。你可以对所有u-boot驱动程序提出同样的论点;它们大多是Linux驱动程序的副本,其中中断被轮询例程替换。为什么BSD和Linux存在?它们互相重复了吗?为什么每个项目都有自己的链接列表? - artless noise
2
@artlessnoise,从您的评论中我所理解的是,u-boot使用其dtb进行初始硬件初始化,而Linux在内核启动时使用其dtb。请再详细说明一个问题,即u-boot在引导时向Linux内核传递了哪个dtb。 - Hamzahfrq
1
u-boot源代码使用u-boot DTB。您始终使用Linux的内核版本;即,u-boot将其传递给Linux(以及加载bzImage或vmlinux)。许多u-boot驱动程序与Linux几乎完全相同。使用相同的开放固件接口使它们更加匹配。 - artless noise
@artlessnoise,谢谢你回答我的问题。如果你能将它发表出来,我可以将其选为答案。 - Hamzahfrq
3个回答

13

以下是Artlessnoise评论中的答案:

当内核启动时,u-boot源代码使用u-boot DTB,而Linux使用Linux DTB。由于不需要引导的外围设备不多,因此u-boot版本是一个简化版本。在Linux中,您始终使用内核版本,即u-boot将其传递给Linux(以及加载bzImage或vmlinux)。

许多u-boot驱动程序与Linux几乎相同。显然,对于所有u-boot驱动程序都可以提出同样的论点;大多数都是Linux驱动程序的副本,其中中断被轮询例程替换。使用相同的开放式固件接口使它们更加匹配。


2
那么Linux是否完全忽略了从u-boot传递的设备树?还是Linux设备树在u-boot设备树之上分层,然后Linux使用合并后的树?感觉这个问题从未得到回答。 - Chris Warth
1
是的,Linux会忽略在U-Boot中的设备树。Linux设备树位于内核部分之后。就像这样:U-Boot->内核->dtb->rootfs。 - seereddi sekhar
5
@ChrisWarth Linux内核“使用”由u-boot传递的设备树二进制文件(DTB)。但是,由u-boot传递的DTB不是u-boot自己的DTB,而是内核源代码中存在的内核DTB。在内核加载到内存之前,u-boot使用其自己的DTB来配置设备,内核加载后就开始使用由u-boot传递的DTB。 - Hamzahfrq
1
@Hamzahfrq 这明显澄清了事情! - 71GA

6
  1. UBoot和Linux内核是两个不同的项目,它们需要不同的副本来管理各自的项目。
  2. Linux内核也可以通过其他的引导加载程序启动。有其他的方法将DTB传递给Linux内核,例如,内核映像可以附加所需使用的DTB。

由于上述原因,复制DTS的副本是有意义的。


2
是的,但对我来说,如果引导加载程序和内核独立于硬件细节,即正确维护同一设备树应该适用于它们两个,这更有意义。 - Hamzahfrq
1
在理想的情况下,它们应该是共享的。设备树是Linux对不同公司难以维护的ARM SoC端口的答案。从技术上讲,Linux人员维护他们的DTS文件。Uboot只关心DTS的一些方面,如架构类型、内存、存储机制等;而Linux DTS需要详尽说明。现在这成为了政治和后勤问题;谁来维护什么以及在哪里;而不是技术可行性问题。个人观点是,除非ARM设备发现像PCI一样被标准化,否则这种重复将继续存在。 - Arun Valiaparambil

3

Uboot有单独的DTS文件,可以在uboot defconfig中设置为CONFIG_DEFAULT_DEVICE_TREE。这个DTS文件与uboot镜像一起构建,意味着它是uboot镜像的一部分。Uboot DTS文件的语法与Linux内核DTS文件相同。Linux DTS文件被编译成DTB文件,并单独用于Linux内核解析硬件配置。Linux DTB镜像与Linux内核镜像分开刷写。


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