uboot 평면화된 이미지 트리 디컴파일

uboot 평면화된 이미지 트리 디컴파일

임베디드 Linux 시스템에 대해 bootargs를 구성하는 데 문제가 있습니다. 장치 트리는 커널과 동일한 이미지로 컴파일됩니다. 여기에는 bootargs(/chosen/bootargs)가 포함됩니다. 또한 (uboot)가 실행되는 시간을 구성해야 합니다. 이는 동시에 두 가지를 모두 사용할 수 있어야 함을 의미합니다. 커널에 구성 정의(https://stackoverflow.com/a/48814885/11312396) 그러나 이것은 arm에서만 작동합니다(나는 aarch64를 사용하고 있습니다).

현재 uboot의 fdt 명령을 사용하여 장치 트리 bootargs를 uboot에 로드하고 거기에 연결하려고 합니다. 그러면 커널은 uboot가 전달한 것을 사용합니다.

문제는 장치 트리 주소를 가져오는 것입니다. 기본 주소만 알고 있는 평면화된 이미지 트리로 컴파일되기 때문에 장치 트리 Blob 자체의 주소는 없습니다. uboot 명령을 사용하여 수동으로 찾을 수 있지만 iminfouboot에는 해당 명령의 출력을 구문 분석하는 도구가 없습니다.

## 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

관련 정보