计算机系统的组成部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是3个东西:CPU + 外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM)。而一般的PC机启动过程为:PC上电后先执行BIOS程序(实际上PC的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了)。
嵌入式系统和PC机的启动过程几乎没有两样,只是BIOS成了uboot,硬盘成了Flash,大多数处理器在上电的时候都会有默认的指令执行位置,如ARM架构的处理器会从0x00000000地址开始读取第一条指令。
Boot Loader
简单来说BootLoader是一段小程序,它在系统上电时执行,通过这段小程序可以将硬件设备进行初始化,如CPU、SDRAM、Flash、串口、网络 等,初始化完毕后调用操作系统内核 。
每种不同的 CPU 体系结构都有不同的Boot Loader。有些 Boot Loader 也支持多种体系结构的 CPU,比如 U-Boot 就同时支持** ARM ** 体系结构和MIPS 体系结构。除了依赖于 CPU的体系结构外,Boot Loader 实际上也依赖于具体的嵌入式板级设备的配置,Boot Loader 是严重地依赖于硬件而实现的。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 Boot Loader 程序也能运行在另一块板子上,通常也都需要修改 Boot Loader 的源程序。
主机和目标机之间一般通过串口建立连接,Boot Loader 软件在执行时通常会通过串口来进行输入、输出,比如:输出打印信息到串口,从串口读取用户控制字符等。
BootLoader 的启动过程可分为单阶段(Single-Stage)和多阶段(Multi-Stage)两种。通常多阶段的Boot Loader 具有更复杂的功能,更好的可移植性。从固态存储设备上启动的Boot Loader 大多采用两阶段。
⭐Boot Loader一般分为2部分,汇编部分 和C语言部分 ,汇编部分执行简单的硬件初始化,C语言部分负责复制数据,设置启动参数,串口通信等功能.
-
Boot Loader的核心功能就是引导操作系统,部分工作如下
- 初始化部分硬件,包括时钟、内存等等
- 加载内核到内存上
- 加载文件系统、atags或者dtb到内存上
- 根据操作系统启动要求正确配置好一些硬件
- 启动操作系统
-
部分Boot Loader还支持monitor功能,提供了更多的命令行接口,具体部分功能如下:
- 进行调试
- 读写内存
- 烧写Flash
- 配置环境变量
- 命令引导操作系统
Uboot
U-Boot部分源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
Uboot 属于Boot Loader的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核,即Uboot需要具有读写flash 的能力。
编译好的u-boot进行移植烧录,将一编译好的u-boot.bin文件烧写到开发板的flash存储器中,在开发板上电后,板载cpu来引导internal iROM(含有烧写的代码)引导flash开始执行工作(iRAM中封装了flash的启动函数),波动拨码开关来告诉系统从哪个flash内存中哪个存储器