瑞芯微的BOOT镜像为uImage格式的镜像,也就是 FIT (Flattened Image Tree),由UBOOT工具mkimage编译而成。

内部文件提取方式为用binwalk获取分区数据结构,然后直接用dd命令加上偏移量提取需要的文件:

binwalk boot0.img

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Flattened device tree, size: 15713958 bytes, version: 17
220           0xDC            LZ4 compressed data
94008         0x16F38         SHA256 hash constants, little endian
6051398       0x5C5646        SHA256 hash constants, little endian
6051684       0x5C5764        AES Inverse S-Box
6371072       0x613700        Certificate in DER format (x509 v3), header length: 4, sequence length: 676
6558378       0x6412AA        Certificate in DER format (x509 v3), header length: 4, sequence length: 16
7005907       0x6AE6D3        xz compressed data
8298440       0x7E9FC8        Flattened device tree, size: 89400 bytes, version: 17
8388044       0x7FFDCC        gzip compressed data, maximum compression, from Unix, last modified: 2020-12-03 06:14:33
#下面命令为提取设备树文件
dd if=boot0.img of=dtb2.dtb bs=1 skip=$((0x7E9FC8)) count=89400

  

以下是对 dd 命令中 bscountskip 这三个参数在你给出的命令中的用途解释:

1. bs=1

  • bs 表示块大小(block - size),它定义了每次读写操作的数据块的大小。在该命令中设置为 1 字节。
  • 这意味着在数据传输过程中,每次只读取或写入 1 字节的数据。在一些需要精确控制数据传输粒度的场景下很有用,比如当需要逐字节地从源文件中提取特定部分的数据到目标文件时。

2. skip=$((0x7E9FC8))

  • skip 参数用于指定在开始复制之前,跳过源文件开头的指定数量的块。在该命令中,它通过 0x7E9FC8 这个十六进制数来确定跳过的字节数。
  • 计算过程是将十六进制数 0x7E9FC8 转换为十进制数,得到 8285160。因为 bs 设置的是 1 字节,所以就是跳过源文件 boot0.img 开头的 8285160 个字节。这在想要从源文件的某个中间位置开始复制数据时非常有用,例如当你知道要复制的数据位于源文件的某个偏移位置之后。

3. count=89400

  • count 参数用来指定要复制的块的数量。在命令中设置为 89400,表示要从源文件中复制 89400 个块到目标文件。
  • 由于 bs 是 1 字节,所以总共会复制 89400×1=89400 字节的数据到目标文件 dtb2.dtb。这能精确地控制复制的数据量,避免复制过多或过少的数据。
综上所述,这条 dd 命令的作用是从 boot0.img 文件中跳过开头的 8285160 字节,然后复制接下来的 89400 字节的数据到 dtb2.dtb 文件中。这种操作常见于对文件系统镜像、固件等进行提取、修改或分析的场景,可以精确地获取或处理文件中特定位置和长度的数据。