前言
一个完整的linux系统,通常需要一个引导启动它的bootloader,而我们最常用的就是Uboot。uboot启动分为两个阶段,即boot + loader,boot阶段启动系统,初始化硬件设备,建立内存空间映射图,将系统的 软硬件带到一个合适的状态,loader阶段将操作系统内核文件加载至内存,之后跳转到内核所在地址运行。
一、嵌入式中的Uboot
当一个开发板上电的时候,即使是执行非常简单的程序,都需要进行很多初始化的 操作,如初始化时钟、初始化存储控制器、将代码拷贝到运行内存中等操作,大多数 处理器在上电的时候都会有默认的指令执行位置,如ARM架构的处理器会从0x00000000地址开始读取第一条指令。
一般来说BootLoader必须提供系统上电时的初始化代码,在系统上电时初始化相关 环境后,BootLoader需要引导完整的操作系统,然后将控制器交给操作系统。 简单来说BootLoader是一段小程序,它在系统上电时执行,通过这段小程序可以将硬件 设备进行初始化,如CPU、SDRAM、Flash、串口、网络等,初始化完毕后调用操作系统内核。 另外,某些BootLoader可能含有一些高级特性,如校验操作系统镜像,从多个操作系统镜像中选择引导合适的操作系统, 甚至可以添加网络功能,让系统自主从网上寻找合适的镜像并且进行引导等等。
boot的启动有两个模式:启动模式和下载模式
当系统开机之后,在开机界面会有个数字倒计时,若倒计时结束没有进行操作,uboot启动默认的操作系统,并将控制块交给操作系统。若倒计时结束之前有操作,比如按下回车键,就会进入下载模式,开发者可以在下载模式下使用uboot命令自由操控uboot。
二、U-Boot启动内核
U-Boot启动内核的过程可以分为两个阶段
第一阶段:
硬件设备初始化。
加载U-Boot第二阶段代码到RAM空间。
设置好栈。
跳转到第二阶段代码入口。
第二阶段:
初始化本阶段使用的硬件设备。
检测系统内存映射。
将内核从存储区域(Flash、SD Card、eMMC)读取到RAM中。
为内核设置启动参数。
调用内核。