OpenSBI 简介-1

简介

SBI即为 (RISC-V Supervisor Binary Interface),SBI直接运行在系统M模式,可以作为一个bootloader也可以是一个M模式下运行的后台程序,SBI程序拥有最高的权限,可以访问所有的硬件资源,向OS提供了统一的系统调用环境,OS通过特殊的指令进入到M模式,并执行SBI的callback。
而RISCV官方在给出SBI标准规范的同时,也开发了一套开源代码opensbi,代码仓库位于 https://github.com/riscv-software-src/opensbi,里面有详细的介绍文档。在这里插入图片描述

编译

opensbi的代码组织上,把sbi公共代码抽象出来形成两个库:lib/sbi, lib/utils,不同平台调用这两个库的代码,和平台相关代码放在platform下面,一起构成了sbi的fw。
对于qemu的virt平台,相关的代码在:opensbi/platform/generic,对于nuclei的riscv,相关代码在platform\nuclei下面,用户可以在platform加入自己的硬件平台。
我们以nuclei的64 riscv的qemu来分析,代码放在platform\nuclei\demosoc下面。
在demosoc下面放入自己平台相关的文件以及一些编译配置参数和宏。objects.mk 是编译规则,config.mk是配置的参数和宏。
lib/sbi下面放一些通用的代码, lib/utils下面会放置具体外设的驱动代码, 每一个文件夹下面都有通用的注册框架和私有的驱动,
以seirial为例:fdt_serial.c是通用的入口,fdt_serial_nuclei.c是被注册的驱动,nuclei-uart.c是具体的操作,所以说如果需要添加自己的driver
就要在这里面实现,并注册使用,注册完成后,在fw的初始化过程中会赋值给current_driver,方便后续使用。
编译会生成三种类型的固件,分别是:fw_jump.elf, fw_load.elf, fw_dynamic.elf。
这三种固件的区别是:
fw_jump.elf跳到指定地址运行下一个阶段的代码。
fw_load.elf会把下一个阶段的二进制,通常是Uboot/Linux内核,一起打包到fw_load.elf固件里。
fw_dynamic.elf定义了上一个程序以及下一个程序和fw_dynamic.elf的接口。
fw的开始代码在firmware下面,fw_base.S是公共的开始代码,这三种固件有个字独有的.S文件,它们都会包含fw_base.S,每一个.S都有自己的lds脚本。
编译时候,可以指定配置参数等信息,例如:
make -C ./opensbi O=./demosoc/opensbi CROSS_COMPILE=riscv-nuclei-linux-gnu- PLATFORM_RISCV_ABI=lp64d PLATFORM_RISCV_ISA=rv64imafdc PLATFORM=nuclei/demosoc
或者:
make all PLATFORM=generic CROSS_COMPILE=riscv64-linux-gnu- PLATFORM_RISCV_XLEN=64

运行

下图是OpenSBI运行时的部分截图:
在这里插入图片描述
后续会通过对0.9版的学习,记录下学习笔记。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值