RISC-V体系结构编程与实践(第2版)
上QQ阅读APP看书,第一时间看更新

本书约定

为了帮助读者更好地阅读本书、完成本书的实验,我们对本书的术语、实验环境做了一些约定。

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地址中