【Linux-设备树】.dtb文件的反汇编

dtb文件的格式如下图

 

NOTE:不同部分顺序可能不一样

文件头boot_param_header


struct boot_param_header {
u32 magic;----------------用于标dtb文件头,等于OF_DT_HEADER=“0xd00dfeed”
u32 totalsize;------------dtb文件大小
u32 off_dt_struct;--------DT structure偏移
u32 off_dt_strings;-------DT strings偏移
u32 off_mem_rsvmap;-------memory reserve map偏移
u32 version;--------------版本号
u32 last_comp_version;----兼容最早版本号 /* version 2 fields below */
u32 boot_cpuid_phys;------physical CPU id /* version 3 fields below */
u32 size_dt_strings;------size of the strings block /* version 17 fields below */
u32 size_dt_struct;-----------size of the DT structure block };

保留内存memory reserve map

这段保存的是一个保留内存映射列表,每个表由一对64位的物理地址和大小组成

device-tree structure&strings

由于某些属性(比如compatible)在大多数节点下都会存在,为了减少dtb文件大小,就需要把这些属性字符串只指定一个存储位置即可,这样每个节点的属性只需要按照位置找到属性字符串的位置就可以得到是哪个属性,所以dtb把device-tree strings单独列出来存储,下图是device-tree structure的格式,节点嵌套节点

 

上面的宏定义如下


<span class="hljs-preprocessor">#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */
#define FDT_TAGSIZE sizeof(uint32_t)
#define FDT_BEGIN_NODE 0x1 /* Start node: full name */
#define FDT_END_NODE 0x2 /* End node */
#define FDT_PROP 0x3 /* Property: name off, size, content */
#define FDT_NOP 0x4 /* nop */
#define FDT_END 0x9
#define FDT_V1_SIZE (7*sizeof(uint32_t))
#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t))
#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t))
#define FDT_V16_SIZE FDT_V3_SIZE
#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t))</span>

总图

 

接下来在使用设备树时我们将**.dts文件利用dtc编译器编译为**.dtb文件。

在已知**.dtb文件的情况下我们有两种方法可以得到dts源码:

方法一:使用fdtdump工具进行反汇编

使用命令:root#fdtdump **.dtb > temp.dts

反汇编生成的内容保存在temp.dts

方法二:使用dtc编译器进行反汇编

dtc -h 可以产看dtc命令的帮助

使用命令:root# dtc -I dtb -O dts -o temp1.dts s5pv210-smdkv210.dtb

Leave a Reply