risc-v系统启动流程

系统启动流程
首先来说一下系统启动流程,系统可以从SD卡和Flash启动,我们的FPGA板块中没有Flash,因此我们使用的是从SD卡启动。
SD卡启动需要使用bootrom,bootrom的主要作用就是将SD卡中放置的可执行文件搬移到指定的内存中,搬移完成后再跳转到DDR中执行;
启动流程为从u-boot跳转到opensbi,opensbi跳转到kernel,kernel起来调用文件系统之后系统就运行起来了。
RISC-V的三种模式
在理解risc-v的boot流程之前,首先需要知道的是risc-v设计的三种模式
机器模式:
M-mode(Machine Mode)
超级用户模式:
S-mode(Supervisor Mode)
用户模式:
U-mode(User Mode)
这三种模式对应的权限不同,
Machine Mode(机器模式)‌,简称M Mode,具有最高的权限等级,允许执行所有操作,包括直接访问和修改所有硬件资源。机器模式通常用于硬件初始化、系统引导、中断和异常处理等关键任务,由于其高度特权,机器模式通常只允许特定的、受信任的代码运行。对于risc-v来说,系统上电启动后会在M-Mode。
‌Supervisor Mode(监督模式)‌,简称S Mode,权限等级介于用户模式和机器模式之间。它允许操作系统管理硬件资源,为多个用户模式的程序提供服务和调度。在监管模式下,程序可以执行一些特权操作,如访问物理内存、管理设备驱动程序等。
‌User Mode(用户模式)‌,简称U Mode,具有最低的权限等级。在这个模式下运行的程序(如应用程序)不能直接访问硬件资源或执行特权操作。用户模式提供了最基本的程序执行环境,用于隔离和保护操作系统内核和其他程序,确保应用程序的稳定性和安全性,防止它们对系统造成损害。
RISC-V架构还支持几种不同的存储器地址管理机制,包括对于物理地址和虚拟地址的管理机制,使得RISC-V架构能够支持从简单的嵌入式系统(直接操作物理地址)到复杂的操作系统(直接操作虚拟地址)的各种系统。
此外,RISC-V定义了CSR(控制和状态寄存器),用于配置或记录一些运行的状态,这些CSR寄存器是处理器核内部的寄存器,使用其自己的地址编码空间和存储器寻址的地址区间完全无关系‌。
Bootrom
我们刚才说我们是SD卡启动,bootrom的主要作用就是将SD卡中放置的可执行文件搬移到指定的内存中,搬移完成后再跳转到u-boot执行。
说一下它的流程。硬件中有一份文件叫做bootrom.sv,它是由软件提供的,是由软件生成的一个rom,包含了一系列的二进制码,它挂载在CPU总线上,我们一般默认将bootrom设置在地址0上。CPU上电后,总线会主动去bootrom地址去执行相应的程序。
这个程序有一些特点,首先它不能太大,如果太大的话,在硬件中会占用较大的面积,所以它只完成最基础的一些工作即可。bootrom的运行流程如图所示。

u-boot:
U-Boot(全称为Universal Boot Loader)在RISC-V体系结构中的作用是引导和加载操作系统内核。运行在机器模式。

是一种通用的引导加载程序。在嵌入式系统中,U-Boot负责整个系统的加载启动任务,包括对硬件进行初始化、创建内核所需的参数并将这些参数传递给内核,最终启动操作系统内核。
它不仅是系统启动的起点,还负责为操作系统的运行做好必要的准备,确保RISC-V设备能够稳定、安全地运行其操作系统‌。
说白了 U-Boot 其实就是一裸板程序,这个程序最主要的一个功能就是传递内核参数,跳转内核。当然除了跳转到内核,U-Boot 本身还实现了其他一些功能(U-Boot 命令),以方便大家进行各种操作。
如图为u-boot源代码的目录:各文件是有层级结构的,从cpu到arch,再到board,还有一些公共的文件等。下面说一下主要的代码:

/arch/riscv为特定于架构的文件,这里我们用的是riscv架构下的代码;
/api 供外部应用程序使用的与架构或设备无关的 API.如标准化输入输出,显示,网络API、存储API等,为cmd提供支持;
/board 开发板依赖文件.实现了产业链下游,设备厂商的差异性,对于产品设计而言,需要将各自在boot阶段需要严格初始化的实现放在这里,比如I0口的初始化,产品中大部分I0口必须显式设置其初始状态
/boot images and booting 文件
/cmd U-Boot 命令相关接口
/common 与架构无关的一些通用文件:是 U-Boot 主体,如系统停留在UBoot阶段,CPU始终在执行一个死循环,run main loop().
/configs 开发板默认的配置文件。格式均为:开发板名_defconfig
/disk 磁盘驱动器分区处理的代码.实现了轻量级磁盘管理
/drivers 设备驱动.这里实现了boot阶段必要的设备驱动,如网口、显示等
/dts 实现了设备树,用于构建 内部 U-Boot fdt 的 Makefile

Opensbi Supervisor Binary Interface
OpenSBI是RISC-V特有的‌,它遵循[RISC-V指令集的SBI标准。这个标准规定了类Unix平台下操作系统运行环境的规范。SBI的实现是在M模式下运行的特定于平台的固件,它将管理S、U等特权上的程序或通用的操作系统。因此,OpenSBI作为RISC-V特有的实现之一,为RISC-V架构的操作系统提供了一个标准化的、可扩展的运行环境框架,确保了操作系统能够有效地管理和控制硬件资源‌。OpenSBI在引导后并不结束,而是一直运行于后台。
Linux通过ecall进行SBI调用,让CPU核进入M-Mode进行处理。
Linux中SBI的应用包括3方面:
一是支持SBI 规范。
二是支持Timer、IPI、RFence等。
三是支持扩展的HSM(Hart State Management),对CPU进行Start/Stop。

RISC-V运行模式分为M模式,S模式,U模式;M模式的权限最高,在这之前的阶段都运行在M模式,在OPENSBI的最后阶段会由M模式转换为S模式。
这个图片是opensbi打印的log,
Kernel:
Opensbi跳转kernel时会传递两个参数,一个是跳转地址也就是,kernel代码指令存放的位置,另一个是设备树的地址。
如何让Linux内核感知硬件并能够操控具体的硬件,这里使用了设备树来配置具体的硬件。
设备树,它是一种描述操作系统使用的硬件的一种格式,包括内存地址映射,CPU核的配置以及外设等。
从这里开始才是进入Linux操作系统的第一步,在自检后启动了Linux第一个进程/sbin/init,所有进程都由它的子进程分化而来。进程启动后开始加载操作系统的各种功能:进程管理、储存管理、设备管理、文件系统等。这些系统级的程序依然运行于S-mode模式下,作为Linux操作系统的最底层运行。
Kernel下发生中断或者异常时会调用opensbi下的一些接口函数(M模式,权限级别比较高)来处理一些中断或异常

在SMP系统中,有两种方法可以进入内核:
• RISCV_BOOT_SPINWAIT:固件在内核中释放所有的hart,一个hart赢 得抽奖并执行早期启动代码,而其他的hart则停在那里等待初始化完成。这种 方法主要用于支持没有SBI HSM扩展和M模式RISC-V内核的旧固件。
• 有序启动:固件只释放一个将执行初始化阶段的hart,然后使用SBI HSM(Hart State Management) 扩展启动所有其他的hart。有序启动方法是启动RISC-V内核的首选启动方法, 因为它可以支持CPU热插拔和kexec。
Kernel代码比较复杂,我们在这里说一下我们配置的相关部分:
(1) config
(2) 设备树;
(3) 打印;earlycon,在串口未初始化
(4) 文件系统调用;
文件系统:
挂载根文件系统需要通过虚拟文件系统,
一个内核软件层。有两种常用的方式挂载

  • 闪存挂载:通过本地emmc闪存中的根文件系统挂载。
  • 网络挂载:利用NFS(Network File System)协议,通过网络上的根文件系统挂载。
    在kernel的config文件中需要配置:
    CONFIG_CMDLINE=“earlycon=sbi console=ttys0,115200 root=/dev/mmcblk0p5 rw rootwait rootfstype=ext3”

挂载完成预装软件与系统配置的rootfs后,就可以对系统进行正常的操作与使用了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值