当SoC
芯片流片回来后,芯片本身处于一个完全未初始化的状态,此时芯片并不能正常工作,因此需要boot
过程对SoC
进行配置使其进入到正常工作状态。并且这一过程需要软件对硬件按照一定的顺序进行初始化和配置,以确保系统能够正常和高效的运行。以下是SoC boot
可能会涉及到的流程。
1. 上电复位(Power-On Reset)
启动流程的第一步是上电复位。当SoC
通电或复位信号触发时,SoC
进入复位状态。复位电路会将所有寄存器和内存重置为已知的初始状态,确保系统从一个干净的状态开始启动。这一步类似于计算机的BIOS
复位,确保硬件准备好接受后续指令。
2. 引导ROM代码执行(Boot ROM Execution)
复位完成后,SoC
开始执行存储在片上ROM
中的引导代码。引导ROM
代码是由SoC
厂商预先烧录的程序,不可更改。它的主要职责包括:
硬件初始化:初始化基本硬件组件,如时钟、内存控制器等。
外部存储检测:检测并配置外部存储设备(如
NAND
闪存、SD
卡、SPI
闪存等)。引导加载程序加载:将引导加载程序(
Bootloader
)从外部存储设备加载到片内RAM
或外部RAM
中。
3. 引导加载程序(Bootloader)执行
引导加载程序是一个关键组件,它进一步初始化系统并加载操作系统。通常,Bootloader
分为两个阶段:
阶段1(Stage 1 Bootloader):
初始化最低限度的硬件环境。
配置和初始化内存子系统(如
DDR SDRAM
)。为阶段2引导加载程序提供基础环境。
阶段2(Stage 2 Bootloader):
完成更高级的硬件初始化,包括外设、网络和存储设备。
加载操作系统内核(
Kernel
)和初始内存盘(initrd/initramfs
)到内存中。将控制权移交给操作系统内核。
常见的引导加载程序有U-Boot和Barebox等,它们提供了丰富的功能来支持各种硬件平台和操作系统。
4. 操作系统启动(Operating System Boot)
当引导加载程序加载操作系统内核并将控制权移交给内核后,操作系统的启动过程正式开始。这个阶段包括:
内核初始化:
初始化内核自身的数据结构和子系统,如内存管理、进程管理、文件系统等。
初始化硬件设备驱动程序。
挂载根文件系统。
初始进程启动:
内核启动第一个用户空间进程(通常是
init
进程)。
init
进程根据系统配置和脚本执行一系列初始化任务,如启动守护进程和服务。
内核的启动过程类似于电脑开机时操作系统加载的过程,只不过在SoC
上,这个过程更加紧凑和优化。
5. 用户空间初始化(User Space Initialization)
在操作系统内核成功启动后,系统进入用户空间初始化阶段。这包括:
启动脚本和服务:执行启动脚本(如
/etc/init.d/
中的脚本或systemd
服务单元)来启动各种系统服务和守护进程。用户登录和图形界面:启动登录管理器(如
getty
、lightdm
等)和图形用户界面(如X Server
、Wayland
等),为用户提供交互界面。
这一阶段类似于计算机启动进入桌面环境的过程,是用户可以直接与设备交互的部分。
当然,这只是一个比较笼统的boot
流程,针对到具体SoC
肯定会有一些区别。比如引导加载程序的阶段数没有固定限制,复杂系统需要更多阶段的加载以实现更高的灵活性、扩展性和安全性。再比如对于没有操作系统的SoC
,启动流程可以大大简化,尽管硬件初始化和引导ROM
代码执行步骤仍然是必要的,但引导加载程序和应用程序启动步骤可以简化。