Bootloader 基本概念及 U-Boot 启动过程
Bootloader 是一种计算机程序,在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核。 Bootloader 的实现十分依赖于具体硬件,在嵌入式系统中硬件配置各种各种,即使是相同的 CPU,它的外设(比如 Flash)也可能不同,所以不可能有一个 Bootloader 支持所有的 CPU、所有的开发板。
Bootloader 的启动方式可以分为两种操作模式:启动加载(Boot loading)模式和下载(Downloading)模式。在启动加载模式下, Bootloader 从板子上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。在下载模式下,开发人员可以使用各种命令,通过串口连接或网络连接等通信手段从主机(Host)下载文件(比如内核映像、文件系统映像等),将它们直接放在内存运行或是烧入 Flash 类固态存储设备中。
U-Boot 是一种功能强大的 Bootloader,通常同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。U-Boot 的结构可以分为 stage1 和 stage2 两部分。stage1 Usually contains CPU-dependent code, such as device initialization code, which can be written in assembly language. Stage2 is usually written in C language, which can implement complex functions and has better readability and portability.
在 U-Boot 的启动过程中,stage1 代码通常放在 start.S 文件中,它用汇编语言写成,主要代码功能包括定义入口、设置异常向量、设置 CPU 的速度、时钟频率及终端控制寄存器、初始化内存控制器、将 ROM 中的程序复制到 RAM 中、初始化堆栈、转到 RAM 中执行。stage2 从 lib_arm/board.c 中的 start_armboot 开始,它也是整个启动代码中 C 语言的主函数,该函数只要完成一系列的初始化函数、初始化 Flash 设备、初始化系统内存分配函数、如果目标系统拥有 NAND Flash 设备,则初始化 NAND Flash 设备、如果目标系统有显示设备,则初始化该类设备、初始化串口(UART)、初始化相关网络设备,填写 IP、MAC 地址等操作。
Bootloader 是一种非常重要的系统软件,它负责初始化系统硬件、加载操作系统内核,并提供了许多有用的功能,帮助开发人员更方便地开发和测试嵌入式系统。