IMX6ULL启动过程详解

网上关于IMX6ULL启动过程分析的文章已经有很多了,都大同小异,但是有些细节的地方很多文章都没有提到,最近自己又梳理了一遍这款SoC的启动过程,写下来给自己巩固一下。

首先看一下IMX6ULL这款SoC的框图:

IMX6ULL启动过程详解_第1张图片

框图的右下角,可以看到这款SoC有内部ROM和RAM,这个ROM用户不可用,因为里面存放了NXP写好的Boot ROM代码,这个代码作用是对芯片进行上电以后的各种初始化。这128K的RAM是用户可以使用的。

芯片一上电,CPU会去0x00000000地址去取指令,这个地址就是内部ROM的起始地址。

我们知道,要运行一个程序,通常都是先把程序装载到RAM中去,然后CPU去RAM中取指令,最后在CPU内部译码执行。这里芯片可以直接从ROM中取指令,说明IMX6ULL这个内部ROM是Nor Flash,Nor Flash的特点就是支持XIP(芯片内执行),我们熟知的STM32把程序烧录到Flash中然后就可以执行,也是同样的原因,STM32的Flash是Nor Flash。

再多说一点,什么叫芯片内执行?

裸机能够直接运行的是bin文件,这是最纯净的二进制文件。我们在STM32中烧录的hex文件就是在bin文件中添加了地址信息得到的。而我们在Linux中使用gcc编译链接得到的是elf文件,elf文件的内容更杂了,包含了节头表,调试信息等一大堆信息。裸机能够直接执行的是bin文件,不能执行elf文件,当有了操作系统以后,可以从elf中解析出bin文件的内容,所以在有操作系统的情况下,可以执行elf文件。我们得到的elf文件是由很多的段构成的,其中.text段存放了代码以及只读的数据,比如字符串,.data段存放已经初始化的全局变量,.bss段存放未初始化的全局变量和静态局部变量。上面说的操作系统从elf文件中解析出bin的内容,其实解析出的就是代码段和数据段内容。

芯片内执行就是代码段内容不加载到内存中去,cpu直接去Nor Flash上取指令,但是程序数据段内存放的数据,还是要装入RAM中。

话说回来,一上电执行的这些Boot ROM代码最重要的是干了什么事的呢?

1、把时钟打开,再进一步说就是配置和时钟有关的寄存器。

2、读取和启动有关的几个引脚的电平,根据这个电平确定CPU接下来要去哪里读用户代码,可以是Nand,SD卡等,这个是我们根据自己的需要进行配置的。

3、去具体介质中读用户代码到内部的RAM中去。

其中1,2都没什么说的。

第3点,读用户代码,读多少呢?如下图所示:

IMX6ULL启动过程详解_第2张图片

最后一列列出了初始加载的区域大小,以SD卡和EMMC这俩我们常用的大容量存储介质为例,Boot ROM程序都是先读4K到内部RAM中去。

这4K的数据是什么?

IVT表+Boot Data+DCD表

我们在IMX6ULL裸机开发时候,烧入存储介质中的.imx后缀的文件就是上述的三个部分+.bin文件构成的,不管是NXP原厂也好,还是正点原子,野火这些,都有工具给bin文件加上这三个部分从而得到imx文件。

IVT表全称是:Image Vector Table,其中存放的是各种地址信息,比如bin文件的起始地址(这个也叫镜像程序的入口地址,该地址由链接脚本指定,称为链接起始地址,可以是内部RAM也可以是外部DDR),Boot Data的地址,DCD表的地址等。

Boot Data包含了整个imx文件的起始地址以及整个bin文件的大小信息。

DCD表全称是:Device Config Data,其中包含的是要配置SoC的外设控制器的寄存器地址,以及要写入的值。有了DCD表,就可以初始化一部分外设了,一般要初始化外设的有GPIO,时钟,DDR。

通过这4K的信息,就知道了要把真正的bin文件放到哪里去,是内部RAM还是DDR,具体大小是多少也就知道了。

这里多说一句,如果写的是C语言裸机程序,那么除了自己的c文件以外,必须还要有一个start.S这个启动文件,就类似STM32里面的启动文件。这个启动文件用于设置处理器运行模型,设置堆栈,跳转到C程序去执行。我们知道想要运行C程序必须设置好堆栈,这里的这个.S汇编文件就是为C语言程序配置好执行环境。

以U-boot为例,此时U-boot就装入了外部DDR中,开始运行,此时CPU就会到外部DDR取指令,译码执行。之后U-Boot程序会重新设置CPU的运行状态,设置堆栈信息,然后初始化一部分外设,比如UART,LCD,以太网接口,时钟。对DDR进行详细的划分,每一部分存放什么都会规定好,然后把自己重定位到DDR的后面去,把前面的空间留出来,最后加载Linux镜像到DDR前面的空间中。至此U-Boot的生命周期结束,Linux系统开始运行。

你可能感兴趣的:(嵌入式硬件,arm,arm开发)