RISC-V体系结构编程与实践(第2版)

978-7-115-64603-3
作者: 笨叔
译者:
编辑: 张涛

图书目录:

详情

本书旨在介绍 RISC-V 体系结构的设计和实现。本书首先介绍 RISC-V 体系结构基础知识、实验环境搭建、基础指令集、函数调用规范与栈,然后讲解 GNU 汇编器、链接器与链接脚本、内嵌汇编代码,接着讨论 RISC-V 体系结构中的异常处理、中断处理与中断控制器、内存管理、高速缓存、缓存一致性、TLB 管理、原子操作、内存屏障指令、合理使用内存屏障指令、与操作系统相关的内容、可伸缩矢量计算与优化,最后阐述 RISC-V 体系结构中的压缩指令扩展、虚拟化扩展、高性能处理器架构分析等。 本书不仅适合软件开发人员阅读,还可以作为计算机相关专业和相关培训机构的教材。

图书摘要

版权信息

书名:RISC-V体系结构编程与实践(第2版)

ISBN:978-7-115-64603-3

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

版  权

著    笨 叔

责任编辑 张 涛

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内 容 提 要

本书旨在介绍RISC-V体系结构的设计和实现。本书首先介绍RISC-V体系结构基础知识、实验环境搭建、基础指令集、函数调用规范与栈,然后讲解GNU汇编器、链接器与链接脚本、内嵌汇编代码,接着讨论RISC-V体系结构中的异常处理、中断处理与中断控制器、内存管理、高速缓存、缓存一致性、TLB管理、原子操作、内存屏障指令、合理使用内存屏障指令、与操作系统相关的内容、可伸缩矢量计算与优化,最后阐述RISC-V体系结构中的压缩指令扩展、虚拟化扩展、高性能处理器架构分析等。

本书不仅适合软件开发人员阅读,还可以作为计算机相关专业和相关培训机构的教材。

推荐序

The future of RISC-V is unlimited

When we first created RISC-V in our lab at the University of California, Berkeley, we wanted a simple, efficient, extensible design we could use openly in our research. It soon became clear, however, that if we got it right, an open-standard ISA would bring important change to the chip industry, much like Wi-Fi, Linux and other open standards have changed the electronics world for the better. The skeptics told us we could never compete against the two big incumbents(x86 and ARM) and that RISC-V would never be good for anything more than embedded applications. Here in 2023, eight years since the founding of SiFive, the RISC-V community is truly global, with more than 3,950 members of the organizing body, RISC-V International, and billions of RISC-V-enabled chips shipping each year. Today SiFive is enabling innovators by delivering high performance, low power products with superior compute density that rival the performance of the fastest competition. We thought the idea would be popular, but we never dreamed how rapidly it would take hold around the world.

So what is it about RISC-V that is so popular? First, it is an open standard, and so users are not locked in to a single vendor, enabling many vendors to compete to provide the best processor designs for each market segment. Second, RISC-V is a modern architecture designed for today’s workloads and dataflows. Third, RISC-V allows flexibility and supports innovative new designs. And with each evolution the whole ecosystem grows stronger with thousands of companies supporting.

The authors have put together a textbook that incorporates the most recent RISC-V innovations and explains the most important concepts with simple examples. Ideal for software developers, students and chip professionals looking to understand this fast-growing phenomenon, the book provides valuable definitions and clear examples. It comes at a pivotal time, as China continues to embrace RISC-V and the applications for it expand across verticals like datacenter, infrastructure, consumer, automotive and more. RISC-V is proving to be a superior choice for AI, ADAS and many of today’s latest applications, and as people design from scratch, it’s an easy way to speed time-to-market.

Whether you’re a student just getting started, or a seasoned professional looking to understand this fast-moving market, this book will help you understand the key principles and the innovation inside of RISC-V. We are proud of how RISC-V has grown and look forward to its future, which we like to say, is unlimited. Welcome to the ecosystem, we look forward to hearing what you do with RISC-V.

以下是英文推荐序的译文。

RISC-V的未来有无限可能

在加利福尼亚大学伯克利分校的实验室首次创建RISC-V时,我们就想要一种简单、高效、可扩展的(处理器架构)设计,并可以在科研中公开使用。事情很快变得清晰起来,如果我们做对了,那么一个开放标准的指令集架构(ISA)将给芯片行业带来重大变化,就像Wi-Fi、Linux和其他开放标准让电子世界变得更好那样。有人质疑,RISC-V永远无法与两大指令集架构(x86和ARM)竞争,因为它只适用于嵌入式应用。然而,到2023年,也就是SiFive公司成立8年之际,RISC-V社区已经真正走向全球,其组织机构——RISC-V国际基金会拥有超过3950名成员,每年出货数十亿颗支持RISC-V的芯片。如今,SiFive公司通过提供高性能、低功耗、具有优越计算密度的产品,让创新者得以发展,这些产品能够与世界上最强大竞争对手的产品相媲美。起初我们只是认为这个想法可能会很受欢迎,但没想到它会以这么快的速度在世界各地流行起来。

RISC-V为何如此受欢迎呢?首先,它是一个开放的标准,所以面向的用户不会锁定在单一的供应商,而是许多供应商都能够参与竞争,为每个细分市场提供最好的处理器设计。其次,RISC-V是为当今的工作负载和数据流而设计的现代处理器架构。最后,RISC-V较灵活并支持创新的设计。每演进一次,在数千家公司的支持下整个生态系统将变得更加强大。

作者编写的这本书,包含了新的RISC-V创新理论,并用简单的例子解释了最重要的概念。本书提供了有价值的定义和清晰的例子,非常适合想要了解这一快速增长现象的软件开发人员、芯片行业从业人员以及相关专业学生学习参考。随着中国持续接纳RISC-V,其在数据中心、基础设施、消费、汽车等垂直领域的应用和扩展迎来了一个关键时期。事实证明,RISC-V逐渐成为人工智能(Artificial Intelligence,AI)、高级驾驶辅助系统(Advanced Driving Assistance System,ADAS)以及当今许多最新应用的最佳选择,当人们从头开始设计处理器时,使用RISC-V是缩短上市时间的简单方法。

无论你是刚开始学习的学生,还是想要了解这个快速发展的市场的经验丰富的专业人士,这本书都能够帮助你理解RISC-V的关键原理和创新。我们为RISC-V的发展感到骄傲,并期待它的未来,RISC-V的未来有无限可能。欢迎来到RISC-V生态系统,期待听到你用RISC-V做了什么。

加利福尼亚大学伯克利分校研究生院教授

SiFive公司联合创始人兼首席架构师

Krste Asanovic

前  言

开源RISC-V处理器架构为国产芯片提供了一条全新的可行路径。为了帮助国内芯片研究人员和从业人员快速、深入地理解开源RISC-V处理器架构,我们在2023年出版了本书第一版。本书第一版得到了广泛的关注和讨论,许多工程技术专业人士、高校老师以及在校学生阅读后给我们提供了宝贵的建议。另外,该书还非常荣幸地得到了2023年度国家科学技术学术著作出版基金项目的资助,这是对作者最大的鼓励。在本书中,我们在第一版的基础上做了必要的勘误及优化,力求为读者呈现新的RISC-V处理器架构和系统软件方面的研究心得与成果,如开源高性能处理器的优秀代表香山处理器、商业高性能处理器的杰出代表SiFive P870及X280处理器等。

站在2024年看处理器的发展,RISC-V受到学术界和工业界越来越多的关注,已经成为第三大体系结构。2023年,谷歌公司宣布Android将全面支持RISC-V处理器架构,并将RISC-V视为Android的一级平台(Tier-1 Platform),即把 RISC-V 视为与 ARM架构同等重要,这有助于RISC-V在移动终端领域的生态发展。RISC-V在高性能领域的发展也特别迅猛,例如国内有厂商推出了64核的RISC-V服务器芯片,为推动RISC-V服务器生态起到了积极作用;SiFive公司在2023年发布的P870处理器瞄准了移动计算、消费电子产品、数据中心以及边缘基础设施等需要强大计算能力,并且对功率、性能、安全性及面积效率有较高需求的应用场景。

主要修订内容

本书是在第一版的基础上修订与优化形成的,主要修订内容如下。

对全书进行了全面的勘误和优化。

在第14章增加了LR/SC指令执行失败的内容。

新增了第21章(包括处理器架构基础、香山处理器架构分析、SiFive P870和SiFive P870和SiFive X280处理器核心分析等内容)。

致谢

在本书第一版出版之后,有不少热心和细心的读者发现并指出书中存在的错误,笔者对他们表示感谢!他们是曲家乐、孙家明、代祥军、李泽辰、王帅、綦文举、唐华博、王顺、刘杰。

本次修订得到了SiFive公司创始团队成员、资深总裁Jack Kang先生的大力支持,Jack Kang对RISC-V在中国的普及和推广工作非常支持,并且为本书的编写提供了大量RISC-V高性能处理器的新知识,让读者有机会深入了解新的商业高性能RISC-V处理器的实现原理和技术成果。另外,SiFive公司的Tina Xiang、Franky Fan以及Rocky Zhang也非常关注本书的修订,帮忙审阅了部分书稿,并给出了许多宝贵的意见和建议。

最后特别感谢RISC-V主要发明人、加利福尼亚大学伯克利分校的Krste Asanovic教授对本书编写和出版工作的关心,他对RISC-V在中国的发展寄予了厚望。正如他在本书推荐序中说的那样:“RISC-V的未来有无限可能。欢迎来到RISC-V生态系统,期待听到你用RISC-V做了什么。”

第一版前言

站在2023年来看处理器的发展,x86-64与ARM64体系结构依然是目前市场上的主流处理器体系结构。不过一个可喜的变化是,RISC-V受到学术界和工业界越来越多的关注,很有可能成为第三大体系结构。最近几年,国内出现了一批优秀的芯片公司和科研机构,它们基于RISC-V体系结构来打造国产芯片,包括微控制单元(Micro-Controller Unit,MCU)芯片、高性能处理器芯片。开源高性能处理器的优秀代表有香山处理器等。

RISC-V体系结构以先进、简洁以及开源等众多优点,得到了国内外高校的青睐。越来越多的高校采用RISC-V体系结构作为蓝本讲授“计算机系统基础”“计算机组成原理”“操作系统”“嵌入式系统”等计算机相关专业的核心课程,甚至涌现出一批基于RISC-V体系结构的创新性和开拓性教学项目,如中国科学院大学的“一生一芯”计划。

RISC-V是一个崭新的体系结构,软硬件生态也在逐步完善。为了帮助读者快速、深入地了解RISC-V体系结构,本书作者以工程师的视角,结合大学课程特点、企业新员工培训需求以及实际工程项目经验,精心设计了几十个有趣的实验,读者可以通过这些实验逐步深入学习和理解RISC-V体系结构与编程。

本书特色

本书有如下特色。

突出动手实践。要掌握一门新技术,动手实践是非常有效的方法。本书基于QEMU(Quick Emulator)以及香山模拟器(NJU Emulator,NEMU)介绍了几十个有趣的实验,读者可以采用搭积木的方法,从编写第一行代码开始,通过一个个实验逐步深入学习RISC-V体系结构,最终编写一个能在QEMU或者NEMU上运行的简易小型操作系统,它具有存储管理单元(Memory Management Unit,MMU)以及进程调度等功能。

以问题为导向。问题导向式的学习方式有利于提高学习效率。本书在大部分章首列举了一些思考题,用于激发读者探索未知知识的兴趣。这些思考题也是各大公司的高频面试题,仔细解答这些问题对读者将来的面试大有裨益。

基于64位处理器讲述RISC-V体系结构。本书不仅介绍开源的64位香山处理器的微架构实现,还介绍RV64指令集、GCC、链接器、链接脚本、异常处理、中断处理、内存管理、TLB管理、内存屏障指令、可伸缩矢量计算与优化以及虚拟化扩展等方面的知识。本书把RISC-V体系结构中难理解的部分通过通俗易懂的语言呈现给读者,并通过有趣的案例分析帮助读者加深理解。

总结常见“陷阱”与项目经验。本书总结了众多一线工程师在实际项目中遇到的“陷阱”,如使用指令集时的“陷阱”等,这些宝贵的项目经验会对读者有所帮助。

本书主要内容

本书主要介绍RISC-V体系结构的相关内容,重点介绍RV64指令集、GNU汇编器、链接器、链接脚本、内存管理、高速缓存、可伸缩矢量计算与优化以及虚拟化扩展等。

本书共20章,包含如下内容。

第1章介绍RISC-V体系结构基础知识。

第2章介绍如何使用QEMU及香山模拟器NEMU搭建RISC-V实验环境等内容。

第3章讨论RISC-V指令集中的常见指令以及常见陷阱等内容。

第4章介绍函数调用规范、栈等内容。

第5章介绍GNU汇编器的汇编语法、常用的伪指令、RISC-V特有的命令行选项和伪指令等内容。

第6章介绍链接器、链接脚本的相关内容。

第7章介绍GCC内嵌汇编代码的相关内容。

第8章介绍RISC-V体系结构中异常处理基本概念、与M模式相关的异常寄存器、与S模式相关的异常寄存器、异常上下文等内容。

第9章介绍RISC-V体系结构里中断处理基本概念、CLINT、PLIC等内容。

第10章介绍RISC-V体系结构中的内存管理的基础知识,包括页表、页表项的常见属性、页表创建过程及恒等映射等内容。

第11章介绍高速缓存的基础知识,包括高速缓存的工作原理、映射方式,虚拟高速缓存,物理高速缓存等相关内容。

第12章介绍缓存一致性,包括缓存一致性的分类、MESI协议、高速缓存伪共享等内容。

第13章介绍TLB管理,包括TLB基础知识、ASID、TLB管理指令等内容。

第14章介绍原子操作,包括原子操作基本概念、独占内存访问工作原理、原子内存访问操作指令等内容。

第15章介绍内存屏障指令,包括产生内存屏障指令的原因、RVWMO内存模型中的一些约束条件及RISC-V中的内存屏障指令等内容。

第16章介绍如何合理使用内存屏障指令等内容。

第17章介绍与操作系统相关的内容,包括C语言常见的陷阱、简易进程调度器、系统调用等内容。

第18章介绍可伸缩矢量计算与优化等内容。

第19章介绍RISC-V中的压缩指令扩展等内容。

第20章介绍RISC-V中的虚拟化扩展,包括CPU虚拟化、内存虚拟化、中断虚拟化等内容。

附录部分。

联系作者

由于作者知识水平有限,书中难免存在不妥之处,敬请各位读者批评指正。欢迎通过电子邮箱runninglinuxkernel@126.com与作者交流。若读者要下载本书配套的实验环境、示例代码以及实验参考代码,请关注“奔跑吧Linux社区”微信公众号并发送“risc-v”,获取下载地址。

致谢

在编写本书的过程中,作者得到了中国科学院计算技术研究所的包云岗老师及香山处理器团队成员的大力支持,他们为本书提供了香山处理器微架构的实现细节以及香山模拟器NEMU,让读者有机会深入了解一款开源高性能处理器的实现细节。余子濠博士为本书实验能在香山模拟器NEMU上完成做了大量适配和优化工作,让本书的实验变得更加丰富和有趣。另外,香山处理器团队的成员还帮忙审阅了本书的书稿,并给出了宝贵的意见和建议。在此,衷心感谢包云岗老师以及余子濠、王凯帆、张梓悦。

作者在编写本书的过程中还得到梁宇宁和陈志坚的鼎力支持和鼓励,陈志坚老师审阅了本书的书稿并给出了许多宝贵的意见和建议。另外,孙彦邦、张猛、赖建新、李隆以及肖林杰也帮忙审阅了部分书稿,在此表示感谢。

本书在编写过程中也得到了龙蜥社区运营委员会主席陈绪与技术委员会主席杨勇的大力支持和帮助。龙蜥社区RISC-V特别兴趣小组(Special Interest Group,SIG)成员王宝林、宋卓等帮忙审阅了本书,并给出了宝贵的反馈和改进意见。

本书由笨叔策划和主编,奔跑吧Linux社区中一群热爱开源的热心工程师参与了本书的编写和审阅工作,他们是张毅峰、胡茂留、牛立群、胡进、何花、黄山、郑律。另外,还有一些热心的工程师帮忙审阅了部分书稿,他们是贾献华、钱为、孙少策、曹文辉、钟居哲、陆亚涵、王乐、杨明辉、杨勇、张诺方、李朋、潘建亨、方盛洲、朱信冉、张志鹏等。

笨叔

本书约定

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

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

第1章 RISC-V体系结构基础知识

本章思考题

1.RISC-V体系结构有什么特点?

2.RISC-V体系结构包含几种处理器模式?它们分别有什么作用?

3.RISC-V体系结构包含多少个通用寄存器?

4.在RISC-V体系结构中,Hart代表什么意思?

5.在RISC-V体系结构中,什么是SBI?

本章主要介绍RISC-V体系结构基础知识。

1.1 RISC-V介绍

RISC是Reduced Instruction Set Computer的缩写,中文意思是“精简指令集计算机”,而RISC-V源自美国加利福尼亚大学伯克利分校,其中V表示第5代,因为在此之前加利福尼亚大学伯克利分校已经完成了4代RISC体系结构的设计。

早在2010年,加利福尼亚大学伯克利分校的研究人员在对比市面上所有的RISC体系结构后发现,指令集越来越复杂和臃肿,而且授权费很高,于是他们打算自行设计一套全新的开源指令集。

2015年,RISC-V基金会成立,旨在维护指令集以及体系结构规范的标准化和完整性。此外,他们还成立了SiFive公司,以推动RISC-V商业化落地。

RISC-V基金会吸引了全球高校、学术机构以及芯片设计、软件开发等领域的商业公司加入,负责维护RISC-V指令集标准规范以及各种体系结构和扩展特性的规范文档的审阅与发布。

1.1.1 RISC-V指令集优点

作为一个后起之秀,RISC-V指令集在设计时充分借鉴了其他商业化指令的优点,并且吸取了它们的经验和教训。RISC-V指令集具有如下优点。

设计简洁。RISC-V指令集和基础体系结构的设计都相当简洁,特别是RISC-V的指令集文档和基础体系结构设计文档一共才几百页,而一些商业RISC芯片的文档有上万页。

模块化。RISC-V指令集采用模块化设计思想。它具有一个最小的指令集,这个指令集可以完整地实现一个软件栈,然后通过模块化的方式实现其他扩展功能的指令,如浮点数乘法和除法指令、矢量指令等。模块化的RISC-V体系结构使用户能够灵活选择不同的模块组合,以适应不同的应用场景,从嵌入式设备到服务器都可以使用RISC-V体系结构进行设计。

开源。RISC-V指令集采用BSD开源协议授权。使用RISC-V指令集进行教学、学术研究,甚至是商业化都不需要支付授权费。

具有丰富的软件生态。目前大部分开源软件都支持RISC-V指令集,包括Linux内核、GCC(GNU Compiler Collection, GNU编辑器套件)等。

1.1.2 RISC-V指令集扩展

RISC-V针对32位处理器的最小指令集是RV32I,表示32位基础整型指令集。它大约包含40条指令,可以在32位处理器上实现一个完整的软件栈。RV32I是RISC-V指令集中固定不变的最小指令集。RISC-V针对64位处理器的最小指令集是RV64I,表示64位基础整型指令集。RV64I在RV32I的基础上添加了对字(word)、双字(double word)和长整型(long)版本指令的支持,并且将所有寄存器都扩展到64位。本章主要介绍RV64I指令集。本书把32位处理器使用的指令集简称为RV32指令集,把64位处理器使用的指令集简称为RV64指令集

在RV32I和RV64I的基础上,RISC-V指令集还支持模块化扩展,以支持更多特性,RISC-V扩展指令集如表1.1所示。

表1.1 RISC-V扩展指令集

扩展指令集

说明

F

单精度浮点数扩展指令集

D

双精度浮点数扩展指令集

Q

4倍精度浮点数扩展指令集

M

整型乘法和除法扩展指令集

C

压缩指令集(见第19章)

A

原子操作指令集(见第14章)

B

位操作指令集

E

为嵌入式设计的整型指令集

H

虚拟化扩展指令集(见第20章)

K

密码运算扩展指令集

V

可伸缩矢量扩展指令集(见第18章)

P

打包SIMD(packed-SIMD)扩展指令集

J

动态翻译语言(dynamically translated language)扩展指令集

T

事务内存(transactional memory)指令集

N

用户态中断指令集

芯片设计人员可以根据项目需求和成本选择不同的扩展指令集,以适应不同的应用场景。RISC-V提供了一个稳定的指令集组合,称为RV32G/RV64G。其中,G表示IMAFD,实现基础整型指令集、整型乘法和除法扩展指令集、原子操作指令集以及单精度浮点数和双精度浮点数扩展指令集。

1.1.3 RISC-V商业化发展

一个全新的指令集要蓬勃发展需要上游与下游公司都参与进来。为了验证和推广RISC-V,RISC-V创始人成立了SiFive公司,为RISC-V的商业化推广起到了示范作用。除了开源基于RISC-V的CPU(Central Processing Unit,中央处理器)及SoC(System on Chip,单片系统)实现,SiFive还提供基于RISC-V体系结构的商业化处理器IP、开发工具和芯片解决方案等。

国内也有许多大公司和初创公司加入RISC-V芯片设计的队伍。此外,国内的一些研究机构(如中国科学院计算技术研究所的香山处理器团队)还发布了开源的香山处理器。

1.2 RISC-V体系结构介绍

1.2.1 RISC-V体系结构

RISC-V体系结构包括指令集规范和体系结构规范以及众多的扩展规范,这些都由RISC-V基金会审阅与发布。RISC-V体系结构具有如下特点。

对学术界和工业界完全开放。

真正适合硬件实现的指令集体系结构,而不是一个模拟或者二进制翻译的指令集体系结构。

属于通用的指令集体系结构,而不是针对某个特定微体系结构的实现。

拥有实现最小整数的指令集,作为基础指令集,可以用于教学。在此基础上还能实现众多可选扩展指令,以支持通用软件的开发。

支持IEEE 754浮点标准。

支持众多扩展指令集。

支持32位及64位地址空间。

支持多核及异构体系结构。

支持可选的压缩指令编码,用以提高性能和能源效率并优化静态代码。

支持虚拟化扩展。

支持可伸缩矢量指令扩展(参见GitHub上的“Working draft of the proposed RISC-V V vector extension”)。

RISC-V支持32位指令集和64位指令集。本书重点介绍64位指令集。

1.2.2 采用RISC-V体系结构的常见处理器

下面介绍市面上常见的采用RISC-V体系结构的处理器。

1.SiFive FU740处理器

SiFive公司基于RISC-V体系结构开发了商业化64位处理器芯片,广受RISC-V开发者喜爱的HiFive Unmatched开发板便基于该处理器芯片。

FU740处理器内置1个S7处理器内核以及4个U7处理器内核。其中,S7处理器内核用于系统监控,U7处理器内核用于计算和应用。FU740处理器框架如图1.1所示。

FU740处理器具有如下特性。

完全兼容RISC-V体系结构规范。

属于64位RISC-V处理器内核。

具有32KB L1指令高速缓存。

具有32KB L1数据高速缓存。

支持8个物理内存保护区。

支持128KB大小的L2高速缓存。

内置处理器内核本地中断控制器(Core-Local Interrupt Controller,CLINT)。

支持平台级别的中断控制器(Platform-Level Interrupt Controller,PLIC),最多支持128个外设中断和7级中断优先级。

图1.1 FU740处理器框架

2.香山处理器

香山处理器是由中国科学院计算技术研究所的香山处理器团队推出的高性能64位开源处理器。它的体系结构以湖的名称命名,第一版体系结构代号是“雁栖湖”,第二版体系结构代号是“南湖”。

1.2.3 RISC-V体系结构中的基本概念

本小节介绍RISC-V体系结构中的一些基本概念。

执行环境接口(Execution Environment Interface,EEI):包括程序的初始状态、CPU的类型和数量、支持的S(Supervisor)模式、内存和I/O区域的可访问性与属性、在每个CPU上执行指令的行为以及任何异常(包括中断、系统调用)的处理等。常见的RISC-V执行环境接口包括Linux应用程序二进制接口(Application Binary Interface,ABI)以及RISC-V管理员二进制接口(Supervisor Binary Interface,SBI)。一个RISC-V执行环境接口可以由纯硬件、纯软件或者软硬件结合实现,示例如下。

裸机程序:程序直接通过ABI访问硬件资源,如图1.2(a)所示。

操作系统:提供U(User)模式的执行环境并复用到物理处理器线程中,同时提供虚拟内存机制。它在操作系统与管理员执行环境(Supervisor Execution Environment,SEE)之间提供一层SBI,对所有RISC-V硬件平台中共性的功能做了抽象,为操作系统访问M(Machine)模式的硬件资源提供服务,如图1.2(b)所示。

虚拟化:为客户操作系统提供多个特权模式的执行环境。每个客户操作系统通过SBI访问虚拟化管理程序,如图1.2(c)所示。此外,虚拟化管理程序可以通过虚拟机监控程序二进制接口(Hypervisor Binary Interface,HBI)访问虚拟机监控程序执行环境(Hypervisor Execution Environment,HEE)中的硬件资源。

模拟器:在主机上模拟RISC-V的用户模式以及特权模式的执行环境。

硬件线程(Hart):一个处理器执行线程,在执行环境中自主获取和执行RISC-V指令资源的硬件单元,类似于x86体系结构中的超线程(Hyper-Threading,HT)以及ARMv8体系结构中的处理机(processing element)。SMT(Surface Mount Technology, 表面安装技术)让同一个处理器内核上的多个线程同步执行并共享处理器的执行资源。假设一个RISC-V处理器实现了超线程技术,那么一个处理器内核就有多个硬件线程,不过目前商用的RISC-V处理器还没有实现超线程技术。

图1.2 执行环境接口

特权级别(privilege level)包括RISC-V处理器提供的3种模式。

机器模式(M模式):以M模式运行的代码通常在本质上是可信的,因为它具有对机器实现的全部访问权限,常用于管理RISC-V上的安全执行环境。通常在M模式下运行SBI固件,为操作系统提供服务。

特权模式(S模式):通常用来运行操作系统的内核,为应用程序提供服务。

用户模式(U模式):特权级别最低,通常用来运行应用程序。

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

HS模式:把原有的S模式扩展为HS模式,用来运行虚拟化管理程序。

VS模式:通常用来运行虚拟机操作系统内核。

VU模式:通常用来运行虚拟机操作系统中的应用程序。

所有硬件的实现必须提供M模式,因为这是唯一可以不受限制地访问整个机器的资源。简单的RISC-V系统(如嵌入式系统)只提供M模式,表1.2所示为特权级别使用场景。

表1.2 特权级别使用场景

特权级别个数

支持的模式

使用场景

1

M模式

嵌入式系统

2

M模式和U模式

具有安全特性的嵌入式系统

3

M模式、S模式和U模式

通用操作系统

5

M模式、HS模式、VS模式、VU模式和U模式

虚拟机操作系统

1.2.4 SBI服务

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

在现代操作系统体系结构中,内核空间和用户空间之间多了一个中间层,即系统调用层,它为用户空间中的应用程序提供硬件抽象接口。SBI与操作系统中的系统调用层非常类似,有如下几个优点。

为运行在低级别的处理器模式提供访问M模式下的硬件资源(如S模式下的操作系统或者U模式下的应用程序)的抽象接口。

保证系统稳定和安全。因为M模式下的处理器具有对系统资源的全部访问权限,如果某些硬件资源直接开放给S模式和U模式,可能会造成系统的安全问题。

可移植性。在不修改源代码的情况下,让不同的操作系统或者不同厂商设计的RISC-V系统都能运行。

在没有使能虚拟化扩展的RISC-V系统(见图1.3)中,SBI固件运行在M模式下,它为运行在S模式下的操作系统提供SBI调用服务,而运行在S模式下的操作系统则为应用程序提供系统调用服务。

图1.3 没有使能虚拟化扩展的RISC-V系统

在使能了虚拟化扩展的RISC-V系统(见图1.4)中,系统内分成了两个世界:一个是虚拟化世界,另一个是主机世界。在虚拟化世界中,M模式下的SBI固件可以为虚拟化管理程序提供SBI调用服务。另外, HS模式下的虚拟化管理程序也可以为虚拟机的操作系统提供SBI调用服务。在主机世界中,运行在U模式下的主机的应用程序可以通过系统调用来访问虚拟化管理程序提供的服务。

图1.4 使能了虚拟化扩展的RISC-V系统

1.3 RISC-V寄存器

1.3.1 通用寄存器

64位/32位的RISC-V体系结构提供32个64位/32位的整型通用寄存器,分别是x0~x31寄存器,如图1.5所示。对于浮点数运算,64位的RISC-V体系结构也提供32个浮点数通用寄存器,分别是f0~f31寄存器。

RISC-V的通用寄存器通常具有别名和特殊用途,在书写汇编指令时可以直接使用别名。

x0寄存器的别名为zero。寄存器的内容全是0,可以用作源寄存器,也可以用作目标寄存器。

x1寄存器的别名为ra——链接寄存器,用于保存函数返回地址。

x2寄存器的别名为sp——栈指针寄存器,指向栈的地址。

图1.5 RISC-V整型通用寄存器

x3寄存器的别名为gp——全局寄存器,用于链接器松弛优化。

x4寄存器的别名为tp——线程寄存器,通常在操作系统中用于保存指向进程控制块——task_struct数据结构的指针。

x5~x7以及x28~x31寄存器为临时寄存器,它们的别名分别是t0~t6。

x8~x9以及x18~x27寄存器的别名分别是s0~s11。如果函数调用过程中要使用这些寄存器,需要先保存到栈里。另外,s0寄存器可以用作栈帧指针(Frame Pointer,FP)。

x10~x17寄存器的别名分别为a0~a7,用于在调用函数时传递参数和返回结果。

除用于数据运算和存储之外,通用寄存器还可以在函数调用过程中起到特殊作用。RISC-V体系结构的函数调用规范对此有约定,详见第4章。

1.3.2 系统寄存器

除上面介绍的通用寄存器之外,RISC-V体系结构还定义了很多的系统控制和状态寄存器(Control and Status Register,CSR),通过访问和设置这些系统寄存器可以完成对处理器不同的功能配置。

RISC-V体系结构支持以下3类系统寄存器。

M模式的系统寄存器。

S模式的系统寄存器。

U模式的系统寄存器。

程序可以通过CSR指令(如CSRRW指令)访问系统寄存器,详见3.11节。

CSR指令编码中预留了12位编码空间(csr[11:0])用来索引系统寄存器,如图1.6所示,即指令编码中的Bit[31:20]。

图1.6 CSR指令编码

RISC-V体系结构对12位CSR编码空间做了约定。其中,Bit[11:10]用来表示系统寄存器的读写属性,0b11表示只读,其余表示可读可写。Bit[9:8]表示允许访问该系统寄存器的处理器模式,0b00表示U模式,0b01表示S模式,0b10表示HS/VS模式,0b11表示M模式。剩余的位用作寄存器的索引。使用CSR地址的最高位对默认的访问权限进行编码,简化了硬件中的错误检查流程,并提供了更大的CSR编码空间,但限制了CSR到地址空间的映射。CSR地址空间映射如表1.3所示。

表1.3 CSR地址空间映射

地址范围

CSR编码

访问模式

访问权限

Bit[11:10]

Bit[9:8]

Bit[7:4]

0x000~0x0FF

00

00

XXXX

U

读写

0x400~0x4FF

01

00

XXXX

U

读写

0x800~0x8FF

10

00

XXXX

U

读写(用户自定义系统寄存器)

0xC00~0xC7F

11

00

0XXX

U

只读

0xC80~0xCBF

11

00

10XX

U

只读

0xCC0~0xCFF

11

00

11XX

U

只读

0x100~0x1FF

00

01

XXXX

S

读写

0x500~0x57F

01

01

0XXX

S

读写

0x580~0x5BF

01

01

10XX

S

读写

0x5C0~0x5FF

01

01

11XX

S

读写(用户自定义系统寄存器)

0x900~0x97F

10

01

0XXX

S

读写

0x980~0x9BF

10

01

10XX

S

读写

0x9C0~0x9FF

10

01

11XX

S

读写(用户自定义系统寄存器)

0xD00~0xD7F

11

01

0XXX

S

只读

0xD80~0xDBF

11

01

10XX

S

只读

0xDC0~0xDFF

11

01

11XX

S

只读(用户自定义系统寄存器)

0x300~0x3FF

00

11

XXXX

M

读写

0x700~0x77F

01

11

0XXX

M

读写

0x780~0x79F

01

11

100X

M

读写

0x7A0~0x7AF

01

11

1010

M

读写(用于调试寄存器)

0x7B0~0x7BF

01

11

1011

M

读写(只能用于调试寄存器)

0x7C0~0x7FF

01

11

11XX

M

读写(用户自定义系统寄存器)

0xB00~0xB7F

10

11

0XXX

M

读写

0xB80~0xBBF

10

11

10XX

M

读写

0xBC0~0xBFF

10

11

11XX

M

读写(用户自定义系统寄存器)

0xF00~0xF7F

11

11

0XXX

M

只读

0xF80~0xFBF

11

11

10XX

M

只读

0xFC0~0xFFF

11

11

11XX

M

只读(用户自定义系统寄存器)

注:① CSR编码中的“X”可以是0或1。

下面的访问行为会触发非法指令异常。

访问不存在或者没有实现的系统寄存器。

尝试写入只具有只读属性的系统寄存器。

在低级别的处理器模式下访问高级别的处理器模式的系统寄存器,例如,在S模式下访问M模式的系统寄存器。

1.3.3 U模式下的系统寄存器

U模式下的系统寄存器如表1.4所示。

表1.4 U模式下的系统寄存器

地址

CSR名称

属性

说明

0x001

fflags

URW

U模式下的浮点数累积异常(accrued exception)

0x002

frm

URW

U模式下的浮点数动态舍入模式(dynamic rounding mode)

0x003

fcsr

URW

U模式下的浮点数控制和状态寄存器

0xC00

cycle

URO

U模式下的读取时钟周期,映射到RDCYCLE伪指令

0xC01

time

URO

U模式下的读取time系统寄存器的值,映射到RDTIME伪指令

0xC02

instret

URO

U模式下的执行指令数目,映射到RDINSTRET伪指令

0xC03~0xC1F

hpmcounter3~hpmcounter31

URO

U模式下的性能监测寄存器

RDCYCLE伪指令读取cycle系统寄存器的值,返回处理器内核执行的时钟周期数。注意,它返回的是物理处理器内核(而不是处理器硬件线程)的时钟周期数。RDCYCLE伪指令的主要作用是进行性能监控和调优。

RDTIME伪指令读取time系统寄存器的值,获取系统的实际时间。系统每次启动时读取互补金属-氧化物-半导体(Complementary Metal-Oxide-Semiconductor,CMOS)上的RTC(Real Time Clock,实时时钟)计数,时钟中断时更新该计数。

RDINSTRET伪指令读取instret系统寄存器的值,返回处理器执行线程已经执行的指令数量。

hpmcounter3~hpmcounter31为29个用于系统性能监测的寄存器,这些计数器的计数记录平台的事件,并通过额外的特权寄存器进行配置。

RDCYCLE、RDTIME以及RDINSTRET伪指令在某些处理器上是通过SBI固件进行软件模拟实现的。例如,在U模式下使用RDTIME伪指令会触发非法指令异常,处理器将陷入M模式,M模式下的异常处理程序会读取time系统寄存器的值,然后返回U模式。

1.3.4 S模式下的系统寄存器

S模式下的系统寄存器如表1.5所示。

表1.5 S模式下的系统寄存器

地址

CSR名称

属性

说明

0x100

sstatus

SRW

S模式下的处理器状态寄存器

0x104

sie

SRW

S模式下的中断使能寄存器

0x105

stvec

SRW

S模式下的异常向量表入口地址寄存器

0x106

scounteren

SRW

S模式下的计数使能寄存器

0x10A

senvcfg

SRW

S模式下的环境配置寄存器

0x140

sscratch

SRW

S模式下的用于异常处理的临时寄存器

0x141

sepc

SRW

S模式下的异常模式程序计数器(Program Counter,PC)寄存器

0x142

scause

SRW

S模式下的异常原因寄存器

0x143

stval

SRW

S模式下的异常向量寄存器

0x144

sip

SRW

S模式下的中断待定寄存器

0x180

satp

SRW

S模式下的地址转换与保护寄存器

0x5A8

scontext

SRW

S模式下的上下文寄存器(用于调试)

接下来,介绍表1.5中的部分寄存器。

1.sstatus寄存器

sstatus寄存器表示S模式下的处理器状态,如图1.7所示。

图1.7 sstatus寄存器

图1.7中的WPRI表示这些字段是保留的,软件应该忽略从这些字段读取的值,并且在向同一寄存器的其他字段写入值时,应该保留这些字段中保存的值。通常,为了向前兼容,硬件会将这些字段设为只读的零值。sstatus寄存器中其他字段的含义如表1.6所示。

表1.6 sstatus寄存器中其他字段的含义

字段

位段

说明

SIE

Bit[1]

中断使能位,用来使能和关闭S模式中所有的中断

SPIE

Bit[5]

中断使能保存位。当一个异常陷入S模式时,SIE的值保存到SPIE中,SIE设置为0。当调用SRET指令返回时,从SPIE中恢复SIE,然后SPIE设置为1

UBE

Bit[6]

用来控制U模式下加载和存储指令访问内存的大小端模式

0:小端模式

1:大端模式

SPP

Bit[8]

表示陷入S模式之前CPU的处理模式

0:从U模式陷入S模式

1:在S模式触发的异常

VS

Bit[10:9]

用来使能RVV

FS

Bit[14:13]

用来使能浮点数单元

XS

Bit[16:15]

用来使能其他U模式下扩展的状态

SUM

Bit[18]

用来设置在S模式下能否允许访问U模式下的内存

0:在S模式下访问U模式的内存时会触发异常

1:在S模式下可以访问U模式的内存

MXR

Bit[19]

用来设置访问内存的权限

0:可以加载只读页面

1:可以加载可读和可执行的页面

UXL

Bit[33:32]

用来表示U模式的寄存器长度,通常是一个只读字段,并且U模式下寄存器的长度等于S模式下寄存器的长度

SD

Bit[63]

用来表示VS、FS以及XS中任意一个字段已经设置

2.sie寄存器

sie寄存器用来使能和关闭S模式下的中断,详见第8章。

3.stvec寄存器

stvec寄存器用来在S模式下配置异常向量表入口地址和异常访问模式,详见第8章。

4.scounteren寄存器

scounteren寄存器是一个32位寄存器,用来使能U模式下的硬件性能监测和计数寄存器,如图1.8所示。

图1.8 scounteren寄存器

各字段的含义如下。

CY字段:使能U模式下的cycle系统寄存器。

TM字段:使能U模式下的time系统寄存器。

IR字段:使能U模式下的instret系统寄存器。

HPM3~HPM31字段:使能U模式下的hpmcounter3~hpmcounter31系统寄存器。

5.sscratch寄存器

sscratch寄存器是一个专门给S模式使用的临时寄存器,当处理器运行在U模式下时,它用来保存S模式下的进程控制块(例如,BenOS中的task_struct数据结构)的指针。

在操作系统中,当一个进程从S模式返回U模式时,通常使用sscratch寄存器来保存该进程的task_struct数据结构的指针。当该进程需要重新返回S模式时,读取sscratch寄存器即可得到task_struct数据结构。有人认为,进程可以在U模式下调度。这是不正确的,一个进程要调度,必须返回S模式下的调度器里(见17.3.8小节)。

6.sepc寄存器

当处理器陷入S模式时,会把中断现场或触发异常时的指令对应的虚拟地址写入sepc寄存器中。

7.scause寄存器

scause寄存器用于保存S模式下的异常原因,详见第8章。

8.stval寄存器

当处理器陷入S模式时,stval寄存器会记录发生异常的虚拟地址。

9.sip寄存器

sip寄存器用来表示哪些中断处于待定(pending)状态,详见第8章。

10.satp寄存器

satp寄存器用于地址转换,详见第10章。

1.3.5 M模式下的系统寄存器

M模式下的系统寄存器如表1.7所示。

表1.7 M模式下的系统寄存器

地址

CSR名称

属性

说明

0xF11

mvendorid

MRO

机器厂商ID寄存器

0xF12

marchid

MRO

体系结构ID寄存器

0xF13

mimpid

MRO

实现编号寄存器

0xF14

mhartid

MRO

处理器硬件线程ID寄存器

0xF15

mconfigptr

MRO

配置数据结构寄存器

0x300

mstatus

MRW

M模式下的处理器状态寄存器

0x301

misa

MRW

M模式下的指令集体系结构和扩展寄存器

0x302

medeleg

MRW

M模式下的异常委托寄存器

0x303

mideleg

MRW

M模式下的中断委托寄存器

0x304

mie

MRW

M模式下的中断使能寄存器

0x305

mtvec

MRW

M模式下的异常向量入口地址寄存器

0x306

mcounteren

MRW

M模式下的计数使能寄存器

0x340

mscratch

MRW

M模式下的用于异常处理的临时寄存器

0x341

mepc

MRW

M模式下的异常模式PC寄存器

0x342

mcause

MRW

M模式下的异常原因寄存器

0x343

mtval

MRW

M模式下的异常向量寄存器

0x344

mip

MRW

M模式下的中断待定寄存器

0x34A

mtinst

MRW

M模式下的陷入指令(用于虚拟化)

0x34B

mtval2

MRW

M模式下的异常向量寄存器(用于虚拟化)

接下来,介绍表1.7中常用的寄存器。

1.misa寄存器

misa寄存器用来表示处理器支持的指令集体系结构和扩展,如图1.9所示。

图1.9 misa寄存器

字段的含义如下。

Extensions:表示处理器支持的扩展,如表1.8所示。

MXL:表示M模式下寄存器的长度。

1:表示32位。

2:表示64位。

3:表示128位。

表1.8 处理器支持的扩展

名称

说明

0

A

原子操作扩展

1

B

位操作扩展

2

C

压缩指令扩展

3

D

双精度浮点数扩展

4

E

RV32E指令集

5

F

单精度浮点数扩展

6

G

保留

7

H

虚拟化扩展

8

I

RV32I/RV64I/RV128I基础指令集

9

J

动态翻译语言扩展

10

K

保留

11

L

保留

12

M

整数乘/除扩展

13

N

用户中断扩展

14

O

保留

15

P

SIMD扩展

16

Q

4倍精度浮点数扩展

17

R

保留

18

S

支持S模式

19

T

保留

20

U

支持U模式

21

V

可伸缩矢量扩展

22

W

保留

23

X

非标准扩展

24

Y

保留

25

Z

保留

2.mvendorid寄存器

mvendorid寄存器是一个32位只读寄存器,遵循JEDEC制造商ID规范。

3.marchid寄存器

marchid寄存器用于返回处理器体系结构ID,该ID由RISC-V基金会统一分配。

4.mimpid寄存器

mimpid寄存器用于返回处理器的实现版本ID。

5.mhartid寄存器

mhartid寄存器用于返回处理器硬件线程ID。多核处理器中硬件线程的ID不一定是连续编号的,但至少有一个硬件线程的ID为0,同时需保证运行环境中硬件线程的ID互不相同。

6.mstatus寄存器

mstatus寄存器表示M模式下的处理器状态,如图1.10所示。

图1.10 mstatus寄存器

mstatus寄存器中部分字段的含义如表1.9所示。

表1.9 mstatus寄存器中部分字段的含义

字段

位段

说明

SIE

Bit[1]

中断使能位,用来使能和关闭S模式下所有的中断

MIE

Bit[3]

中断使能位,用来使能和关闭M模式下所有的中断

SPIE

Bit[5]

中断使能保存位。当一个异常陷入S模式时,SIE的值保存到SPIE中,SIE设置为0。当调用SRET指令返回时,从SPIE中恢复SIE的值,然后SPIE设置为1

UBE

Bit[6]

用来控制U模式下加载和存储指令访问内存的大小端模式

0:小端模式

1:大端模式

MPIE

Bit[7]

中断使能保存位。当一个异常陷入M模式时,MIE的值保存到MPIE中,MIE设置为0。当调用MRET指令返回时,从MPIE中恢复MIE的值,然后MPIE设置为1

SPP

Bit[8]

表示陷入S模式之前CPU的处理模式

0:从U模式陷入S模式

1:在S模式触发的异常

VS

Bit[10:9]

用来使能可伸缩矢量扩展

MPP

Bit[12:11]

表示陷入M模式之前CPU的处理模式

0:从U模式陷入M模式

1:从S模式陷入M模式

3:在M模式触发的异常

FS

Bit[14:13]

用来使能浮点数单元

XS

Bit[16:15]

用来使能U模式下扩展的其他状态

MPRV

Bit[17]

用来修改有效特权模式

0:加载和存储指令按照当前的处理器模式进行地址转换与内存保护

1:加载和存储指令按照MPP字段中存储的处理器模式的权限进行内存保护与检查

SUM

Bit[18]

指定在S模式下是否允许访问U模式的内存

0:在S模式下访问U模式下的内存时会触发异常

1:在S模式下可以访问U模式下的内存

MXR

Bit[19]

指定访问内存的权限

0:可以加载只读页面

1:可以加载可读和可执行的页面

TVM

Bit[20]

支持拦截S模式下的虚拟内存管理操作

0:在S模式下可以正常访问satp系统寄存器或者执行SFENCE.VMA/ SINVAL.VMA指令

1:在S模式下访问satp系统寄存器或者执行SFENCE.VMA/ SINVAL.VMA指令会触发非法指令异常

TW

Bit[21]

支持拦截WFI指令

0:WFI指令可以在低权限模式下执行

1:如果WFI指令以任何低特权模式执行,并且它没有在特定实现中约定的有限时间内完成,就会触发非法指令异常

TSR

Bit[22]

支持拦截SRET指令

0:在S模式下正常执行SRET指令

1:在S模式下执行SRET指令会触发非法指令异常

UXL

Bit[33:32]

用来表示U模式下寄存器的长度

SXL

Bit[35:34]

用来表示S模式下寄存器的长度

SBE

Bit[36]

用来控制S模式下加载和内存访问的大小端模式

0:小端模式

1:大端模式

MBE

Bit[37]

用来控制M模式下加载和内存访问的大小端模式

0:小端模式

1:大端模式

SD

Bit[63]

用来表示VS、FS以及XS中任意一个字段已经设置

7.medeleg寄存器

medeleg寄存器用于把异常委托到S模式下处理,详见第8章。

8.mideleg寄存器

mideleg寄存器用于把中断委托到S模式下处理,详见第8章。

9.mie寄存器

mie寄存器用来使能和关闭M模式下的中断,详见第8章。

10.mtval寄存器

当处理器陷入M模式时,mtval寄存器记录发生异常的虚拟地址。

11.mcounteren寄存器

mcounteren寄存器是一个32位寄存器,用来使能S模式或者U模式下的硬件性能监测和计数寄存器,如图1.11所示。

图1.11 mcounteren寄存器

字段的含义如下。

CY字段:使能S模式或者U模式下的cycle系统寄存器。

TM字段:使能S模式或者U模式下的time系统寄存器。

IR字段:使能S模式或者U模式下的instret系统寄存器。

HPM3~HPM31字段:使能S模式或者U模式下的hpmcounter3~hpmcounter31系统寄存器。

12.mscratch寄存器

mscratch寄存器是一个专门给M模式使用的临时寄存器,当处理器运行在S模式或者U模式下时,它用来保存M模式中上下文数据结构的指针。例如,在MySBI固件中用来保存M模式下的栈指针( Stack Pointer,SP),在OpenSBI中用来保存M模式下的sbi_scratch数据结构。

13.mepc寄存器

当处理器陷入M模式时,会将中断或遇到异常的指令的虚拟地址写入mepc寄存器中。

14.mcause寄存器

mcause寄存器是M模式下的异常原因寄存器,详见第8章。

15.mip寄存器

mip寄存器用来表示哪些中断处于待定状态,详见第8章。

相关图书

电子硬件工程师入职图解手册  硬件知识篇
电子硬件工程师入职图解手册 硬件知识篇
Altium Designer 22电路设计与仿真实战从入门到精通
Altium Designer 22电路设计与仿真实战从入门到精通
RISC-V体系结构编程与实践
RISC-V体系结构编程与实践
龙芯嵌入式系统原理与应用开发
龙芯嵌入式系统原理与应用开发
龙芯嵌入式系统软硬件平台设计
龙芯嵌入式系统软硬件平台设计
GPU编程实战(基于Python和CUDA)
GPU编程实战(基于Python和CUDA)

相关文章

相关课程