RISC-V CPU加电执行流程

市面上采用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中的有效负载。

     

RISC-V CPU加电执行流程

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

ZSBLFSBL均依照MSEL(Mode Select的设置(这些引脚要接到零或电源,表示高电平或低电平)加载下一阶段的bootloader,具体参照附录A。

 

1.1 复位向量(第一条指令)

Z待加电后,所有核心都跳转到0x1004,在这个位置的内存包含如下内容:

RISC-V CPU加电执行流程

Reset vector ROM

 

所有核心将依照复位地址和MSEL跳转,详细信息如下:

 

RISC-V CPU加电执行流程

             

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最后的传参。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzzjw.html