Uboot介绍
Uboot是一个开源的嵌入式系统引导程序,支持多种不同架构的板卡通过内存、SD卡或者FTP的方式加载系统。Uboot对板上的资源进行初始化使其达到满足引导操作系统的最小化要求(相当于一个小的操作系统),类似于windows系统的BIOS。
一、Uboot工作目录:
目录结构和内容,见docs.u-boot.org/en/latest/develop/directories.html中的表格。
二、Uboot的工作流程:
1. 初始化硬件资源(RAM、网卡等)
2. 从flash搬运系统的内核到RAM中
2.1. XIP:(eXcute in place,片内执行)
e.g.写在片内的falsh中 CPU可以直接在片上访问地址找到uboot程序,无需初始化。
2.2. 非XIP:
e.g.写在SD卡上(需要初始化emmc) CPU不可以直接在片上访问地址找到uboot程序,需额外的初始化片外的存储设备,以复制uboot的程序uboot.bin和设备树。相当于额外执行了一个加载uboot的加载程序(bootrom,这段程序是在片上固化的)。
3. 启动系统的内核
三、Uboot的代码执行过程:
根据架构的设置从一个汇编文件strat.s开始。然后执行lowlevel_init()、board_init_f()、board_init_r()。
四、Uboot的make编译流程:
Uboot的程序通过make指令生成一个名为uboot.bin的二进制文件,烧录到板卡的闪存之中。
1. 若板卡厂商已经提供了u-boot的支持:
STEP1:make XXX_defconfig:
根据板卡预设的信息_defconfig,生成.config文件。首先建立一个conf工具,使用Kconfig解析_defconfig的配置,如果不存在依赖,直接写入.config,如果存在依赖,从Kconfig中写入_defconfig依赖的配置到.config文件,未设置的配置使用默认值。
.config决定了uboot项目编译的过程中需要对那些目录、哪些文件进行编译,makefile中使用obj-$(CONFIG_XXXX)+= xxx/ 命令实现。还有可能需要编译文件中的某一部分,因此在make的时候会根据.config文件生成一个名为config.h的头文件,其中包含了所有的config的宏定义。在c文件中使用宏指令#if#else#endif判断编译那一部分。
可以使用以下技巧观察make的具体依赖,分析源码。
make xx -p >detail.txt
Vi detail.txt
:g/^#/d
STEP2:make ARCH=OOO CROSS_COMPILE=XXX*
根据.config生成了config.h文件,用于编译c文件的部分。生成auto.conf(auto.conf.cmd、autoconf.h、),生成uboot.cfg,autoconf.mk。最后生成uboot.bin文件。
2. 若板卡厂商未提供u-boot的支持:
需要自己设置.config文件然后make u-boot.bin文件。最后下入板中的是uboot.bin + 设备树文件(DTB)。