本书约定
为了帮助读者更好地阅读本书、完成本书的实验,我们对本书的术语、实验环境做了一些约定。
1.RISC-V与RV64术语
目前RISC-V体系结构主要包括RV32以及RV64,即32位体系结构以及64位体系结构。本书重点介绍与RV64相关的内容。除了在寄存器位宽、地址映射模式等方面有区别,RV32和RV64还有其他方面的细微差异,不过本书不会详细介绍它们之间的区别。要了解关于RV32的内容,请读者自行阅读RISC-V官方手册。
RISC-V体系结构手册使用哈特(Hart)来描述一个处理器硬件线程,这个术语类似于x86体系结构定义的超线中央程(Simultaneous Multi-Threading,SMT)以及ARMv8体系结构定义的处理机(Processing Element,PE)。不过截至2022年,还没有商用的RISC-V处理器实现超线中央程技术,因此,本书对哈特和中央处理器(Central Processing Unit,CPU)这两个概念不做严格区分,继续沿用CPU这个通用的概念来描述一个处理器执行单元或者硬件线程(如果硬件实现了SMT)。
2.实现案例
本书基于Linux内核以及小型操作系统(BenOS)进行讲解。Linux内核采用Linux 5.15。本书大部分实验以BenOS为基础,读者可从最简单的裸机程序不断进行扩展,最终完成一个具有内存管理、进程调度、系统调用等基本功能的小型操作系统,从而学习和掌握RV64体系结构的相关知识。我们在实验的设计过程中参考了Linux内核等开源代码的实现,在此对开源社区表示感谢。
3.实验环境
本书推荐的实验环境如下。
● 主机硬件平台:Intel x86-64处理器兼容主机。
● 主机操作系统:Ubuntu Linux 20.04[1]。
● GCC版本:9(riscv64-linux-gnu-gcc)。
● QEMU版本:4.2.1。
● GDB版本:gdb-multiarch。
[1]推荐读者使用我们提供的VMware/VirtualBox镜像。
读者在安装完Ubuntu Linux 20.04系统后,可通过如下命令安装本书需要的软件包。
$ sudo apt update -y
$ sudo apt install net-tools libncurses5-dev libssl-dev build-essential openssl qemu-
system-misc libncurses5-dev gcc-riscv64-linux-gnu git bison flex bc vim universal-
ctags cscope gdb-multiarch libsdl2-dev libreadline-dev
我们基于VMware/VirtualBox镜像搭建了全套开发环境,读者可以通过“奔跑吧Linux社区”微信公众号获取“全套开发环境”的下载地址。使用本书配套的VMware/VirtualBox镜像可以减少配置开发环境带来的麻烦。
4.实验平台
读者无须额外购买开发板,推荐在如下两个免费的模拟器实验平台上完成本书所有实验。
● QEMU。
● 香山模拟器NEMU[2]。
[2]有部分实验还没在NEMU上实现,不过可以在QEMU上完成。
5.实验参考代码和配套资料下载
为了节省篇幅,本书大部分实验只列出了实验目的和实验要求,希望读者能独立完成实验。
在GitHub网站搜索“runninglinuxkernel/riscv_ programming_ practice”即可找到本书大部分实验的参考代码以及示例代码。
本书有如下配套资料。
● 大部分实验的参考代码以及示例代码。
● VMware/VirtualBox镜像,内置了实验环境。
● 免费教学视频。
读者可以通过关注微信公众号“奔跑吧Linux社区”,输入“risc-v”获取配套资料的下载地址。
6.芯片资料
作者在编写本书的过程中参考了RISC-V官方的技术资料以及与 GNU 工具链相关的文档。下面是涉及的技术手册,这些技术手册都是公开发布的,读者可以在RISC-V基金会官网、SiFive官网以及GNU官网上下载。
● The RISC-V Instruction Set Manual Volume I: Unprivileged ISA, Document Version 20191213:RISC-V指令集手册。
● The RISC-V Instruction Set Manual Volume II: Privileged Architecture, Document Version 20211203:RISC-V体系结构手册。
● SiFive FU740-C000 Manual, v1p6:SiFive公司的FU740处理器内核技术手册。
● Using the GNU Compiler Collection, v9.3:GCC官方手册。
● Using as, the GNU Assembler, v2.34:汇编器(AS)官方手册。
● Using ld, the GNU Linker, v2.34:链接器(LD)官方手册。
● RISC-V“V”Vector Extension, Version 1.0:RVV手册。
● RISC-V Base Cache Management Operation ISA Extensions, Version 1.0:RISC-V高速缓存维护指令扩展手册。
● RISC-V Platform-Level Interrupt Controller Specification, Version 1.0:PLIC手册。
● RISC-V ABIs Specification, Version 0.01:RISC-V ABI接口手册。
● RISC-V Supervisor Binary Interface Specification, Version 1.0.0:RISC-V SBI手册。
● SiFive TileLink Specification, Version 1.8.1:TileLink总线手册。
● 香山官方文档:香山处理器手册。
7.汇编代码大小写
RISC-V指令、寄存器的书写方式约定如下。
● 关于RISC-V指令,在汇编代码中用小写,在正文中用大写。
● 关于通用寄存器和系统寄存器,在汇编代码和正文中都用小写。若使用大写形式书写通用寄存器和系统寄存器,汇编器会报错。
8.汇编代码说明
在RISC-V汇编代码中,本书有如下约定。
● (xn):直接寻址模式,表示以xn寄存器的值为基地址进行寻址,在本书中简称为xn地址,示例如下。
ld x2, (x1) //从x1地址中加载8字节数据到x2寄存器中
sd x2, (x1) //把x2寄存器的值存储到x1地址中
● offset(xn):偏移寻址模式,表示以xn寄存器的值为基地址,然后偏移offset字节进行寻址。
ld x2, 8(x1) //从x1+8地址中加载8字节数据到x2寄存器中
sd x2, 8(x1) //把x2寄存器的值存储到x1+8地址中