内核如何知道要加载哪个设备树?

内核如何知道要加载哪个设备树?

设备树在 ARM 设备上运行时使用,以识别并加载正确的驱动程序及其配置。但是,例如,当我查看/proc/device-tree手机上加载的DT时,有许多与实际平台无关的配置。例如,该特定设备从未使用过也永远不会使用的大约 15 种不同的显示配置。到目前为止,我认为只有相关的 DT 被包含到内核中并加载,但似乎相关/arch源文件夹中的所有 DTS 都已加载。内核如何为平台选择正确的呢?这不是有点多余吗?

答案1

确定要加载哪个设备树 blob (DTB) 文件(从设备树源 (DTS) 编译而来)通常由引导加载程序处理。

许多设备制造商将自定义引导加载程序以添加制造商特定的代码,以自动执行确定为该硬件加载哪个 DTB 文件的任务。

一个例子U盘启动,一个常用的引导加载程序,加载一个zImage内核 imagefdt_file以及来自 SATA 设备上 FAT 分区的DTB 。它们分别加载到由loadaddr和指定的内存地址fdt_addr,然后交给 U-Boot 的bootz命令。

fatload sata 0:1 ${loadaddr} ${image};
fatload sata 0:1 ${fdt_addr} ${fdt_file};
bootz ${loadaddr} - ${fdt_addr};

U-Boot的bootz用法:

bootz [addr [initrd[:size]] [fdt]]
    - boot Linux zImage stored in memory
        The argument 'initrd' is optional and specifies the address
        of the initrd in memory. The optional argument ':size' allows
        specifying the size of RAW initrd.
        When booting a Linux kernel which requires a flat device-tree
        a third argument is required which is the address of the
        device-tree blob. To boot that kernel without an initrd image,
        use a '-' for the second argument. If you do not pass a third
        a bd_info struct will be passed instead

有关U-Boot如何处理的具体信息fdt_file,您可以参考源代码bootm_find_images, 也boot_get_fdt

您还可以尝试从 U-Boot 手册中收集一些信息:https://www.denx.de/wiki/view/DULG/UBootCmdFDT

答案2

我认为这不是因为内核加载了所有 DTS。实际上,ARM 固件映像内部可以包含多个 dts,但它仅在启动时加载 dts。您会看到冗余设备 int,/proc/device-tree因为您的设备树定义了它们。即使您的手机没有这些设备,您仍然可以定义该设备,因为这些设备无法工作并且可能会破坏您的内核。

答案3

在同一个dts目录下

DTS/{manufacturer-name}/some-dts-evb.dts

有一个Makefile,打开它,你可以看到将使用哪个.dts 文件。

dtb-$(CONFIG_ARCH_XXXXXX) += some-dts-evb.dtb

相关内容