我在尝试为我的嵌入式 linux 系统配置 bootargs 时遇到了问题。设备树被编译成与内核相同的映像。它包括引导参数 ( /chosen/bootargs )。此外,我需要在(uboot)运行时配置一些时间。这意味着我需要能够同时使用两者。我知道内核有一个配置定义(https://stackoverflow.com/a/48814885/11312396),但这仅适用于arm(我使用的是aarch64)。
我目前正在尝试使用 uboot 的 fdt 命令将设备树引导参数加载到 uboot 中并将它们附加到那里。然后内核使用 uboot 传递的那些。
那里的问题是获取设备树地址。因为它被编译成一个扁平化的图像树,我只知道它的基地址,我没有设备树 blob 本身的地址。我可以通过使用iminfo
uboot 命令手动找到它,但 uboot 没有工具来解析该命令的输出。
## Checking Image at 03000000 ...
FIT image found
FIT description: U-Boot fitImage for Ultra96 kernel
Image 0 (kernel@0)
Description: Linux Kernel
Type: Kernel Image
Compression: gzip compressed
Data Start: 0x030000d4
Data Size: 7399390 Bytes = 7.1 MiB
Architecture: AArch64
OS: Linux
Load Address: 0x00080000
Entry Point: 0x00080000
Hash algo: sha1
Hash value: 47edccde80d64c636a01dbf4916662e2cdbfda96
Image 1 (fdt@0)
Description: Flattened Device Tree blob
Type: Flat Device Tree
Compression: uncompressed
Data Start: 0x0370e9ac
Data Size: 41889 Bytes = 40.9 KiB
Architecture: AArch64
Hash algo: sha1
Hash value: d977763b2ec8079aca8908b28c732c3a79e1f7ab
Default Configuration: 'conf@1'
Configuration 0 (conf@1)
Description: Boot Linux kernel with FDT blob
Kernel: kernel@0
FDT: fdt@0
## Checking hash(es) for FIT Image at 03000000 ...
Hash(es) for Image 0 (kernel@0): sha1+
Hash(es) for Image 1 (fdt@0): sha1+
所以我试图自己反编译它的标题,但这有点超出我的能力:
03000000: edfe0dd0 98907100 38000000 988e7100 .....q.....8.q..
03000010: 28000000 11000000 10000000 00000000 ...(............
03000020: 6c000000 608e7100 00000000 00000000 ...l.q.`........
03000030: 00000000 00000000 01000000 00000000 ................
03000040: 03000000 04000000 5c000000 e1e8455c ...........\\E..
03000050: 03000000 23000000 00000000 6f422d55 .......#....U-Bo
03000060: 6620746f 6d497469 20656761 20726f66 ot fitImage for
03000070: 72746c55 20363961 6e72656b 00006c65 Ultra96 kernel..
03000080: 03000000 04000000 0c000000 01000000 ................
03000090: 01000000 67616d69 00007365 01000000 ....images......
030000a0: 6e72656b 30406c65 00000000 03000000 kernel@0........
030000b0: 0d000000 00000000 756e694c 654b2078 ........Linux Ke
030000c0: 6c656e72 00000000 03000000 dee77000 rnel.........p..
030000d0: 1b000000 00088b1f 00000000 5bec0302 ...............[
030000e0: d754540d f7bfff9d 23010f86 c087c332 .TT........#2...
030000f0: 8c0199d9 59ac493a e4688106 d1a260cd ....:I.Y..h..`..
TLDR:是否有可能从上面列出的 FIT 文件头转储到设备树的起始地址 (0x0370e9ac)
不,因为它位于二进制转储的中间。
看一下这个解析示例(文件偏移量在左边):