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

Ham*_*frq 8 arm linux-kernel embedded-linux u-boot device-tree

像U-Boot这样没有实现Open Firmware API的Bootloader,应该将平面设备树的二进制形式传递给内核 - LinuxFDTBlob

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

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

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

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

Ham*_*frq 6

以下是Artlessnoise的评论答案:

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

许多u-boot驱动程序几乎与Linux相同。显然,您可以为所有u-boot驱动程序设置相同的参数。大多数是Linux驱动程序的副本,其中的中断已由轮询例程替换。使用相同的开放式固件界面可使它们更紧密地匹配。

  • @ChrisWarth Linux 内核_使用_由 u-boot 传递的 DTB。但u-boot传递过来的DTB并不是uboot的DTB。它是内核的 D​​TB(存在于内核源代码中)。uboot 在启动期间使用 uboot DTB 来配置设备,甚至在内核加载到内存之前 (6认同)
  • 那么Linux是不是完全忽略从u-boot传递过来的设备树呢?或者linux设备树分层在u-boot设备树之上,然后linux使用该合并树?感觉这个问题从来没有得到解答。 (2认同)

小智 5

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

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

  • 是的,但如果引导加载程序和内核独立于硬件细节对我来说更有意义,即正确维护的相同设备树应该对它们都适用 (2认同)