RISC-V之SBI及NEMU环境
RISC-V之SBI及NEMU环境
背景
前段时间,准备开始我的riscv之旅,进行2篇开篇:
- 《基于QEMU搭建RISC-V的Linux环境》https://mp.weixin.qq.com/s/F6lyqPhng21qsUlj2saShw
- 《RISC-V开篇及特权模式等一些概念》https://mp.weixin.qq.com/s/9RTFS4whcybstWQJW1FGTA
后面因为种种原因,一直没有怎么推进。最近在电子发烧友论坛书籍评测活动中,看到有RISC-V相关的书籍在评测:《RISC-V体系结构编程与实践(第二版)》,于是抱着侥幸的心理参加了,第一次参加这种书籍或开发板评测活动,没想到居然中了,缘分真的挺奇妙。
书到了以后,大概地通读了一遍,本书不仅介绍了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!”
参考
- 《RISC-V体系结构编程与实践(第二版)》
- riscv-sbi-doc:https://github.com/riscv-non-isa/riscv-sbi-doc
- https://tinylab.org/introduction-to-riscv-sbi/
- https://www.cnblogs.com/arnoldlu/p/18170952