組み込みLinuxシステム用のbootargsの設定に問題があります。デバイスツリーはカーネルと同じイメージにコンパイルされます。これには bootargs(/chosen/bootargs) が含まれます。また、(uboot)が実行される時間を設定する必要があります。これは、同時に両方を使用できる必要があることを意味します。カーネルに構成を定義する(https://stackoverflow.com/a/48814885/11312396)しかし、これはarmでのみ動作します(私はaarch64を使用しています)。
現在、ubootのfdtコマンドを使用してデバイスツリーbootargsをubootにロードし、そこに接続しようとしています。その後、カーネルはubootが渡したものを使用します。
問題は、デバイスツリーアドレスを取得することです。ベースアドレスのみを知っているフラット化されたイメージツリーにコンパイルされるため、デバイスツリーBLOB自体のアドレスはありません。 ubootコマンドを使用して手動で見つけることができますが、iminfo
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)にダンプすることは可能ですか?
答え1
いいえ、バイナリダンプの途中にあるからです。
この構文解析の例を見てください(ファイルオフセットは左側にあります)。
00000000 Magic: D00DFEED FDT File OK
00000004 File Size: 002C076C
00000008 DT Struct Offset: 00000038
0000000C DT Strings Offset: 002C0564
00000010 Mem RsvMap Offset: 00000028
00000014 Version: 00000011
00000018 Last Compatible Vers: 00000010
0000001C Boot CPU_ID: 00000000
00000020 DT Strings Size: 0000006C
00000024 DT Struct Size: 002C052C
00000038
00000040 timestamp = 18/01/2019 12:25:33
00000050 description = Jackal Kernel Image generated with Linux kernel and FDT blob
0000009C #address-cells = 0x00000001
000000AC images
000000B8 kernel@1
000000C8 description = Linux kernel
000000E4 data = 2872840 Bytes [000000F0-002BD6F7]
002BD6F8 type = kernel
002BD70C arch = arm
002BD71C os = linux
002BD730 compression = none
002BD744 load = 0x03000000
002BD754 entry = 0x03000000
002BD764 hash@1
002BD770 value = 29684CCAA0B89E0C9B9E2AB47B120CB0
002BD78C algo = md5
002BD7A4 fdt@1
002BD7B0 description = Device Tree
002BD7C8 data = 11376 Bytes [002BD7D4-002C0443]
002C0444 type = flat_dt
002C0458 arch = arm
002C0468 compression = none
002C047C hash@1
002C0488 value = 062502B2C222FE1547BDA6118C6FC1EE
002C04A4 algo = md5
002C04C0 configurations
002C04D4 default = config@1
002C04EC config@1
002C04FC description = Boot Linux kernel with FDT blob
002C0528 kernel = kernel@1
002C0540 fdt = fdt@1