Eu tive um problema ao tentar configurar os bootargs para o meu sistema linux incorporado. A árvore de dispositivos é compilada na mesma imagem que o kernel. Inclui bootargs ( /chosen/bootargs ). Além disso, preciso configurar algumas vezes no tempo de execução (uboot). Isso significa que eu preciso ser capaz de usar ambos. Eu sei que existe uma definição de configuração para o Kernel ( https://stackoverflow.com/a/48814885/11312396 ) mas isso só existe para arm ( estou usando aarch64 ).
Atualmente, estou tentando usar os comandos fdt do uboot para carregar os bootargs da árvore de dispositivos no uboot e anexá-los lá. O kernel então usa os passados pelo uboot.
O problema é obter o endereço da árvore do dispositivo. Como ele é compilado em uma árvore de imagens achatada da qual eu só sei o endereço base, não tenho o endereço do próprio blob da árvore do dispositivo. Eu posso descobrir isso manualmente usando o iminfo
comando uboot, mas o uboot não possui ferramentas para analisar a saída desse comando.
## 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+
Então eu tentei descompilar o cabeçalho, mas isso está além das minhas capacidades:
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: Existe a possibilidade de obter do despejo de cabeçalho do arquivo FIT listado acima para o endereço inicial da árvore de dispositivos (0x0370e9ac)
Não, porque está no meio do seu dump binário.
Dê uma olhada neste exemplo de análise (os deslocamentos do arquivo estão à esquerda):