系列文章目录
前言
MX6U的启动方式中有SD卡启动,但是SD卡的启动涉及一个头文件的问题。即可执行程序烧写进SD卡与可执行程序直接存储在SD卡的区别在于特定地址的头文件。因此需要讲解头文件的意义及其内容和制作。即头文件是什么?为什么?怎么做?
一、头文件(Boot Header / Head : 引导头)是什么?
名词解释
问:BootROM是什么?
答:BootROM是MX6U芯片内置的启动引导程序,它在芯片上电或复位时开始执行。BootROM程序根据外部BOOT_MODE[1:0]引脚的状态,决定芯片是内部启动模式还是串口启动模式。
![]() |
---|
图1. MX6U内部ROM和内部RAM映射表 |
问:BootROM有什么用?
答:
- 当BT_FREQ=0时,主频(ARM PLL)为396KHz,系统频率(System PLL)为528MHz,USB频率(USB PLL)为480MHz,余者见图2。反之见图2第5列。
- 内部BootROM为了加快执行速度会打开MMU和Cache;
- 下载镜像的时候L1 ICache会打开;
- 验证镜像的时候L1 DCache、L2 Cache和MMU都会打开;
- 当完成镜像验证后,BootROM会关闭L1 DCache、L2 Cache和MMU;
- 之后,BootROM启动用户代码后就可以重新设置中断向量偏移,一般会设置到用户代码开始的地址。
![]() |
---|
图2. BootROM系统时钟设置 |
问:头文件由什么组成?
答:如图3所示,由IVT和BootData组成。
![]() |
---|
图3. 启动存储器映射表,Initial Load Region(初始化加载区)即头文件(head) |
问:IVT由什么组成?
答:如图4所示。
![]() |
---|
图4. IVT(Image Vector Table)的结构内容(最后一行应当还有一个reserved2没有列出) |
问:IVT数据长度是多少?
答:IVT有8条内容,如图4所示,每条4字节,共32字节。
问:Boot Data由什么组成?
答:如图5所示。
![]() |
---|
图5. Boot Data的结构内容 |
问:头文件数据长度是多少?
答:4K字节
问:.bin文件和.imx文件之间的关系是怎样的?当我使用SD卡作为启动设备的时候。
答:
.bin文件和.imx文件之间的关系是:.bin文件是.imx文件的前身,.bin文件经过一些处理后才能得到.imx文件。
具体来说,.bin文件是裸机代码编译后得到的目标文件,它包含了嵌入式系统所需的FSBL、SSBL和其他必要的参数和镜像等信息。
而.imx文件是在.bin文件的基础上添加了一个image header而得到的,这个header主要包含IVT header、Boot data、DCD header等,整个header的大小限制为3Kbyte。这个image header主要用于在嵌入式系统中标识FSBL、SSBL和其他参数和镜像等信息的起始位置和大小,以便系统正确加载和解析这些信息。
当使用SD卡作为启动设备时,可以将.bin文件放在SD卡的FAT分区下,然后在嵌入式系统的启动过程中,通过读取SD卡中的.bin文件并解析其中的FSBL和SSBL等信息,将控制权交给SSBL来加载操作系统或者其他更高级别的应用程序。
二、为什么需要头文件
引导头提供关键启动信息:
- IVT(Image Vector Table):镜像向量表,包含了用于芯片启动的向量地址信息。
- Boot Data:包含了一些启动相关的数据,如load.imx起始地址、镜像大小等。
- 其它。
这些关键启动信息在引导头中被定义和存储,用于指导芯片正确地启动和加载系统程序。
三、怎么制作头文件(如何烧写代码时添加头文件进SD卡)?
参考正点原子“手把手教你学LINUX之ARM(MX6U)”第6.5讲“汇编LED驱动实验-烧写bin文件到SD卡”
小结
- 烧写程序给MX6U要设置启动方式
- 启动方式为SD卡时,除了要执行的主程序还要附加一段头引导程序
- 头引导程序由IVT(Image Vector Table)和BootData构成(后面还有DCD,这小节没有讲),头引导程序总共大小是4K字节
- IVT由8条4字节的数据构成,共32字节。IVT记录了一些数据段的偏移地址。
- BootData记录了load.imx的起始地址和镜像大小。