[IMX] 01.IVT 表长度计算
目录
1.IVT 表起始位置(SD/EMMC)
2.IVT 表的结构
3.Boot Data 大小
4.地址计算
1.IVT 表起始位置(SD/EMMC)
SD 卡起始 1K 字节大小的空间用于存储 SD 卡自身相关信息,因此 IVT 表在 SD 卡中的偏移量为 0x400,IVT 表加上 SD 卡头部的总大小为 4K 字节,所以,镜像可使用的空间为 3K 字节:
IVT + Boot Data + DCD 的总大小为 4KByte - 1KByte = 3KByte
若 SD/EMMC 每个扇区为 512 字节,则 load.imx 应该从第三个扇区开始烧写,前两个扇区要空出来存放 SD 卡自身的头部信息
load.imx 中从第 3K 字节开始才是真正的 .bin 文件
2.IVT 表的结构
IVT 表包含 8 个字段,每个字段占用 32-bit,因此 IVT 表的总长度为 32-bytes:
3.Boot Data 大小
Boot Data 包含以下三个字段:
每个字段占 32-bit,因此 Boot Data 在 IVT 表中所占大小为:(32 * 3) / 8-bit = 12-bytes(0x0C)
4.地址计算
手册中这部分内存分布的图形描述如下所示:
-
从官方 U-Boot 中得到程序执行的起始位置为 0x87800000,即 .bin 的起始地址为 0x87800000;
-
初始加载区域的大小为 4KBytes,SD/EMMC 自身的信息占用 1KBytes,剩余空间为 3KBytes(0xC00),这部分空间用于存储 IVT + Boot Data + DCD;
-
load.imx 文件包含了 IVT + Boot Data + DCD + .bin(即 3KBytes + .bin),而 .bin 的起始地址为 0x87800000,因此,IVT + Boot Data + DCD 的起始地址为 0x87800000 - 0xC00 = 0x877FF400;
-
load.imx 的头部 32-bytes 存储 IVT 表(大小 0x20),即 IVT 表的起始位置为 0x877FF400;
-
紧跟其后的 Boot Data 数据占用 12-bytes(大小 0xC),即 Boot Data 的起始位置为 0x877FF400 + 0x20 = 0x877FF420
-
再之后才是存储的 DCD 数据,因此 DCD 数据的起始位置为 0x877FF420 + 0xC = 0x877FF42C;
-
一般 IVT + Boot Data + DCD 不会将 3KBytes 全部用完,多余空间的值为 0;
完整的内存分布如下所示:
IMX6ULL 规定镜像大小不能大于 2MBytes,教程中使用全部的空间,即 SD Header + IVT + ... + .bin 的可用大小为 2MBytes,即0x200000
正点原子开发板的 DDR 起始地址为 0x80000000,ARM Cortex-A7 的栈内存为向下增长的方式,因此在编写程序设置 SP 栈指针时,将值设置为 0x80200000,即从该地址开始取数据