首页 理论教育U-Boot代码结构与移植方法

U-Boot代码结构与移植方法

【摘要】:U-Boot两种操作模式:启动加载模式和下载模式。当内核映像被加载到RAM之后,Bootloader的控制权被释放。总的来说,U-Boot必须解决的问题包括以下几个方面。U-Boot中第一阶段的start.S文件中具体处理了这一块。U-Boot的入口就是开机自动启动,U-Boot的唯一出口就是启动内核。

U-Boot的定位为“Universal Bootloader”,其功能比较强大,涵盖了包括PowerPC、ARM、MIPS和X86在内的绝大部分处理器构架,提供网卡、串口、Flash等外设驱动,提供必要的网络协议(BOOTP、DHCP、TFTP),能识别多种文件系统(cramfs、fat、jffs2和registerfs等),并附带了调试、脚本、引导等工具,应用十分广泛。U-boot本身是一个开源项目,由若干个.c文件和.h文件组成,配置编译之后会生成一个uboot.bin,是uboot的镜像文件。镜像文件被烧录到启动存储介质中来进行系统自举启动。

U-Boot两种操作模式:启动加载模式和下载模式。

(1)系统启动加载模式(正常的系统启动方式):加电后,自动从板子上某个固态存储设备上将操作系统加载到RAM中。

(2)下载模式(未烧写Bootloader或者对Bootloader进行更新):通过串口或网络,从主机上下载文件到内存运行,或是烧入Flash固态存储设备中。

特殊的,在ARM系统中:

●系统上电或复位时通常从地址0x00000000处开始执行,这个位置通常安排的就是系统的Bootloader。

●通过这段程序可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境设置到一个合适的状态;并为调用操作系统内核准备好正确的环境。

在启动加载模式下,通常分为这样几步:

当系统上电或复位时,CPU将PC指针指向一个特定的地址并执行该地址处的指令。

按照系统设置加载主引导程序。

主引导加载程序查找并加载次引导加载程序。

次引导加载程序加载Linux内核和可选的初始RAM空间,将控制权交给Linux内核。

运行被加载的内核,并启动用户空间应用程序。

最后一个阶段会完成启动内核并运行用户空间的init进程的功能。当内核映像被加载到RAM之后,Bootloader的控制权被释放。内核映像并不是可直接执行的目标代码,而是一个压缩过的zImage或bzImage。

zImage和bzImage映像中,并非一切都被压缩了,映像中包含未被压缩的部分,这部分中包含解压缩程序,解压缩程序会解压缩映像中被压缩的部分。

当bzImage被调用时,它从/arch/XXX/boot/head.S的start汇编例程开始执行。(www.chuimin.cn)

在第二个阶段:/init/main.c中的start_kernel()函数被调用,进入与体系结构无关的Linux内核部分,如图6.14所示。

图6.14 Linux内核目录下的Init文件夹

start_kernel()会调用一系列初始化函数来设置中断,执行进一步的内存配置。之后,/arch/XXX/kernel/process.c中kernel_thread()被调用以启动第一个核心线程,该线程执行init()函数,而原执行序列会调用cpu_idle(),等待调度。作为核心线程的init()函数完成外设及其驱动程序的加载和初始化,挂接根文件系统。

init()打开/dev/console设备,重定向stdin、stdout和stderr到控制台。之后,它搜索文件系统中的init程序,并使用execve()系统调用执行init程序。

嵌入式系统中,可以给内核传入一个简单的shell脚本来启动必需的嵌入式应用程序。至此,Linux内核引导和启动过程就结束了,而init()对应的由start_kernel()创建的第一个线程也进入用户模式。

总的来说,U-Boot必须解决的问题包括以下几个方面。

1.自身可开机直接启动

U-Boot必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。U-Boot中第一阶段的start.S文件中具体处理了这一块。

2.能够引导操作系统内核启动并给内核传参

Linux内核在设计的时候,设计为可以被传参。U-Boot可以事先给Linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到这个特定位置去取U-Boot传递的参数,然后在内核中解析这些参数,这些参数可以用来引导Linux内核的启动过程。

3.能提供系统部署功能

U-Boot必须能够被借助来完成整个系统(包括U-Boot、kernel、rootfs等的镜像)在Flash上的烧录下载工作。

U-Boot的入口就是开机自动启动,U-Boot的唯一出口就是启动内核。U-Boot还可以执行很多别的任务(比如进行系统烧录),但其他任务执行完后都可以回到U-Boot的命令行继续执行U-Boot命令,而启动内核命令一旦执行就不能返回。