为什么要有uboot
PC机的启动过程
(1)典型得到PC机的部署:BIOS程序部署在PC机主板上(随主板出厂时已经预制),操作系统部署在硬盘上,内存在掉电时无作用,CPU在掉电时不工作。
(2)启动过程:PC上电后先执行BIOS程序(实际上PC的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了)
典型嵌入式linux系统启动过程
(1)嵌入式系统的部署和启动时参考PC机,只是设备上有一些差别
(2)典型嵌入式系统的部署:uboot程序部署在Flash(能作为启动设的Flash)上,os部署在Flash(嵌入式系统中Flash替代了硬盘)上,内存在掉电时无作用,CPU在掉电时不工作
(3)启动过程:嵌入式系统上电后先执行uboot,然后uboot负责初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(OS启动后uboot就无用了)
总结
(1)Android系统的启动和linux系统几乎一致。只是在内核启动后加载跟文件系统后不一样
uboot到底是干嘛的
(1)uboot主要作用是启动操作系统内核
(2)uboot还要负责部署整个计算机系统
(3)uboot还有操作flash等板子上硬盘的驱动
(4)uboot还提供一个命令行界面给人操作
为什么是uboot
uboot的可移植的正确理解
(1)uboot就是universal BootLoader(通用的启动代码),通用的意思就是在各种地方都可以用,BootLoader具有可移植性
(2)uboot具有可移植性并不是说uboot在哪个开发板都可以随便用,而是说uboot具有在源代码级别的可移植能力,可以针对多个开发板进行移植,移植后就可以在开发板使用
Uboot必须解决的一些问题
自身可开机直接启动
(1)一般的Soc都支持多种启动方式,譬如SD卡启动,NorFlash启动,NandFlash启动等。。。。uboot要能够开机启动,必须根据具体的Soc的启动设计来设计uboot
(2)uboot必须进行和硬件相对应的代码级别的更改和移植,才能保证可以从相应的启动介质启动。uboot中第一阶段的start.s文件中具体处理了这块
能够引导操作系统内核启动并给内核传参
(1)uboot的终极目标就是启动内核
(2)linux内核在设计的时候,设计为可以被传参。也就是说我们可以在uboot中事先给linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到这个特定的位置去取uboot传给他的参数,然后再内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。
能够提供系统部署功能
(1)uboot必须能够给被人借助而完成整个系统(包括uboot,kernel,rootfs)在flash上的烧录下载工作
(2)裸机教程中刷机就是利用uboot中的fastboot功能将这种镜像烧录到iNand中,然后从iNand启动
能进行soc级和板级硬件管理
(1)uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。譬如uboot要实现刷机必须能驱动iNand,譬如uboot要在LCD上显示进度条必须驱动LCD
(2)soc(串口)级就是soc内部外设,板级就是soc外面开发板上面的硬件
uboot的“声明周期”
(1)uboot的生命周期就是指的是:uboot什么时候开始运行,什么时候结束运行。
(2)uboot本质上是一个裸机程序(不是操作系统)一旦uboot开始soc就会单纯运行uboot(意思是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行就无法再回到uboot(