当前位置:首页>Linux>RISC-V引导运行Linux

RISC-V引导运行Linux

  • 2026-10-11 08:13:40
RISC-V引导运行Linux
BootROM --> OpenSBI --> U-Boot(SPL-->U-Boot) -->Kernel
此处暂不讨论secure boot。
bootrom基本工作:
1. 上电复位2. 初始化时钟和基本硬件(比如启动介质SPI flash,SD/eMMC等)3. 判断启动介质(strap)4. 从启动介质加载“第一阶段固件”5. 跳转执行
opensbi基本工作:
  • 设置 M-mode(机器模式)
  • 配置 S-mode(内核运行模式),配置PMP(内存访问保护)
  • 配置中断/异常委托
  • 定义 M → S 的调用接口(SBI)
SBI 功能
用途
Timer
内核 tick
IPI
多核调度
Hart control
CPU 上下电
Console
early print

SBI 调用约定:

RISC-V SBI 规定:

寄存器
含义
a7
SBI Extension ID
a6
Function ID
a0-a5
参数
a0
返回值
opensbi运行在片内sram上。
opensbi运行在M-mode,U-Boot和Kernel运行在S-mode。
kernel 主动进入 OpenSBI,只能通过 ecall指令。
Linux kernel/U-Boot 发起 ecall → OpenSBI → 硬件timer→ 再回到 kernel流程:
Linux / U-Boot (S-mode)││ 1. ecall  SBI_SET_TIMER(next_event)▼OpenSBI (M-mode),根据a7和a6调用对应handler││ 2. 编程 CLINT mtimecmp││ 3. mret 回到 S-mode▼硬件定时器││ 4. mtime >= mtimecmp││ 5. 触发 timer interrupt▼OpenSBI trap (M-mode)││ 6. 转换为 S-mode timer interrupt,即清除 machine timer interrupt,人为制造一      个 S-mode timer interrupt。若在opensbi中已经配置了中断委托,则无需此步骤。▼Linux kernel IRQ handler(S-mode)││ 7. tick / hrtimer / scheduler
对于IPI和PLIC中断,是同样的道理,kernel主动触发IPI核间中断也是通过ecall陷入M-mode之后写目标hart的msip,触发目标hart中断,目标hart可以选择配置ssip触发S-mode的software interrupt,也可以提前配置中断委托从而直接在kernel(S-mode)处理。
当PLIC外部中断到来,先进opensbi M-mode处理,同样可以选择配置seip触发
S-mode的external interrupt,也可以提前配置中断委托从而直接在kernel(S-mode)处理。
U-Boot 是“真正的板级初始化 + OS 装载器”
U-Boot基本工作:
  • DDR初始化,SoC板级初始化
  • 提供交互式调试环境
  • 加载 Linux Kernel / DTB
由于U-Boot体积一般大于SRAM大小,因此通常会分为SPL+U-Boot。
U-Boot SPL(Secondary Program Loader):
  • 极小代码(<100KB)
  • 运行在 SRAM
  • 初始化 DDR
  • 把 U-Boot 搬到 DDR

最新文章

随机文章