嵌入式系统启动流程解析

嵌入式系统启动流程解析

嵌入式Linux通用启动流程在进一步探索uboot、Linux内核、设备树三者之间的关系前,本文先介绍一下嵌入式系统上电至Linux系统启动的整体流程是怎样的,几乎所有的嵌入式系统都遵循这套通用的启动流程,具体板子可能会有部分修改,但是逻辑是一样的。

这里先给出几个术语:

BROM:是Boot Rom的简称,是在cpu中固化的一段程序,一旦cpu制造完成,里面的内容便无法进行修改,cpu上电后就指向BROM中的代码,容量较少,一般用于初始化cpu以及引导下一阶段bootloader。

SRAM:CPU中的SRAM,简单来说,就是CPU中的Cache。

PL/pre-loader:又叫Secondary program loader(SPL),用于初始化DDR内存、引导uboot。

LK: Little Kernel是一个开源的嵌入式操作系统内核,目标是提供一个简单而可靠的启动和初始化环境,以及基本的操作系统功能,如任务管理、内存管理和设备驱动程序。它通常用于嵌入式设备的引导过程,作为启动加载程序(bootloader)的一部分,与uboot功能类似。一旦系统启动完成,它可以被更复杂的操作系统(如Android)替代或与之配合使用。

Bootloader:位于系统启动过程中的最前端,负责初始化硬件设备、加载操作系统内核并启动操作系统。上述的LK/Uboot均属于bootloader。

下面是一个嵌入式Linux系统的启动总体流程:

执行Boot ROM中的Boot code,初始化cpu,引导SPL/pre-loder(将SPL/pre-loder从外部存储加载至SRAM中);

PC指针跳转至SPL处,执行SPL程序,初始化DDR内存,引导Bootloader(将Bootloader从外部存储加载至DDR中);

PC指针跳转至Bootloader处,初始化部分外围设备,加载基础驱动,引导Linux系统(将Linux Kernel、Ramdisk从外部存储加载至DDR中);

PC指针跳转至Linux kernel入口处,对硬件的控制权由bootloader转移至Linux kernel,Linux kernel运行后,挂载根文件系统,启动一系列系统服务(图形化界面、网络、音频等等)。

总体来说,在嵌入式系统的启动流程中,总是用一段较小的程序来引导一段更大的程序。有一个很好的比喻,将系统的启动流程比作古代桥梁的搭建,先用弓箭在两岸间搭建一根细绳,用这根细绳在两岸间连起粗绳,再用这根租绳连接更粗的绳子,直至在两岸间连接起一根铁链,这时一座桥的根基就搭建好了。

VisionFive2开发板启动流程在介绍了嵌入式Linux系统的通用流程后,本章将介绍一个具体的例子:搭载RISC-V架构jh7110的Visionfive2开发板启动流程,如下图所示。

BootRom在板子上电后,执行BootROM程序,BootROM会根据AON_RGPIO[1,0] (0x1702002c)的值选择启动模式:1. 从Quad SPI NOR flash memory启动;2. 从UART启动。

UART模式用于恢复模式,需要在上电的时候进行一系列操作(按住某个按钮或者给某给引脚置高电平)。一般情况下,不进行任何操作会默认从QSPI-NOR中启动, 将QSPI中的SPL加载至SRAM中并执行。

SPLVisionfive将固件(SPL、OpenSBI、U-Boot)存储到了QSPI-NOR存储器中,内存布局如下:

偏移

长度

用途

0x0

0x80000

SPL

0xF0000

0x10000

U-Boot环境变量

0x100000

0x400000

U-Boot+OpenSBI

0x600000

0x1000000

保留

SPL是基于uboot的启动程序,用于初始化DDR内存,并将OpenSBI和U-Boot加载至内存中,执行OpenSBI程序。

OpenSBI与UBootRISC-V架构的启动流程中多了一个OpenSBI环节,OpenSBI(Open Source Supervisor Binary Interface)实现了RISC-V SBI规范,它提供了一组机器模式下的SBI调用,用于操作处理器或与外部设备进行通信。其也作为固件的一部分,

在Visionfive中,OpenSBI的作用有:1. 为Linux提供基础的系统调用;2. 将处理器的M模式转换为S模式;3. 跳转到0x4020_0000地址执行uboot程序。

Uboot提供了简单的命令行功能、基础的文件系统与常见的外围设备驱动 (例如GMAC, UART, QSPI, SDIO, etc.)。Uboot主要用于通过各种方式引导Linux内核、设备树与根文件系统,包括ETH (Network), UART, QSPI, SDIO 与 NVMe (SSD)方式。

下图为Visionfive2在启动过程中,内存地址的映射。

总结OpenSBI是RISCV体系架构中特有的一个启动流程,虽然Visionfive2开发板的启动流程中多个一个OpenSBI,但整体流程还是遵循bootrom->spl->uboot->Linux kernel这个通用流程。

相关推荐