RISC-V启动引导流程 spec

一、RISCV规范定义的三种主要操作模式:(用户模式、管理模式和机器模式 (图1 - a))

1.用户模式:运行用户程序的模式,权限级别最低。不能直接访问I/O或特权指令或内核内存或其他进程。

2.管理模式:大多数Linux内核或其他O/S运行的模式。通过I/O remap函数访问最特权的指令和I/O控制。内存管理单元可能打开或关闭。

3.机器模式:裸机程序/第一阶段引导加载程序和BBL在此模式下运行。BBL以固件的形式存在(图1 - b)

图1-a
图1-b
图2
二、Boot 流程(图2)

1. Zero Stage Bootloader (ZSBL) : 从ROM获取核心代码。

2. Reset Code : 清除寄存器和片上存储器, 为FSBL准备RAM空间。

3. First Stage Bootloader (BBL) :设置trap表,将SELF复制到RAM中, 从 SD 卡载入Linux内核 。

4. Linux: 安装页表, 驱动载入 ,运行环境准备 。

5. init (Busybox) :启动 shell。

三、Boot Loader引导

1.Boot Room

BootROM地址空间从0x10000开始(由配置文件中的BootROM Params值决定),并从地址0x10040开始执行(由BootROM Params中的链接器脚本和重置向量给出),该地址由BootROM程序集中的_hang标签标记。

将汇编好的指令编码到BootROM硬件中,想更改BootROM代码,则需要在BootROM目录中运行make,然后重新生成Verilog。或者也可以进行覆盖

图3

2.ZSBL

Reset Code , 裸机驱动: UART: Early console ,SD Card/SPI , Device Tree (Open Firmware), 安装外围设备,从SD到内存复制FSBL镜像,只有一个Core执行设置例程。

3.FSBL

改良的BBL, 移除外设上的原子操作,数据段清零; 安装: UART: Early console , PLIC(平台级中断控制器), CLIC(内核局部中断控制器),FDT (Filter Device Tree), 激活二级Core,启动Linux内核引导程序。

其中BBL的作用如下:

①任何RISCV处理器不能在硬件中直接处理的非法指令。

②启动和响应计时器中断。

③在Linux引导时进行链加载,初始化控制台访问。

四、Ariane引导过程

1.ZSBL(Zero Stage Bootloader)

①前端服务器(FESVR)是一个运行在主机CPU上的程序,可以使用栓系串行接口(TSI)读写目标系统内存的任意部分。

②当RISC-V CPU的FESVR加载实际的程序时,默认的引导加载程序只是在等待中断(wait-for-interrupt, WFI)指令上循环。

③FESVR使用TSI将裸机可执行程序或第二阶段引导加载程序加载到SoC的内存中。如果在软件模拟器(Spike)中,就是传递给模拟器的二进制文件。

④一旦它完成了程序的加载,FESVR将写入CPU 0的软件中断寄存器,这将使CPU 0退出它的WFI循环。

⑤一旦CPU 0接收到中断,它将写入系统中其他CPU的软件中断寄存器,然后跳转到DRAM的开头,执行加载的可执行文件的第一条指令。其他CPU将被第一个CPU唤醒,也跳到DRAM的开头。

注:

①加载的可执行文件将在机器模式下运行,直到它通过主机寄存器发送命令告诉FESVR关闭SoC。

②FESVR加载的可执行文件应该有指定为tohost和fromhost的寄存器FESVR在可执行文件运行时使用这些寄存器与可执行文件进行。可执行文件使用tohost向FESVR发送命令,比如打印到控制台、代理系统调用和关闭SoC。fromhost用于发回tohost命令的响应和发送控制台输入。

2.FSBL(First Stage Bootloader)

裸机程序的运行,有ZSBL就已经足够了,如果需要启动RISCV Linux或者其他可执行文件(载入可执行文件的案例较少,以Linux为例)则需要借用第二阶段引导程序BBL。

①BBL读取BOOTROM中编码的设备树,并将其转换为与Linux内核兼容的格式。

②设置虚拟内存和中断控制器,加载内核(内核作为有效负载嵌入在引导加载程序二进制文件中),并以管理器模式开始执行内核。

③机器模式的Trap也是由BBL程序负责维护,并通过FESVR进行代理。

④一旦BBL进入管理模式,Linux内核就会接管并开始它的进程。它最终加载init程序并以用户模式运行。

注:构建引导Linux的BBL映像的最简单方法是使用FireMarshal工具,可以将自定义内核配置和用户空间软件添加到工作负载中。

posted @ 2022-11-11 15:48  方东信  阅读(821)  评论(0编辑  收藏  举报