IMX头部详细解析之一 头部组成

本文详细介绍了i.MX处理器的IMX镜像组成,特别是映像向量表(IVT)和启动数据(Boot Data)的结构。IVT包含了用户程序入口地址、DCD地址等关键信息,而Boot Data则涉及启动时的地址和镜像大小。此外,DCD部分用于配置设备寄存器,通过Write和Check Data Command等命令进行设置。

镜像组成

完整的imx镜像由以下四部分组成:

  • Image Vector Table(映像向量表)
  • Boot Data(启动数据)
  • Device Configuration Data(设备配置数据)
  • User Code & Data(用户代码与数据)

IVT

映像向量表(IVT)是SOC的内部BootRom从BootDevice中读取的一组数据信息,该数据中指定了运行时各部分组件的地址。
IVT中包含了用户应用的入口地址,DCD部分的运行时地址,Boot Data的运行时地址等。
内部BootRom根据Boot Device不同对IVT的起始地址有所规定,IVT相对及地址的偏移和初始化加载大小如下:

Boot Device Type Image Vector Table Offset Initial Load Region Size
NOR 4Kbyte Entire Image Size
NAND 1Kbyte 4Kbytes
OneNAND 256bytes 1Kbytes
SD/MMC/eSD/eMMC/SDXC 1Kbytes 4Kbytes
I2S/SPI EEPROM 1Kbytes 4Kbytes
SATA 1Kbytes 4Kbytes

BootRom只需要知道IVT的地址,其他的组成部分的地址则可以根据IVT中查询到。
以下为BootDevice中IVT在运行时,各成员的实际运行地址。
8f5431ab-e046-4ee9-8dec-f35d4264e8ec

IVT具体结构如下,每个成员均为32bit

<think>我们正在讨论U-Boot的IVT/DCD头部结构。根据引用[1]和引用[2],我们可以总结如下: 引用[1]提到:bin文件前面添加的头部信息包括IVT、boot data、DCD等,总大小3KB。其中Boot Data有3条(每条4字节),DCD最大1768字节,IVT占32字节。DCD的作用是初始化外设(寄存器地址和对应的数据成对出现)[^1]。 引用[2]详细描述了IVT(Image Vector Table)的结构(以i.MX 6ULL为例)[^2]: | 字段 | 偏移量 | 大小(字节) | 描述 | |------------------|--------|--------------|----------------------------------------| | IVT Header | 0x00 | 4 | 固定值0x402000D1,标识有效IVT | | Entry Address | 0x04 | 4 | 代码入口点地址(如U-Boot的起始地址) | | Reserved1 | 0x08 | 4 | 保留字段,必须为0 | | DCD指针 | 0x0C | 4 | 指向DCD(Device Configuration Data)的地址 | | Boot Data指针 | 0x10 | 4 | 指向Boot Data的地址(如QSPI配置参数) | | Self Pointer | 0x14 | 4 | IVT自身的地址(用于自检) | | CSF指针 | 0x18 | 4 | 指向安全认证数据(如HAB签名) | | Reserved2 | 0x1C | 4 | 保留字段,必须为0 | 根据以上信息,我们可以对IVT/DCD头部进行定义和介绍: ### 1. **IVT(Image Vector Table)** IVT是BootROM在启动时查找的**关键数据结构**,位于镜像的固定偏移位置(不同处理器要求不同,常见的有0x400、0x1000等)。其核心作用是为BootROM提供程序加载和执行的元信息。 #### 关键字段解析: - **IVT Header**:固定魔数,例如`0x402000D1`(i.MX系列),用于验证IVT有效性。 - **Entry Address**:程序入口地址,即U-Boot的`_start`符号地址。 - **DCD指针**:指向DCD配置数据的地址。若为0则表示无DCD。 - **Boot Data指针**:指向Boot Data结构,包含镜像加载地址、大小等信息。 - **Self Pointer**:IVT自身的地址,用于BootROM校验。 - **CSF指针**:用于安全启动,指向认证数据(如未启用安全启动则为0)。 ### 2. **DCD(Device Configuration Data)** DCD是**外设初始化脚本**,由一系列寄存器配置命令组成。BootROM在加载U-Boot前会执行DCD命令,初始化DDR、时钟等关键外设。 #### DCD命令结构[^1]: 每条DCD命令包含: - **操作类型**:写寄存器(最常见)、检查寄存器值等。 - **寄存器地址**:要配置的外设寄存器物理地址。 - **配置值**:写入寄存器的数据。 示例(伪代码): ``` DCD命令 = [ { type: WRITE, address: 0x020C4018, value: 0x00000017 }, // 配置时钟 { type: WRITE, address: 0x020E04B4, value: 0x000C0000 }, // 配置GPIO ... ] ``` ### 3. **Boot Data结构** Boot Data包含镜像加载的元信息,其结构如下: | 字段 | 偏移量 | 大小(字节) | 描述 | |------------------|--------|--------------|---------------------| | 镜像起始地址 | 0x00 | 4 | 镜像在内存中的加载地址 | | 镜像大小 | 0x04 | 4 | 镜像大小(字节) | | 插件标志 | 0x08 | 4 | 保留,通常为0 | ### 4. **完整头部布局示例** 一个典型的U-Boot镜像头部布局(总大小3KB)[^1]: ``` 0x0000: [ IVT (32字节) ] 0x0020: [ Boot Data (12字节) ] 0x002C: [ DCD (最大1768字节) ] ... [ 填充至3KB边界 ] 0x0C00: [ U-Boot代码起始 ] ``` ### 5. **技术原理** BootROM启动流程: $$ \text{BootROM} \xrightarrow{\text{读取IVT}} \begin{cases} \text{解析DCD} \rightarrow \text{初始化外设} \\ \text{加载镜像到内存} \rightarrow \text{跳转至Entry Address} \end{cases} $$ - **DCD的必要性**:U-Boot运行前需初始化DDR等硬件,而BootROM通过DCD实现此操作。 - **地址对齐**:IVT位置必须严格对齐处理器要求(例如i.MX6ULL要求IVT在SD卡的0x400处)[^2]。 > 📌 **调试建议**: > 使用`hexdump`查看镜像头部: > ```bash > hexdump -C u-boot.imx | head -n 20 > ``` > 观察前3KB数据是否符合IVT/DCD结构。 §§相关问题§§ 1. 如何使用工具解析U-Boot镜像中的DCD内容? 2. 不同NXP处理器(i.MX6 vs i.MX8)的IVT结构有何差异? 3. DCD配置错误会导致哪些启动故障?如何调试? 4. 如何修改U-Boot的DCD配置以适应自定义硬件? </think>### IVT/DCD头部详解:结构与功能解析 #### 1. **IVT(Image Vector Table)结构定义** IVT是BootROM加载U-Boot的**导航表**,包含处理器启动所需的关键指针(以NXP i.MX系列为例)[^2]: | 字段 | 偏移量 | 大小(字节) | 描述 | |------------------|--------|--------------|----------------------------------------| | **IVT Header** | 0x00 | 4 | 固定标识 `0x402000D1`(i.MX6系列标志) | | **Entry Address**| 0x04 | 4 | 程序入口地址(U-Boot的`_start`符号) | | **Reserved1** | 0x08 | 4 | 保留字段(必须为0) | | **DCD Pointer** | 0x0C | 4 | 指向DCD配置数据的地址 | | **Boot Data Ptr**| 0x10 | 4 | 指向Boot Data结构(镜像加载信息) | | **Self Pointer** | 0x14 | 4 | IVT自身的地址(用于自检) | | **CSF Pointer** | 0x18 | 4 | 安全认证数据指针(HAB签名) | | **Reserved2** | 0x1C | 4 | 保留字段(必须为0) | **技术特性**: - 总大小固定为 **32字节** - 必须在存储介质的**固定偏移**出现(如SD卡中的`0x400`) - `Entry Address`指向U-Boot第一条指令:$$ \text{Entry} = \text{LOAD\_ADDR} + \text{IVT\_OFFSET} + 0x1000 $$ #### 2. **DCD(Device Configuration Data)功能解析** DCD是**硬件初始化脚本**,由BootROM在加载U-Boot前执行[^1]: ```c // DCD数据结构示例 struct dcd_entry { uint32_t address; // 寄存器物理地址 uint32_t value; // 配置值 }; // 典型DCD命令序列 dcd_entry dcd_table[] = { {0x020C4018, 0x00000017}, // 配置时钟寄存器 {0x020E04B4, 0x000C0000}, // 配置GPIO {0x020E04AC, 0x00000000} // 关闭看门狗 }; ``` **核心作用**: 1. 初始化关键外设:DDR控制器、时钟树、引脚复用 2. 配置内存时序参数(tRFC、tWR等) 3. 禁用安全限制(如关闭看门狗) 4. **最大允许尺寸**:1768字节(约束来自BootROM缓冲区) #### 3. **Boot Data结构** 包含镜像加载元信息(12字节)[^1]: | 字段 | 描述 | |------------------|---------------------| | **Start Address**| 镜像在内存中的加载地址 | | **Image Size** | 镜像大小(字节) | | **Plugin Flag** | 扩展标志(通常为0) | #### 4. **完整头部布局** 典型3KB头部组合方式: ``` 0x0000: [ IVT (32字节) ] 0x0020: [ Boot Data (12字节) ] 0x002C: [ DCD (可变长度,最大1768字节) ] 0x06C0: [ 填充区(对齐至3KB边界) ] ``` 头部总大小计算公式: $$ \text{HeaderSize} = \text{IVT} + \text{BootData} + \text{DCD} + \text{Padding} = 3\text{KB} $$ #### 5. **技术原理与启动流程** BootROM执行序列: ```mermaid graph TD A[BootROM上电] --> B{检测启动介质} B -->|SD卡| C[读取SD卡0x400处IVT] B -->|NAND| D[读取NAND 0x0处IVT] C/D --> E[解析DCD指针] E --> F[执行DCD硬件初始化] F --> G[加载镜像到内存] G --> H[跳转到Entry Address] ``` > 💡 **调试提示**: > 使用`hexdump`查看头部结构: > ```bash > hexdump -C u-boot.imx -n 3072 | less # 查看前3KB数据 > ``` > 验证关键字段: > - 字节 0-3:IVT Header 应为 `D1 00 20 40`(小端序) > - 字节 12-15:DCD指针非零表示存在初始化脚本
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值