一、为什么是uboot
1.uboot
从哪里来的?
(1)uboot
是
SourceForge
上的开源项目
(2)uboot
项目的作者:一个德国人最早发起的项目
(3)uboot
就是由一个人发起,然后由整个网络上所有感兴趣的人共同维护发展而来的一个
bootloader
。
2.
、
uboot
的发展历程
自己使用的小开源项目->被更多人认可使用->被
SoC
厂商默认支持。
总结:
uboot
经过多年发展,已经成为事实上的业内
bootloader
标准。现在大部分的嵌入式设备都会默认使用
uboot
来做为
bootloader
。
3.uboot
的版本号问题
(1)
早期的
uboot
的版本号类似于这样:
uboot1.3.4
。后来版本号便成了类似于
uboot-2010.06
。
(2)uboot
的核心部分几乎没怎么变化,越新的版本支持的开发板越多而已,对于一个老版本的芯片来说,新旧版本的
uboot
并没有差异。
4.uboot
的可移植性的正确理解
(1)uboot
就是
universal bootloader
(通用的启动代码),通用的意思就是在各种地方都可以用。所以说
uboot
具有可移植性。
(2)uboot
具有可移植性并不是说
uboot
在哪个开发板都可以随便用,而是说
uboot
具有在源代码级别的移植能力,可以针对多个开发板进行移植,移植后就可以在这个开发板上使用了。
5.总结:uboot的出现是一种必然,如果没有uboot也会有另一个bootloader来代替。
二、为什么要有uboot
1.
计算机系统:计算机系统就是有
CPU
来做核心进行运行的系统。
典型的计算机系统有:
PC
机(台式机
+
笔记本)、嵌入式设备(手机、平板电脑、游戏机)、单片机(家用电器像电饭锅、空调)。
计算机系统的组成部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是
3
个东西:
CPU + 内部存储器(DDR SDRAM/SDRAM/SRAM)+
外部存储器(
Flash/
硬盘)
2.PC
机的启动过程
(1)
典型的
PC
机的部署:
BIOS
程序部署在
PC
机主板上(随主板出厂时预制的),操作系统部署在硬盘上,内存在掉电时无作用,
CPU
在掉电时不工作。
(2)
启动过程:
PC
上电后先执行
BIOS
程序(实际上
PC
的
BIOS
就是
NorFlash
),
BIOS
程序负责初始化
DDR
内存,负责初始化硬盘,然后从硬盘上将
OS
镜像读取到
DDR
中,然后跳转到
DDR
中去执行
OS
直到启动(
OS
启动后
BIOS
就无用了)
3.典型嵌入式linux系统启动过程
(1)嵌入式系统的部署和启动都是参考PC机的。只是设备上有一些差别。
(2)典型嵌入式系统的部署:uboot程序部署在Flash(能作为启动设备的Flash)上、OS部署在Flash(嵌入式系统中用Flash代替了硬盘)上、内存在掉电时无作用,CPU在掉电时不工作。
(3)启动过程:嵌入式系统上电后先执行uboot、然后uboot负责初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(OS启动后uboot就无用了)
总结:嵌入式系统和PC机的启动过程几乎相同,只是BIOS成了uboot,硬盘成了Flash。
4.android
系统启动过程
(1)android
系统的启动和
linux
系统(前面讲的典型的嵌入式系统启动)几乎相同,只是在内核启动后加载根文件系统后不同了。
(2)
可以认为启动分为
2
个阶段:第一个阶段是
uboot
到
OS
启动;第二个阶段是
OS
启动后到
rootfs
加载到命令行执行;现在我们主要研究第一个阶段,
android
的启动和
linux
的差别在第二阶段。
5.总结:
uboot
到底是干嘛的
(1)uboot
主要作用是用来启动操作系统内核。
(2)uboot
还要负责部署整个计算机系统。
(3)uboot
中还有操作
Flash
等板子上硬盘的驱动。
(4)uboot
还得提供一个命令行界面供人来操作。
三、uboot必须解决哪些问题
1.自身可开机直接启动
(1)
一般的
SoC
都支持多种启动方式,譬如
SD
卡启动、
NorFlash
启动、
NandFlash
启动等等。uboot
要能够开机启动,必须根据具体的
SoC
的启动设计来设计
uboot
(2)uboot
必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。
uboot
中第一阶段的
start.S
文件中具体处理了这一块。
2.能够引导操作系统内核启动并给内核传参
(1)uboot
的终极目标就是启动内核。
(2)linux
内核在设计的时候,设计为可以被传参。也就是说我们可以在
uboot
中事先给
linux
内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到特定位置去取
uboot
传给他的参数,然后在内核中解析这些参数,这些参数将被用来指导
linux
内核的启动过程。
3.能提供系统部署功能
(1)uboot
必须能够被人借助而完成整个系统(包括
uboot
、
kernel
、
rootfs
等的镜像)在
Flash
上的烧录下载工作。
(2)
刷机就是利用
uboot
中的
fastboot
功能将各种镜像烧录到
iNand
中,然后从
iNand
启动。
4.能进行SoC级和板级硬件管理
(1)SoC
级(譬如串口)就是
SoC
内部外设,板级就是
SoC
外面开发板上面的硬件(譬如网卡、
iNand
)
(2)uboot
中实现了一部分硬件的控制能力(
uboot
中初始化了一部分硬件),因为
uboot
为了完成一些任务必须让这些硬件工作。譬如
uboot
要实现刷机必须能驱动
iNand
,譬如
uboot
要在刷机时
LCD
上显示进度条就必须能驱动
LCD
,譬如
uboot
能够通过串口提供操作界面就必须驱动串口。譬如
uboot
要实现网络功能就必须驱动网卡芯片。
5.uboot
的“生命周期”
(1)uboot
的生命周期就是指:
uboot
什么时候开始运行,什么时候结束运行。
(2)uboot
本质上是一个裸机程序(不是操作系统),一旦
uboot
开始
SoC
就会单纯运行
uboot
(意思就是
uboot
运行的时候别的程序是不可能同时运行的),一旦
uboot
结束运行则无法再回到
uboot
(所以
uboot
启动了内核后
uboot
自己本身就死了,要想再次看到
uboot
界面只能重启系统。重启并不是复活了刚才的
uboot
,重启只是
uboot
的另一生)
(3)uboot
的入口和出口。
uboot
的入口就是开机自动启动,
uboot
的唯一出口就是启动内核。
uboot
还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到
uboot
的命令行继续执行
uboot
命令,而启动内核命令一旦执行就回不来了。