1、dtb文件格式
dtb文件的格式如下图 :
NOTE:不同部分顺序可能不一样
2、文件头boot_param_header
1 struct boot_param_header { 2 u32 magic;----------------用于标dtb文件头,等于OF_DT_HEADER=“0xd00dfeed” 3 u32 totalsize;------------dtb文件大小 4 u32 off_dt_struct;--------DT structure偏移 5 u32 off_dt_strings;-------DT strings偏移 6 u32 off_mem_rsvmap;-------memory reserve map偏移 7 u32 version;--------------版本号 8 u32 last_comp_version;----兼容最早版本号 9 10 /* version 2 fields below */11 u32 boot_cpuid_phys;------physical CPU id12 13 /* version 3 fields below */14 u32 size_dt_strings;------size of the strings block15 16 /* version 17 fields below */17 u32 size_dt_struct;-----------size of the DT structure block18 };
3、保留内存memory reserve map
这段保存的是一个保留内存映射列表,每个表由一对64位的物理地址和大小组成
4、device-tree structure&strings
由于某些属性(比如compatible)在大多数节点下都会存在,为了减少dtb文件大小,就需要把这些属性字符串只指定一个存储位置即可,这样每个节点的属性只需要按照位置找到属性字符串的位置就可以得到是哪个属性,所以dtb把device-tree strings单独列出来存储,下图是device-tree structure的格式,节点嵌套节点
上面的宏定义如下
1 #define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ 2 #define FDT_TAGSIZE sizeof(uint32_t) 3 4 #define FDT_BEGIN_NODE 0x1 /* Start node: full name */ 5 #define FDT_END_NODE 0x2 /* End node */ 6 #define FDT_PROP 0x3 /* Property: name off, 7 size, content */ 8 #define FDT_NOP 0x4 /* nop */ 9 #define FDT_END 0x910 11 #define FDT_V1_SIZE (7*sizeof(uint32_t))12 #define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t))13 #define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t))14 #define FDT_V16_SIZE FDT_V3_SIZE15 #define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t))
总图