RISC-V之SBI及NEMU环境

背景

前段时间,准备开始我的riscv之旅,进行2篇开篇:

后面因为种种原因,一直没有怎么推进。最近在电子发烧友论坛书籍评测活动中,看到有RISC-V相关的书籍在评测:《RISC-V体系结构编程与实践(第二版)》,于是抱着侥幸的心理参加了,第一次参加这种书籍或开发板评测活动,没想到居然中了,缘分真的挺奇妙。
book.jpg

书到了以后,大概地通读了一遍,本书不仅介绍了RISC-V体系结构的一些基础知识(架构体系结构、指令集、编译器、链接器、中断、内存管理、虚拟化等等),而且更突出动手实践,基于QEMU及香山模拟器(NEMU)设置了一系列的实验。
非常适合我这种对RISC-V一知半解的人,不仅有基础介绍,而且通过动手实践,不会枯燥乏味,更能加深对RISC-V的理解。最开始,我也是打算基于QEMU模拟环境来学习,不仅方便,而且省钱,哈哈。

补充

本书的开篇和我之前的开篇比较类似,主要是RISC-V体系架构的简单介绍,主要的一些特点,指令集扩展及RISC-V的特权模式,软件架构。

之前在了解的过程中缺少了虚拟化扩展的一些部分,这次刚好在这本书看到相应的补充:

使能了虚拟化扩展后,新增如下特权模式:

  • HS模式:把原有的S模式扩展为HS模式,用来运行虚拟化管理程序。
  • VS模式:通常用来运行虚拟机操作系统内核。
  • VU模式:通常用来运行虚拟机操作系统中的应用程序。

所以也就新增一个虚拟机操作系统的特权级别使用场景:支持5种特权模式,分别是M模式、HS模式、VS模式、VU模式和U模式。

前言

基于《RISC-V体系结构编程与实践(第二版)》这本书籍,官方文档及网上资料继续我的RISC-V旅程。
接前面的篇章,来看看RISCV-V的SBI、BenOS和MySBI及NEMU环境。

SBI

SBI:(Supervisor Binary Interface)
在RISC-V软件生态中,RISC-V规范定义了一个SBI规范。SBI对所有RISC-V硬件平台共性的功能做了抽象,为运行在S模式下的操作系统或者虚拟机监控程序扩展的特权(Hypervisor- extended Supervisor, HS)模式的虚拟化管理软件提供统一的服务接口。
通常把提供SBI服务的固件称为SBI固件,现在业界流行的SBI固件有OpenSBI等。

BenOS和MySBI

书中大部分实验是以BenOS为基础,BenOS 基础实验代码包含MySBI和BenOS两部分,其中MySBI是运行在M模式下的固件,运行在S模式下的操作系统提供引导和统一的接口服务。

本书的实验并没有采用业界流行的OpenSBI固件,而是从零开始编写一个小型可用的SBI固件,以便从底层深入学习RISC-V体系结构。
系统上电后,RISCV处理器运行在M模式下。通常SBI固件运行在M模式下,为运行在S模式下的操作系统提供引导服务以及SBI服务。不过本小节介绍的MySBI代码仅仅提供引导服务,在后续的实验中会逐步添加SBI服务。

我觉得这也是本书的一个亮点,从最底层最简单的裸机开始,一步步对其扩展和完善,而不是直接从OpenSBI开始,这样更容易理解底层的一些细节。

NEMU环境介绍及搭建

RISCV-V的实验环境搭建,之前我自己已经搭建过QEMU的:《基于QEMU搭建RISC-V的Linux环境》https://mp.weixin.qq.com/s/F6lyqPhng21qsUlj2saShw

今天来看看书中介绍的NEMU。

NEMU (NJU Emulator)最早是由南京大学实现的一个用于教学的计算机指令集体系结构(Instruction Set Architecture,ISA)模拟器,香山处理器团队基于2019版的NEMU进行了增强和维护,以模拟香山处理器前期指令集和体系结构。本章把NEMU简称为香山模拟器。NEMU支持x86、RV32和RV64等指令集体系结构。
RV64版本NEMU具有如下硬件特性:

  • 支持1个RV64GC通用处理器内核。
  • 支持 CLINT。
  • 支持NOR Flash存储器。
  • 支持兼容NS16550的串口。
  • 支持Xilinx UartLite串口控制器。
  • 支持RTC。
  • 支持单步调试。

NEMU环境准备

编译NEMU。

# 安装依赖
sudo apt install libsdl2-dev libreadline-dev
# 下载NEMU
git clone https://github.com/runninglinuxkernel/NEMU.git

# 编译
cd NEMU/
export NEMU_HOME=$(pwd)
make riscv64-benos_defconfig
make -j$(nproc)

sudo cp build/riscv64-nemu-interpreter /usr/local/bin/

Hello World

编译benos的Hello World并运行。

# 安装相关工具
sudo apt install gcc-riscv64-linux-gnu

# 获取benos实验代码
git clone https://github.com/runninglinuxkernel/riscv_programming_practice.git
cd riscv_programming_practice/chapter_2/benos

# 编译
export board=nemu
make clean
make

# 运行
make run

NUME会输出 “Welcome RISC-V!”

参考