Uboot
功能
Uboot(Universal bootloader)
就是一个裸机程序,用于启动内核。不过相较于单片机程序更加复杂
相关知识补充
Uboot:Universal bootloader
XIP
:CPU
可以直接发出地址信号读取Flash/RAM
,执行指令(可以看成直接在Flash/RAM
中运行);此类Flash/RAM
称为XIP
设备
非XIP
:有时程序从SD
卡启动,CPU
无法直接读取SD
卡,需要通过emmc
控制器访问SD
卡。则SD
卡为非XIP
设备
启动过程
-
运行
Uboot
,目的是启动内核:读Flash
,将内核代码拷贝到RAM
带来了一个问题,一般单片机的RAM
使用的是SRAM
,比较小,无需初始化即可使用。而嵌入式Linux
的内存一般比较大,使用DDR
。那么就需要初始化内存。
Uboot
的工作- 初始化内存
- 初始化其他硬件:初始化时钟,然后是
Flash
- 将内核拷贝到
RAM
- 启动内核
-
启动内核:目的是为了启动应用程序
内核的工作:- 能
R/W
硬件驱动,比如Flash
(U盘,网络,LCD
,输入输出设备)驱动程序 - 能
R/W
文件,文件系统 - 找到启动APP
- 能
-
为了适配所有设备,防止引入许多冗余的配置文件,在
Uboot
中引入设备树。文件目录中有一个dtb
文件夹
Uboot = Uboot.bin + 某个dtb文件
支持非XIP
设备启动(SD
卡启动,串口启动)的过程
由于CPU
无法直接从SD
卡(非XIP
设备)读到程序(指令),但是当前又需要CPU
从SD
卡启动程序。出现了矛盾,因此引入了BRom(BootRom)
-CPU
可以直接访问。
完整启动过程:
- CPU读
BootRom
,运行BootRom
代码 BootRom
工作:Copy
:将SD
卡上的Uboot
拷贝到RAM
运行
总结
Uboot启动流程
XIP设备
CPU
直接访问Flash
,读取Uboot
代码并执行(相当于直接再FLASH
上运行):初始化内存,初始化硬件,将Flash上的内核代码拷贝到RAM。启动内核
非XIP设备
- 首先
CPU
执行BootRom
代码,将SD
卡(非XIP
)上的Uboot
拷贝到RAM
- 执行
Uboot
代码:初始化硬件(不再初始化内存,程序本身就在RAM
中),将Flash
上的内核代码拷贝到RAM
。启动内核