ARM启动过程中的小秘密

学过嵌入式、玩过开发板的同学可能都知道这些常识:我们的 ARM 开发板有多种启动方式,可以从 NOR Flash 启动、可以从 NAND Flash 启动、也可以从 SD卡启动。当系统上电后,ARM 会从 U-boot 启动,然后 U-boot 将自身代码拷贝到内存 DDR SDRAM 中,接着PC指针指向内存,从内存中不断地取指令、翻译指令、运行指令。

然而,现实果真如此吗?U-boot 是系统上电运行的第一行代码吗?ARM 支持多种启动方式是如何实现的?
很多资料或者手册上可能都没有提及到这个话题,或者一笔带过。今天就给大家扒一扒芯片启动过程中的那些小秘密。

其实,在现代 ARM 处理器中,U-boot 并不是系统上电运行的第一行代码。一般在芯片 SOC 内部,会集成一片 ROM,在 ROM 上会固化一段启动代码,如下图:

系统上电后,会首先运行固化在芯片内部的这部分 ROMCODE 代码。这部分代码的主要工作就是初始化存储接口、建立存储映射。它首先会根据CPU外部管脚或eFuse值来判断系统的启动方式:NOR、NAND 还是 SD 卡启动。
如果我们设置系统从 NOR Flash 启动,这段代码就会将 NOR Flash 映射为零地址,然后系统复位,跳转到 U-boot 的中断向量表中的第一行代码,即 NOR Flash 中的第一行代码去执行。
如果我们设置系统从 NAND Flash 或SD卡启动,我们知道除了 SDRAM 和 NOR Flash 支持随机读写,可以直接运行代码外,其它的Flash设备是不支持直接运行代码的,只能将代码拷贝到内存中执行。因为此时DDR内存还没有初始化,所以一般会先将 NAND Flash 或 SD 卡中的一部分代码(前4K)拷贝到芯片内部的 SRAM 中去执行,然后在这4K代码中再进行各种初始化、代码拷贝等工作,最后系统才会跳到 SDRAM 内存中去执行代码。

由此可见,CPU 并不是万能的,它里面除了一些寄存器、逻辑算术运算单元,也没有什么复杂的逻辑了。很多不同的启动方式需要我们通过CPU管脚来设置,需要我们自己写程序进行判断。这些程序写好之后是固化在芯片内部的,出厂时固化在芯片内部,无法更改。因此,这部分启动流程相对于芯片使用者、开发者来说是无须关心的,我们只需要按照芯片手册设置自己的启动方式就可以了。

小结

本文主要给大家科普了ARM启动过程中,系统上电复位之前的一点小秘密:包括系统启动模式选择、存储映射、代码拷贝等一些基本流程。这些准备工作做好之后,才会发生系统复位,跳转到我们ARM的中断向量表去执行。通过本节学习,相信大家对嵌入式系统的整体启动流程的理解会有一个更完整的认识。

一线原厂驱动开发经验,专门为嵌入式精心打造的嵌入式进阶视频教程,详情请点击:王利涛老师个人店