1.1.计算机系统的主要部件
(1)计算机系统就是有CPU做为核心进行运行的系统。典型计算机系统有:PC机(台式机、笔记本)、嵌入式设备(手机、平板电脑、游戏机)、单片机(家用电器如电饭煲、空调)。
(2)计算机系统的组成部件非常多,不同的计算机系统组成部件不同,但是所有的计算机系统运行时所需要的核心部件都是3个东西:CPU + 外部存储器(硬盘/Flash) + 内部存储器(DDR SDRAM/SDRAM/SRAM)。
(3)未来计算机系统的发展趋势是集成度越来越高,即将CPU+普通外设+内存+外存都集成到一个硅片上,实现真正的SoC片上系统。
1.2.典型的PC机启动过程
(1)典型的PC机的部署:BIOS程序部署在PC机主板上(主板出厂时已预制),操作系统部署在硬盘上,内存在掉电时无作用,CPU在掉电时不工作。
(2)启动过程:PC上电后先执行BIOS程序(实际PC机的BIOS即NorFlash,上电即可运行,不需要初始化),BIOS负责初始化DDR内存、负责初始化硬盘,然后从硬盘上读取OS镜像到DDR内存中,然后跳转到DDR内存中执行OS即启动操作系统(OS启动后BIOS就没用了)。
1.3.典型嵌入式linux系统启动过程
(1)嵌入式系统的部署和启动机制都是参考PC机的,只是BIOS成了uboot,硬盘成了Flash。
(2)典型的嵌入式系统的部署:uboot程序部署在Flash上(Flash要能做为启动设备),OS部署在Flash上(嵌入式系统中Flash代替了硬盘),内存在掉电时无作用,CPU在掉电时不工作。
(3)启过程:嵌入式系统上电后先执行uboot,uboot负责初始化DDR内存、负责初始化Flash,然后从Flash上读取OS镜像到DDR内存中,然后跳转到DDR内存中执行OS即启动操作系统(OS启动后uboot就没用了)。
1.4.Android系统启动过程
(1)android系统启动和linux系统启动(即典型的嵌入式linux系统启动)几乎一样,两者的区别在于操作系统内核启动后加载根文件系统后不同了。
(2)启动可分为2个阶段:第1阶段是uboot到OS启动;第2阶段是OS启动后到rootfs加载到命令行执行;我们现阶段主要研究第1阶段,android系统和linux系统启动的差别在第2阶段。
1.5.uboot到底是干嘛的
(1)uboot的主要作用是用来启动操作系统内核。
(2)uboot还负责整个计算机系统的部署。
(3)uboot还要有操作Flash等板上硬件的驱动程序。
(4)uboot还需要提供一个命令行界面供人操作。
1.6.uboot从哪里来的
(1)uboot是SourceForge上的开源项目。
(2)uboot项目最早是由一个德国人发起的。
(3)uboot就是由一个人发起,然后由整个网络上所有感兴趣的人所有感兴趣的人共同维护发展而来的一个bootloader。
1.7.uboot的发展历程
(1)自己使用的小开源项目。
(2)被更多人认可使用。
(3)被SoC厂商默认支持。
(4)uboot经过多年发展,已经成为事实上的业内bootloader标准,现在大部分嵌入式设备都会默认使用uboot来做为bootloader。
1.8.uboot的版本号问题
(1)早期uboot版本格式:u-boot-1.3.4,后来uboot版本格式:u-boot-2010.06。
(2)uboot的核心部分几乎没什么变化,越新的版本支持的开发板会越多,对于老版本芯片来说,新旧版本的uboot并没有差异。例如对于s5pv210这款2012年较火的芯片来说,使用老一点的uboot版本会比较好,相对于新版本的uboot而言会少了很多的冗余的代码。
(3)关于uboot源码的获取直接百度“uboot下载”,可找到uboot官网地址(查找uboot相关信息用)和uboot的FTP地址(下载uboot源码用)。
1.9.uboot的可移植性的正确理解
(1)uboot就是universal_bootloader(通用的启动代码),通用的意思就是在各种地方都可以使用,所以说uboot具有可移植性。
(2)uboot具有可移植性是指uboot具有源代码级别的移植能力,程序员需要针对多个开发板的具体情况分别进行uboot源代码的修改移植,然后uboot可以在多个开发板上运行了,并非直接下载uboot程序到开发板直接运行。
1.10.总结
(1)uboot的出现是一种必然,如果没有uboot也会有另外的bootloader来替代。
(2)当时的年代正处于嵌入式设备井喷的年代,急需具有可移植性的bootloader出现,uboot恰好赶上了大势。
(3)总的来说uboot中的源码还是写得不错的,但是也有很多地方的代码写得比较烂,注意不要将uboot给神圣化。