本篇博客涉及到了 riscv 从0 开始 到 linux 启动成功的流程, 涉及到以下标准
The Standardized Boot flow for RISC- V Platforms : http:
本博客从以下角度分析启动历程
1. risc- v 的运行模式
2. 芯片启动配置
3. 非易失性存储器的镜像布局
4. risc- v 的启动流程
5. 易失性存储器的镜像布局
risc-v的运行模式
risc- v 支持 三种运行模式
U- Mode S- Mode M- Mode
U- Mode : 用户程序运行在这个Mode
S- Mode : OS运行在这个Mode
M- Mode : A bare metal machine mode, OPENSBI运行在这个Mode
这其中前沿技术 : 虚拟化 和 安全扩展 不在 rsic- v 架构设计范围内
我们需要用软件 提供 虚拟化 和 安全扩展, 其中
虚拟化
由软件 OpenSBI 提供, OpenSBI 是 risc- v 官方提供的
SBI 意义为 RISC- V Open Source Supervisory Binary Interface
OpenSBI 运行在 M- Mode, 在OS ( 运行在S- Mode) 之下
RISC- V start from M- Mode, A bare metal machine mode.
在启动时 , OpenSBI switch into S- Mode from M- Mode for non- hypervisor world.
相当于 ARM64 的Hypervisor/ EL2 层, 这一层在ARM64中是由硬件提供的, 而在RISCV中, 是由硬件提供的
System call type interface layer between Firmware runtime, M- Mode to Operating system, S- Mode.
opensbi 能编译出三种固件( FW_PAYLOAD FW_JUMP FW_DYNAMIC) , 用于不同的启动方式
https:
risc- v 硬件上不提供虚拟化, 软件OpenSBI提供虚拟化
安全扩展
TEE : Trusted Execution Environment
https:
https:
risc- v 硬件上不提供TEE, 软件Penglai- Enclave提供虚拟化
it is based on OpenSBI
Penglai- Enclave 运行在 M- Mode, 在OS ( 运行在S- Mode) 之下, 在OpenSBI ( 运行在M- mode) 之上
芯片启动配置
一般芯片内置srom和sram, srom中有软件代码, 被称为bootrom
bootrom中会做一些 非易失性存储器的初始化
bootrom中会读取 启动配置, 并决定从哪种非易失性存储器读取SPL
非易失性存储器的镜像布局
根据 The Standardized Boot flow for RISC- V Platforms 以及 linux启动流程, 我们需要以下镜像文件
1. u- boot- spl
2. board- device. dtb
3. opensbi
4. u- boot
5. linux
6. rootfs
u- boot- spl 在 启动配置选取的非易失性存储器A的指定位置( 数据手册)
board- device. dtb 在 非易失性存储器B的某个位置( 由u- boot- spl指定)
opensbi 在 非易失性存储器C的某个位置( 由u- boot- spl指定)
u- boot 在 非易失性存储器D的某个位置( 由u- boot- spl指定)
linux 在 非易失性存储器F的某个位置( 由u- boot指定)
rootfs 在 非易失性存储器G的某个位置( 由u- boot指定)
注意 : 非易失性存储器A B C D E F G 可以为同一个, 也可以不为同一个
risc-v 的启动流程
上电, pc处于system memory map中的bootrom中前沿位置, 运行模式为M- mode
01. bootrom 根据 拨码开关 去定位 u- boot- spl 在哪里, 并加载 u- boot- spl 到 ilm
A1. u- boot- spl XIP运行, 或者被bootrom搬到某个 memory地址开始执行
A2. u- boot- spl 初始化 非易失性存储器B/ C/ D , 初始化 ddr
A3. u- boot- spl 从 非易失性存储器B 加载 board- device. dtb 到 ddr
A4. u- boot- spl 从 非易失性存储器C 加载 opensbi 到 ddr
A5. u- boot- spl 从 非易失性存储器D 加载 u- boot 到 ddr
A6. 跳转到 opensbi
B1. opensbi 根据 board- device. dtb 初始化 domain 和 platform , 并 对设备树进行fix_up处理
B2. opensbi 切换到 S- mode , 跳转到 U- boot
C1. U- boot 根据 fix_up 后的 设备树 初始化 platform , 并 对设备树 再次 fix_up
C2. U- boot 从 非易失性存储器D 加载 linux 到 ddr
C3. U- boot 跳转到 linux
D1. linux 创建页表, 开MMU, 创建物理内存管理机制和虚拟内存管理机制
D2. linux 初始化调度器, 将自己( standalone) 与init_task绑定
D3. linux 创建 kernel_init 内核线程, 并开启调度
D4. linux 中的 kernel_init 根据 fix_up 后的设备树 对platform 初始化
D5. linux 中的 kernel_init mount 真实文件系统( 上面提到的rootfs)
D6. linux 中的 kernel_init 调用 run_init_process 更改 1 号进程的PCB相连的thread_info中的相关寄存器为U- Mode, 并主动调度
D7. linux 中的 1 号调度实体( init用户进程) 被调度回来, 即进入U- mode
E1. init用户进程 开始启动用户相关进程, 并为用户提供服务
注释: 此时三个 运行模式都运行着不同的代码, 三套代码时分复用PE
1. U- Mode 用户进程
2. S- Mode linux代码
3. M- Mode OpenSBI
易失性存储器的镜像布局
u- boot- spl 在 SRAM 或者 FLASH ( XIP) 上
board- device. dtb& opensbi& u- boot& linux 在 sdram/ ddr/ ddr2/ ddr3/ ddr4 中
rootfs中的 super_block& dentry& inode& buffercache 缓存 在 sdram/ ddr/ ddr2/ ddr3/ ddr4 中