嵌入式系统的启动顺序

一. 嵌入式系统启动的五个阶段以及所使用的存储器:

PBL(BL1):FLASH是SOC中的ROM,运行内存是在SOC中的RAM里;

SPL(BL2):FLASH是在EMMC上(或SD卡上),运行内存还是SOC中的RAM里;

ATF(BL31,BL32,BL33):FLASH是在EMMC上,运行内存转到PCB板上的DDR内存里了;

U-BOOT:同上;

KENERL:同上;

二. 硬件设置和软件加载

之所以分这几个步骤,是因为系统需要一步步启动硬件,加载的程序也越来越大,越来越完备。系统启动之后,所运行的最终程序是存放在PCB板上的EMMC芯片里的,比如操作系统和应用程序,而这些程序最终是要加载到PCB板上的DDR内存里来运行的。但EMMC和DDR是通过控制器连到CPU上的,因此CPU不能直接对它们进行寻址,CPU刚上电的时候不能操作这两个芯片,需要预先对EMMC和DDR的控制器进行设置。

芯片制造商在SOC中放入了两个可以直接寻址的存储器,一个是ROM,可当硬盘用,一个是SDRAM,可当内存用。在使用外部的两个大存储器之前,程序得先运行在这两个小存储器里,以便对EMMC和DDR的控制器进行设置。

1. ROM里放了PBL程序,它加载到SDRAM中之后,这一句是之前写的,是错的。ROM中放了PBL程序,但并不需要加载到SDRAM里,SOC的RAM只存放运算时的中间数据,而SOC的这个ROM是NOR flash,是可以直接寻址的,因此它可以直接运行PBL程序。所以这个SOC整个看来就相当于是一个哈佛结构的计算机,也就是程序和数据是分开放的,和8051那种结构一样!它的作用是:初始化了一下外面那个大的FLASH,也就是EMMC了,使它能用,然后把硬盘设置为EMMC了,然后从从EMMC中读取了第二个boot程序,即SBL。它还对外面的DDR内存也设置一下,但内存稍微麻烦一点,还得training一下,因此SPL还不能直接在DDR中运行,只能还加载到SOC里那个小SRAM中运行。(注:这里是对的,因为外面那个大的EMMC不能直接寻址,所以是一个很小的程序加载到SRAM里的。)

2. SPL在小SRAM中运行,对DDR进行了training,这样DDR也能用了,于是它把内存从SDRAM设置为外面大的DDR,并把EMMC中的U-BOOT(同时还会加载一个ATF,但先不提)加载进了DDR;

3. 现在相当于内存变成了DDR,硬盘变成了EMMC。其实前面两步对硬件的初始化和设置,主要针对两个存储器,即内存和硬盘。U-BOOT就可以运行在内存中了,U-BOOT的作用是初始化硬件、加载和启动操作系统、配置系统参数、支持文件系统和网络协议、提供调试和测试功能、以及实现系统更新等。初始化各种硬件设备,包括CPU、内存、硬盘、网络接口等。通过执行一系列的初始化代码,U-Boot为后续的操作系统运行准备好硬件环境。它从多种存储介质(如闪存、硬盘、网络等)加载和启动操作系统,也支持多种启动方式,如串口、网口、USB等,这使得嵌入式系统具有更高的灵活性和可配置性。在加载操作系统内核时,U-Boot会将内核映像从存储设备读取到内存中,并设置合适的启动参数(包括CPU频率、内存大小、设备接口等),然后跳转到内核的入口点,启动操作系统。U-BOOT还支持多种网络协议,使它能够通过网络下载和启动内核,文件系统等,还支持丰富的调试和测试功能如GDB和串口等,用于在开发阶段对嵌入式系统进行详细的调试和测试。

4. U-BOOT就把kernel加载进DDR了,还把设备树的地址也传给了kernel,kernel读取了DTS的设置之后,开始对PCB板上的一大堆硬件,比如摄像头,显示屏,蓝牙,wifi之类的进行设置,DTS上写了所有设备的配置信息,如地址,名称,中断,时钟之类的。对设备进行设置应该就是对设备控制器的寄存器进行写入。kernel设置好了所有的硬件之后,操作系统就能够使用这些设备了。就能够通过这些参数来驱动外设了,一套启动流程就完成了。

三. 详细步骤

上面只是主要的流程,中间bootloader还要进行一些其他的活动,比如检测设备是否可用,初始化串口,以便log信息能够显示在中控台上等she如下:

1. Pbl(Bl1), SOC上电后从内部的ROM将pbl程序加载到soc内部的dram中,然后初始化串口和内存,以便控制台能看到结果;随后soc将emmc中的spl加载到soc的sram中。

2. Spl(即bl2)进行再次初始化硬件,包括处理器时钟频率,内存控制器,时序大小等,总线i2c,spi,uart,外部存储,时钟和电源,gpio ,外设如触摸屏,显示屏控制器,音频编解码,安全环境等。并对固件程序进行检测,无问题后,再检查atf, 设备树,uboot, optee等文件的完整性。

3. 加载atf, 准备从atf(即bl31,bl32,bl33)过渡到uboot.atf 是由arm开发的,而非uboot, 芯片公司按照需要将这两种软件进行配置。bl31是atf的主要部分,负责在安全世界和非安全世界中切换,bl32就是安全世界,即optee,BL31会切换到BL32,建立了一个安全环境之后(例如指纹识别和安全支付),BL31会将BL32切换到BL33.bl33是非安全固件,可以是uboot,也可能是kernel,或者uefi固件。虽然BL32退出了,但是其建立的安全环境会一直存在,并通过SMC(安全监控指令)和后来的操作系统内核交互

4. uboot启动,开始设置bootdev,读取I2C和电源的寄存器,配置VOP,VP(通道)和图层,即用VOP来配置图层,决定哪个通道显示哪些图层,通常是不同的通道通往不同的显示器。设置各种锁相环的时钟频率,载入image,例如android,AVB,和FIT(flat image tree,是一个树形结构的image包,其中包含了kernel,设备树和根文件系统ramdisk),然后从FDT中分别加载并验证了kernel,RAMDISK(根文件系统)和fdt到内存,并启动了内核,再配置了视频路径,指定了主要图层,最后添加了内存区域,给操作系统来使用。

5. 启动了操作系统内核,开始运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值