市面上采用RISC-V架构的CPU很多,且没有如X86那样高度细节的标准,故采用说明文档详细的SiFive Freedom U540-C000芯片来做介绍(下面统一称为FU540)。
FU540支持多种启动方式,且由MSEL针脚控制。
在了解启动流程之前,首先需要明确RISC-V的三种启动模式
M-mode(Machine Mode)
S-mode(Supervisor Mode)
U-mode(User Mode)
在系统加电启动后会处于M-mode,有关启动模式将在下文详细讲解。
通常,RISC-V启动顺序流程包含以下几个阶段:
RISC-V上游引导流程类似。ROM是ZSBL。FSBL加载器是SoC专用的。将由Coreboot和/或U-Boot SPL替代。运行时是OpenSBI。它提供运行时服务。U-Boot是OpenSBI中的有效负载。
Zeroth Stage Boot Loader(ZSBL),安装在板载的ROM中,处于M-mode
First Stage Boot Loader(FSBL),brings up PPLs and DDR, 处于M-mode
Berkeley Boot Loader(BBL),adds emulation for soft instructions,处于M-mode
User Payload,包含软件,如Linux,处于S-mode或U-mode
ZSBL和FSBL均依照MSEL(Mode Select)的设置(这些引脚要接到零或电源,表示高电平或低电平)加载下一阶段的bootloader,具体参照附录A。
1.1 复位向量(第一条指令)
Z待加电后,所有核心都跳转到0x1004,在这个位置的内存包含如下内容:
Reset vector ROM
所有核心将依照复位地址和MSEL跳转,详细信息如下:
1.2 ZSBL(第0阶段Bootloader)
处于M-mode的ZSBL保存在maskROM 中地址为0x1_0000的位置,它负责从GPT中加载更为复杂的FSBL(寻找编号为5B193300-FC78-40CD-8002-E86C45580B47的GPT分区)。通过先加载GPT的头文件,然后一块一块(块大小为512bytes)的顺序地扫描GPT。加载过程结束后,FSBL被加载进地址为0x0800_0000的L2 LIM缓存中,随后,将执行FSBL阶段。
ZSBL通过MSEL阵脚的值来决定从哪里寻找FSBL所在的分区,详细信息参照附录B。
1.3 FSBL(第1阶段Bootloader)
处于M-mode的FSBL从L2 LIM地址为0x0800_0000的缓存上执行,它负责为在DDR上运行系统做准备,可大概分为如下的这些任务:
通过配置芯片上的PLL将核心频率变为1GHz
配置DDR PLL,PHY和DDR控制器
将GEM GXL TX PLL设置为123MHz并重置它
如果是外部PHY,重置它
从编号为2E54B353-1271-4842-806F-E436D6AF6985的GTP分区下载BBL
扫描OTP获取的芯片序列号
将DTB(硬件设备树)复制到DDR,填写FSBL版本,内存大小和MAC地址
启用16个中15道L2缓存线路(这样做将移除几乎所有的L2 LIM缓存)
跳转到DDR上地址为0x8000_0000的位置
同样,FSBL也参照MSEL的设置决定去哪里寻找BBL所在的分区,详细信息参照附录D。
1.4 BBL(第2阶段的Bootloader)
处于M-mode的BBL从DDR上地址为0x8000_0000的位置执行。它负责为如SBI(Supervisor Binary Interface)等RISC-V需要的,但没有被芯片本身实现的指令。在进行写操作的时候,BBL通常包含一个嵌入的Linux内核负载,当SBI被初始化后,它将跳转的Linux内核。
当ZSBL与FSBL都从QSPI(Quad SPI)加载下一阶段的boot-loader。然而,其中使用的协议并不确定,具体由MSEL决定。
1.5 用户负载(预示boot完成)
在这一阶段,boot基本完成,待执行如转载操作系统(S-mode)等任务后,运行用户空间软件程序(U-mode)。
1.6 什么是U-Boot
U-Boot属于一种bootloader,简单来说,其作用就是从flash中读出内核,随后加载在内存中,最终初始化并启动操作系统内核。
具体来说,可以分为下述几个方面:
1)U-Boot主要作用是用来启动操作系统内核。体现在uboot最后一句代码就是启动内核。
2)U-Boot还要负责部署操作系统内核。体现在uboot最后的传参。