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

Why Device Tree Structure (DTS) file is needed both in bootloader and kernel source code?

Bootloaders like U-Boot that do not implement the Open Firmware API, are expected to pass to the kernel a binary form of the flattened device tree - LinuxFDTBlob

为什么内核中也存在 DTS 文件?那不是多余的吗?

例如,U-boot 源代码有以下文件:
arch/arm/dts/tegra124-jetson-tk1.dts

此文件也可以在 Linux 源代码下找到:
arch/arm/boot/dts/tegra124-jetson-tk1.dts

虽然内核版本是U-boot版本的4倍,但我想知道这种冗余背后的原因。我相信维护者和开发者都更难维护和使用

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

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

以下是Artlessnoise评论的回答:

u-boot 源使用 u-boot DTB 而 Linux 在内核引导时使用 Linux DTB。 u-boot 版本是精简版,因为启动所需的外围设备不多。您始终使用 Linux 的内核版本,即 u-boot 将此版本传递给 Linux(以及加载 bzImage 或 vmlinux)。

许多 u-boot 驱动程序几乎与 Linux 相同。显然,您可以对所有 u-boot 驱动程序进行相同的论证;大多数是 Linux 驱动程序的副本,中断被轮询例程取代。使用相同的开放固件接口使它们能够更紧密地匹配。

uboot有单独的DTS文件,可以在uboot defconfig中设置为CONFIG_DEFAULT_DEVICE_TREE。这个 DTS 文件是用 uboot image 构建的,也就是说它是 uboot image 的一部分。 uboot DTS 文件的语法与 Linux 内核 DTS 文件相同。 Linux DTS文件被编译成DTB文件,单独用于Linux内核解析硬件配置。 Linux DTB 映像与 Linux 内核映像分开闪烁。