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工具,可以将自定义内核配置和用户空间软件添加到工作负载中。
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。