版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章RISC-V处理器架构01RISC-V历史与未来1.1指令集架构基本概念1.2CISC与RISC1.3RISC-V与ARM、X86的不同1.4RISC-V发展历史1.5RISC-V基金会1.6RISC-V的未来指令集架构基本概念ISA(InstructionSetArchitecture,指令集架构)是与实现无关的指令行为规范。它定义了IS(InstructionSet,thelistofinstructions;指令集,一系列指令)及其操作的寄存器和数据类型。它还定义了其他基本功能,如内存访问和I/O。RISC-V就是一种ISA。有了指令集架构,便可以使用不同的处理器硬件实现方案来设计不同性能的处理器。处理器的具体硬件实现方案称为微架构。微架构(Microarchitecture,缩写为µarch或者uarch)是ISA的一种具体实现。它是一种硬件处理器设计。给定的一种ISA可以实现多种不同的微架构。虽然不同的微架构实现可能造成性能与成本的差异,但是软件无须做任何修改便可以完全运行在任何一款遵循同一指令集架构实现的处理器上。RISC与CISCRISC(ReducedInstructionSetComputer,精简指令集计算机),是一种基于简单性原则的计算机体系结构。RISC处理器通过精简指令集、减少每条指令的复杂性和执行时间来提高性能,使得指令执行更高效。RISC架构的处理器通常将复杂操作分解为多个简单指令来完成,这种设计有助于提高流水线的效率,并且易于实现超标量执行等高级功能。RISC的典型代表:ARM,RISC-V系列处理器。CISC(ComplexInstructionSetComputer,复杂指令集计算机),与RISC相对。CISC架处理器具有复杂而丰富的指令集,指令可能长度不固定,执行时可能需要更多的时钟周期,但允许一条指令完成较为复杂的操作,包括直接操作内存等功能。相对于RISC,CISC处理器在单个指令上可能会提供更多功能,但也可能牺牲了一些效率和性能方面的优势。CISC典型代表:Intel的x86/64系列处理器。RISCCISCRISC与CISC的区别指令数量和复杂度CISC有大量的复杂指令,可以完成多个操作或寻址模式,但使用率不高,增加了CPU的复杂度;RISC有少量的简单指令,只能完成单个操作或寻址模式,但使用率高,降低了CPU的复杂度。指令长度和格式CISC的指令长度不固定,指令格式种类多,译码较慢;RISC的指令长度固定,指令格式种类少,译码较快。内存访问方式CISC可以访问内存的指令不受限制,可以直接对内存进行操作;RISC只有Load/Store指令可以访问内存,其余指令只能对寄存器进行操作。寄存器数量和使用CISC有较少的寄存器,有些寄存器有专门的用途;RISC有大量的寄存器,所有寄存器都是通用的。指令执行时间和效率CISC的指令执行时间相差很大,大多数指令需要多个时钟周期才能完成;RISC的指令执行时间基本相同,大多数指令只需要一个时钟周期就能完成。控制器设计和编译器优化CISC的控制器大多数采用微程序控制,难以用优化编译生成高效的目标代码程序;RISC的控制器采用组合逻辑控制,注重软件优化,由编译器完成大部分优化工作RISCCISCCISC的优点和缺点指令丰富,功能强大,可以完成多个操作或寻址模式,处理特殊任务效率高。寻址方式灵活,可以访问内存的指令不受限制,可以直接对内存进行操作。以微程序控制器为核心,性能强大,指令存储器与数据存储器共享同一个物理存储空间。需要较少的内存空间,因为指令长度不固定,可以用较少的指令来完成复杂的任务。指令使用率不均衡,大多数指令需要多个时钟周期才能完成,影响计算机运算速度。不利于采用先进结构提高性能,结构复杂不利于VLSI(超大规模集成电路)实现。难以用优化编译生成高效的目标代码程序,因为指令编码复杂、长度可变。点优点缺精简指令集系统RISC的典型特点指令格式的规格化和简单化。采用Load/Store(装载/存储)指令结构。采用面向寄存器组的指令。单周期的执行无微代码的硬连线控制。注重编译的优化,力求有效地支撑高级语言程序。采用高效的流水线操作。RISC-V的设计目标要适合设计各种规模的处理器,包括从最小的嵌入式控制器,到最快的高性能计算机。要适用于所有实现技术,包括FPGA(Field-ProgrammableGateArray,现场可编程逻辑门阵列),ASIC(Application-SpecificIntegratedCircuit,专用集成电路),全定制芯片,甚至未来的制造元件技术。能用于高效实现所有微体系结构,包括微程序或硬连线控制、顺序、解耦或乱序流水线、单发射或超标量等。要稳定,基础ISA不会改变。更重要的是,它不能像以往的公司专有ISA那样消亡。要兼容各种流行的软件栈和编程语言。要支持高度定制化,成为定制加速器的基础,以应对摩尔定律的放缓。RISC-V与ARM、x86的区别RISC-V与ARM、x86的区别ARM-32(1986)MIPS-32(1986)X86-32(1978)RV32I(2010)成本整数乘法必选整数乘法必选整数乘法必选8位和16位操作。无8位和16位操作。整数乘除法可选(RV32M)简洁无零寄存器。条件执行指令。寻址模式复杂。栈指令(push/pop)廳、算术/逻辑指令中可移位立即数有零扩展和符号扩展。部分算术指令会触发溢出自陷无零寄存器。过程调用返回指令(裶脉ə停nter/leave复杂。栈指令(push/pop)。寻址模式复杂。循环指令零寄存器x0。立即数仅符号扩展。寻址模式唯一。无条件执行。无复杂调用/返回指令和栈指令。算术溢出无自陷。独立的移位指令性能分支指令条件码。指令格式中源/目的寄存器位置不固定。多字读数。立即数需计算。PC作为通用寄存器指令格式中源/目的寄存器位置不固定分支指令条件码。二操作数指令比较-跳转指令(无条件码)。三操作数指令。无多字读取。指令格式中源/目的寄存器位置固定、立即数为常数。PC不是通用寄存器架构和实现分离像通用寄存器般写入PC暴露流水线长度延迟分支。延迟取数。乘除法专用的HI和LO寄存器部分寄存器不通用(AX、CX、DX、DI、SI有特殊用途)无延迟分支。无延迟读数。通用寄存器提升空间可用操作码空间有限可用操作码空间有限可用操作码空间丰富程序大小仅32位指令(Thumb-2为独立ISA)仅32位指令(mi-croMIPS为独立ISA)指令长度可变,但选择很少32位指令+16位RV32C扩展易于编程/编译/链接15存器。内存数据必须对齐。寻址模式不规则。性能计数器不一致内存数据必须对齐。性能计数器不一致仅8个存器。无PC相对数据寻址模式。性能计数器不一致31个存器。数据不必对齐。PC相对数据寻址模式。数据寻址模式对称。性能计数器在架构中定义RISC-V与ARM、x86的区别(指令举例)开源指令集架构的比较RISC-V指令集架构与其他典型开源指令集架构的比较与商业指令集架构比较ARMCorte-A5与采用RISC-V指令集架构的Rocket比较RISC-V历史五代RISC架构处理器RISC-V是一种基于RISC规范的开放标准指令集架构(ISA),通过开放标准协作促进了新时代处理器的创新。RISC-V应用领域RISC-V已被学术界和工业界广泛采用,并被应用到各种不同的使用场景中,包括嵌入式系统、高性能计算和物联网(IoT)设备。此外,它也被考虑用于未来的百亿亿级超级计算机和其他高性能计算应用程序中。RISC-V应用领域物联网(IoT)边缘计算人工智能(AI)无线连接芯片工业控制芯片开发者社区与教育RISC-V基金会概述2015年RISC-V基金会正式成立,它是一家非营利组织,负责维护RISC-V指令集标准手册和架构文档,建立RISC-V生态。基金会成员可以使用RISC-V商标。由于RISC-V架构使用BSD
(BerkeleySoftwareDistribution,伯克利软件发行版)开源协议,给予使用者很大自由,允许使用者修改和重新发布开源代码,也允许基于开源代码开发商业软件发布和销售。同年,项目组主要成员成立了SiFive公司,以推动RISC-V的商业化应用。RISC-V基金会遵循的原则RISC-V指令集及相关标准必须对所有人开放且无须授权。RISC-V指令集规范必须能够在线下载。RISC-V的兼容性测试套件必须提供源码下载
RISC-V基金会概述2019年RISC-V基金会总部从美国迁往瑞士
,并于2020年3月完成在瑞士的注册,基金会更名为RISC国际基金会(RISCInternationalAssociation),这个行动正是向全世界传达RISC-V坚持开放自由、为全球半导体行业服务的理念,使任何组织和个人都可以不受地缘政治影响、自由平等地使用RISC-V。现在,基金会成员成员已经超过1000多家,包括了高通、英特尔、NXP、谷歌、英伟达、华为、腾讯、阿里巴巴等国内外知名企业。在中央网信办、工业和信息化部、中国科学院等的支持和指导下,中国开放指令生态(RISC-V)联盟于2018年11月8日浙江乌镇举行的第五届互联网大会上正式宣布成立。中国开放指令生态(RISC-V)联盟旨在以RISC-V指令集为抓手,联合学术及产业界推动开源开放指令芯片及生态的发展,积极推动建立为全世界共享的开源芯片生态。RISC-V的未来RISC-V是一种很有前景的指令集架构,拥有十分广阔的发展空间。硬件的新发展随着社会需求的不断增长和相关技术的不断进步,会不断涌现出各种新类型硬件。如何适应新的工作环境,
适配这些新的硬件,而继续保证RISC-V系统的功能完整性、性能优越性、安全稳定性,将成为随之而来的问题。
现有的一些RISC-V异构硬件解决方案将在解决这一问题中发挥重要的作用;而在硬件方面取得新突破后,RISC-V架构自身是否也会随之发生新的变化,同样值得关注。
与新技术结合RISC-V自身也可以与新技术结合,在功能、性能、安全等领域实现新的突破.例如,随着神经科学和脑科学的不断发展,通过脑机接口技术,可以实现生命体对机器的直接操控或影响;RISC-V便可以与此技术结合,在生命医疗、自动化控制等领域发挥更大的作用。02RISC-V架构特点2.1RISC-V架构特点2.2RISC-V硬件平台2.3RISC-V安全策略RISC-V架构特点——开放性与许可伯克利大学研究团队认为,指令集ISA作为软硬件接口的一种说明和描述规范,不应该像ARM、PowerPC、X86等指令集那样需要付费授权才能使用,而应该开放(Open)和免费(Free)。他们选择的BSD开源协议给予使用者很大自由,允许使用者修改和重新发布开源代码,也允许基于开源代码开发商业软件发布和销售。这样RISC-V架构既不会受到单一商业体的控制,也不会有商业上的限制。RISC-V架构特点——简洁的设计RISC-V架构在吸收各体系结构的优点基础上,重新开始设计,摆脱了旧有技术的束缚。新设计技术和方法的引入大大简化了RISC-V指令集的设计,使得RISC-V架构的指令数目非常的简洁,将指令集压缩到了最低限度,基本的RISC-V指令数目仅有40多条,通过可选的模块化指令来扩展其功能,以应用于不同的领域。简洁的设计也使得开发者的学习门槛大大降低,可以较快地掌握所需的技术,加快项目开发进程。RISC-VISA的定义尽可能避免了实现细节,它应该被理解为是各种实现方案的软件可见接口,而不是对某个特定硬件的设计。然而,本着简化ISA的原则,多个设计决策依然会受到一些硬件实现的影响,例如RISC-V将乘法扩展与基本整数ISA分开。RISC-V架构特点——模块化的指令集RISC-V的指令集使用模块化的方式进行组织,提供大量自定义编码空间以支持对指令集的扩展,从而允许开发者根据资源、能耗、权限、实时性等不同需求,基于部分特定的模块和扩展指令集进行模块的组合,实现了强大的系统可定制化能力。RISC-V指令集每个模块使用一个英文字母表示,其中字母I表示整数指令集,是唯一强制要求实现的指令集,能够实现完整的软件编译器。其他的指令子集部分均为可选的模块,其代表性的模块包括M/A//F/D/C等。RISC-V架构特点——日趋完善的生态系统良好的生态系统对发展芯片技术,以及形成良性可持续的芯片产业循环是至关重要的。与其他开源指令集相比,RISC-V在社区支持方面更完善,支持包括Linux、SeL4、BSD等通用操作系统,支持FreeRTOS和RT-thread等实时操作系统,支持GCC(GNUCompilerCollection,GNU编译器套件)、LLVM(LowLevelVirtualMachine,底层虚拟机)等通用编译和调试工具链,支持C/C++、Java、Python、OpenCL和Go等主流编程语言。RISC-V硬件平台RISC-V依托的硬件平台可以含有组件各种物理内存结构03固定功能加速器(一种不可编程的固定功能单元,或者专用于特定任务的核心)0201带有其他非兼容RISC-V核心(如IPCore)的一个或多个兼容RISC-V的处理核心I/O设备04组件通信与交互结构05从系统的角度看,这些硬件平台组件可以有多种组织形式,从单核心的微控制器到包含数千个节点的集群:(每个节点都是一个共享内存的多核心服务器);甚至可以在小型片上系统(system-on-a-chip,简称SoC)中组织成多层多处理器结构,来协助模块化开发或者提供子系统间的安全隔离。
一些典型的通用RISC-V处理器8种典型的嵌入式RISC-V处理器RISC-V系统安全策略03RISC-V指令集3.1RISC-V的系统地位3.2大端模式编码vs小端模式编码3.3RISC-V指令集概述3.4RV32I基础指令集指令集是一组指令的集合,而指令是处理器进行操作的最小单元。ISA(InstructionSetArchitecture,指令集架构)是与实现无关的指令行为规范。它定义了IS(InstructionSet,thelistofinstructions;指令集,一系列指令)及其操作的寄存器和数据类型。它还定义了其他基本功能,如内存访问和I/O。RISC-V就是一种ISA。有了指令集架构,便可以使用不同的处理器硬件实现方案来设计不同性能的处理器。RISC-V指令集架构ISARISC-V的系统地位RISC-V作为一种指令集架构,一方面,它规定了硬件设备在设计电路、组装元件时应当实现的功能目标;根据指令集的内容,决定运算单元、存储单元等元件的种类、数目、位宽及接线方式。应用程序(高级语言代码)顶层应用上层体系指令集架构底层硬件编译汇编链接编译器汇编器链接器预处理后代码汇编代码引用库代码目标代码(含机器指令)可执行代码(机器指令)RISC-V规范硬件电路操作预处理RISC-V在系统中的定位另一方面,它是对硬件能力的一种抽象,提供了机器所能完成的操作种类、地址空间大小、数据格式、访问权限信息;上层软件应用可以将指令集视为硬件运行环境,而无需特别关注具体的硬件实体。大端模式编码
vs小端模式编码大端模式编码(BigEndianEncoding,也称大端序或大端字节序)从最高有效位到最低有效位进行传输。小端模式编码(LittleEndianEncoding,也称小端序或小端字节序)从最低有效位到最高有效位进行传输。RISC-V体系架构使用小端编码。大端编码小端编码对指令进行编号从左到右对指令位进行编号从右到左对指令位进行编号读取指令编码字段从左到右读取指令编码字段从右到左读取指令编码字段字节存储方式被存放字数据的高字节存储在存储系统的低地址中,而被存放的字数据的低字节则存放在存储系统的高地址中。存储系统的低地址中存放的是被放字数据中的低字节内容,存储系统的高地址存放的是被存字数据中的高字节内容。大端编码vs小端编码例如,一个32位的字数据:0x12345678一种简单的大小端排判断方法RISC-V体系架构使用小端编码。大端模式是被存放字数据的高字节存储在存储系统的低地址中,而被存放的字数据的低字节则存放在存储系统的高地址中。小端模式中,存储系统的低地址中存放的是被放字数据中的低字节内容,存储系统的高地址存放的是被存字数据中的高字节内容。大端:小端:思考题:大小端0xb32045000xddddddd00xb32045000xddddddd0f6f673734b4bcdcddada0000实例:变量A:wordA=0xf6734bcd,在内存中的起始地址为0xb3204500变量B:halfwordB=218,在内存中的起始地址为0xddddddd0问题:halfwordB=218与wordC=218在内存中的存放方式有何不同?请分大端和小端两种情况说明。RISC-V指令集架构概述RISC-V指令集架构最初的目标包括一个完全开源的ISA,可供学术界和工业界免费使用一个不仅用于仿真或二进制翻译,还能真正直接用于原生硬件实现的ISA。一个不过度倾向某种特定微架构风格(例如,微码、顺序、解耦、乱序)或实现技术(例如full-custom、ASIC、FPGA)的ISA,不过如果需要实现其中的任意一种,它都应该是效率最高的。从ISA中分割出一个小的基础整数ISA,用于定制加速器或教育目的,以及可选的标准扩展,用于支持通用软件开发。同时支持32bit和64bit地址空间的变体,便于应用、操作系统内核或硬件的实现。一个支持高度并行多核或众核实现的ISA,包括异构多处理器。可选的可变长度指令,用于扩展指令编码空间,以及支持可选的密集指令编码,以提高性能、静态代码大小和能效。一个完全虚拟化的ISA,可简化虚拟机监控程序的开发。一个让新型特权架构的设计实践变得更简单的ISA。RISC-V指令集架构概述RISC-V指令集是模块化的,它由两种类型的ISA组合而成:这种模块化设计允许为嵌入式系统、个人计算机和机架式高性能计算机等创建RISC-V处理器。RISC-V的每个模块化规范都经过一个设计过程,其中设计的成熟度由其状态指示,可以是“开放的”、“冻结的”或“批准的”。虽然指令集规范存在32位和64位两种地址空间形式,但RISC-V设计本身允许使用任何位宽的地址空间。基本指令集实现了少量的基本计算指令(如整数计算)基本ISA01ISA扩展则实现了一些仅在某些应用中需要的指令(如乘法、浮点或原子操作)一组扩展ISA02RISC-V指令集RISC-V指令集采用模块化的方式进行组织,由基本指令集+扩展指令集组成。RISC-V指令集提供了大量自定义编码空间以支持对指令集的扩展,从而允许开发者根据资源、能耗、权限、实时性等不同需求,基于部分特定的模块和扩展指令集进行模块的组合,实现了强大的系统可定制化能力。其中RV32I是RISC-V指令架构中的基本指令集,RISC-V指令集架构仅仅需要RV32I,就能运行一个完整的软件栈,其他特殊功能的指令集在这个基本指令集上叠加。RISC-V指令集RV32I是RISC-V架构中的基础整数指令集,其中的“RV”表示RISC-V,“32”表示寄存器的位宽为32位,“I”代表整数。32位的RISC-V架构,指令和数据寻址空间就是2的32次方,4GB空间。RISC-V指令集采用固定长度指令,除了“C”指令集(压缩指令)中的指令长度为16位以外,其他指令集中的指令长度都是32位。RV64I和RV128I指令集中的指令长度也是32位,只是扩展了64位、128位的数据访问指令。RISC-V指令集架构仅支持小端模式,以简化硬件的实现。RV32I基础指令集RISC-V架构中,程序指针寄存器PC是独立的,在指令执行过程中PC值自动变化。这一点和ARM32(V8版本之前)十分不同1个32位的程序计数器寄存器PC其中x0寄存器较为特殊,被设置为硬连线的常数0。这一点设计十分独特32个32位的通用寄存器(GeneralPurposeRegisters)x0到x31RISC-V指令集架构还定义了一组CSR寄存器),使用特定的CSR指令访问,用来配置或记录处理器内核运行状态。CSR寄存器是处理器核内部的寄存器,在CSR指令中使用12位独立的地址编码空间,其中的高4位地址空间用于编码CSR的读写权限及不同特权级别下的访问权限。控制和状态寄存器(ControlandStatusRegister,CSR)RV32I基础指令集指令的前7位为主要操作码,用于标识指令。源寄存器(rs1始终位于第15至19位,rs2位于第20至24位)和目标寄存器(rd位于第7至11位)字段。函数字段或次要操作码,命名为funct7或者funct3,具体取决于它们的位宽。Funct7占用R类型指令的最后7位,funct3总是占用位第12至14位。立即数字段,它总是出现在靠近指令末尾(左侧)的位置,并且根据指令类型进行不同的编码。特权级的含义简单来说就是指一条指令可以执行的所有操作中,只有一部分是任何用户都可以执行的。而其中最微妙的那些操作,如果使用不当可能会危及机器。这些操作只能由一些“特权”用户执行,例如操作系统。40条独特的32位非特权指令,这些指令有六种不同的格式(R、I、S、B、U、J),但有一些重复字段:24条额外的独特32位特权指令,采用两种格式(R和I)040504RISC-V指令编码格式4.1RISC-V指令编码格式4.2案例4.3RV32I和RV64I区别RV32I六种指令编码格式R“Register”类型——这种格式用于算术类型的寄存器-寄存器操作,例如ADD、SUB、布尔操作和移位。I“Immediate”类型——这种格式用于带有立即数、跳转和链接寄存器的算术/逻辑/移位指令,以及环境调用和LOAD指令。S“Store”类型-这种格式用于STORE(存储)类指令。B“Branch”类型-这种格式用于BRANCH(分支)类指令。U"UpperImmediate"类型-这种格式用于那些使用高位立即数的指令(如LUI和AUIPC)。J“Jump”型-这种格式用于JAL(jumpandlink)指令。RV32I六种指令编码格式RV32I指令编码格式01opcode(操作码)字段:表示指令类型。02funct3和funct7(功能码)字段:与opcode字段一起定义指令的功能。03rd字段:表示目标寄存器的编号。04rs1字段:表示第一个源操作寄存器的编号。05rs2字段:表示第二个源操作寄存器的编号。06imm字段:表示立即数。RV32I指令编码格式示例:加法指令:addx9,x20,x8这是R类型指令,由两个源寄存器rs2和rs1,一个目的寄存器rd,操作码opcode,funct3字段和funct7字段组成。其指令编码如下表所示:RV32I指令编码格式示例:加法指令:addix9,x8,1这是I类型指令,由12位的立即数和一个源寄存器,一个目的寄存器rd,操作码opcode和funct3字段组成。其指令编码如下表所示:RV32I指令编码格式示例:存储指令:swx1,1000(x2)这是S类型指令,其指令编码如下表所示:RV32I和
RV64I区别RV64I与RV32I共享几乎相同的32位指令,添加了在32位指令对应的字、双字和长整型版本的指令,操作的寄存器扩展为了64位例如:addw、addiw、subw、sllw,slliw,srlw,srliw,sraw,sraiw等。RV64I是RISC-VISA的64位变体,是64位整数基础指令集。在RV64I中,寄存器宽度为64位,地址空间也是64位,支持64位整数运算和操作。RV64I在RV32I的基础上添加了少量的新指令以支持64位操作例如:ld和sd指令(加载和存储64位双字数据),lwu加载无符号字数据等。RISC-V指令的操作码RV32I指令格式中opcode字段为7位(Bit[6:0]),其中最低两位的编码为11表示指令长度为32位。05RISC-V中的寄存器5.1通用寄存器5.2X0寄存器5.3PC与CSRRISC-V中的寄存器在RISC-V指令集架构中,寄存器组主要包括通用寄存器(GeneralPurposeRegisters)、控制状态寄存器(ControlandStatusRegister,CSR)和一个独立的程序指针寄存器PC(ProgramCounter,程序计数器)。如果是32位的RISC-V架构(RV32I),每个通用寄存器的宽度为32位;如果是64位的RISC-V架构(RV64I),每个通用寄存器的宽度为64位。在资源受限的使用环境下,RISC-V定义了可选的嵌入式架构(使用扩展指令集“E”),则只有x0~x15这16个通用整数寄存器。且由于嵌入式架构只支持32位的RISC-V架构(即RV32E),所以每个通用寄存器的宽度为32位。在前面介绍的指令编码格式中可见,RV32I和RV64I指令都使用5位编码来引用寄存器,并且任何给定的指令最多引用三个寄存器:两个源寄存器rs1和rs2,以及一个目的地寄存器rd)。源寄存器rs1始终位于指令的第15至19位,源寄存器rs2位于第20至24位,目标寄存器rd位于第7至11位。如果支持“F”、Q”和“D”三个浮点运算指令集,则需要另外增加32个通用浮点寄存器f0~f31,通用浮点寄存器的宽度分别是32位、64位和128位。对照学习:ARM32通用寄存器组(v7版本)RISC-V中的通用寄存器基本的通用寄存器(GeneralPurposeRegisters)包含32个通用整数寄存器,分别是x0~x31。其中x0寄存器较为特殊,被设置为硬连线的常数0。RISC-V中的寄存器为了使汇编程序易于阅读,在汇编程序中每个寄存器都有一个采用应用程序二进制接口协议(ApplicationBinaryInterface,ABI)定义的别名。下面是一个完整的整数寄存器注释表:RISC-V中的寄存器RISC-VISA能如此简洁的一个重要原因是,它为常量0专门分配一个寄存器。由于ARM-32和x86-32没有零寄存器,它们需要通过原生指令实现这些操作。但对于RISC-V,只需简单地将零寄存器作为其中一个操作数,即可通过RV32I指令实现相同操作。X0寄存器的使用大多数RISC-V伪指令依赖于x0,故将32个寄存器的其中一个硬连线为0能利用伪指令提供许多常用操作,如跳转、返回和等于零时分支,这极大简化了RISC-V指令集。CSR寄存器RISC-V指令集架构还定义了一组控制和状态寄存器(ControlandStatusRegister,CSR),使用特定的CSR指令访问,用来配置或记录处理器内核运行状态。CSR寄存器是处理器核内部的寄存器,在CSR指令中使用12位独立的地址编码空间,其中的高4位地址空间用于编码CSR的读写权限及不同特权级别下的访问权限。程序指针寄存器PC
这里给出一个具体的例子。装入高位立即数(lui)将20位立即数装入寄存器的高20位,可与后续一条RV32I立即数指令共同构造出32位常数。PC加高位立即数(auipc)使得仅需2条指令即可实现任意偏移的PC相对控制流转移和数据访问。具体地,将auipc与jalr中12位立即数组合,可将控制流转移到任意32位PC相对地址;而auipc加上访存指令的12位立即数偏移量,可访问任意32位PC相对地址的数据。PC(ProgramCounter,程序计数器)是ARM-32的16个寄存器之一,这意味着任何修改寄存器的指令都可能导致分支跳转。其他ISA的程序执行时,分支指令通常仅占10%∼20%;但在ARM-32中,每条指令都可能是分支指令。这使硬件分支预测变得更复杂,而分支预测的准确率对流水线的性能至关重要。此外,采用此方案也意味着少了一个可用的通用寄存器。06RISC-V的寻址方式对照学习:ARM寻址方式寻址方式是指处理器根据指令中给出的地址信息,找出操作数所存放的物理地址,实现对操作数的访问。根据指令中给出的操作数的不同形式,ARM指令系统支持的寻址方式有:立即寻址寄存器移位寻址堆栈寻址块复制寻址变址寻址寄存器寻址寄存器间接寻址多寄存器寻址相对寻址RISC-V寻址方式寻址方式是指处理器根据指令中给出的地址信息,找出操作数所存放的地址,实现对操作数的访问。(1)立即数寻址立即数寻址是指常数作为操作数,直接包含在指令的32位编码中。在RISC-V的汇编指令中,在指令操作符的后面加上字母“i”表示立即数操作指令。需要注意的是,RV32I的不同类型指令中立即数的长度是不同的。根据指令中给出的操作数的不同形式,RISC-V指令集支持的寻址方式有:立即数寻址、寄存器寻址、寄存器间接寻址、PC相对寻址等。例如:addix9,x8,1,一个源操作数是寄存器x8,一个源操作数是立即数1,两者相加后的结果存入目的寄存器x8中。addi是I类型的指令,其中的立即数1的在指令格式中的长度为12位,也就是imm[11:0]。RISC-V寻址方式(2)寄存器寻址寄存器寻址指令的源操作数和目的操作数都是寄存器,从寄存器读取数据,结果也存入寄存器中。(3)寄存器间接寻址寄存器间接寻址指令是以寄存器中保存的数值作为数据在内存中的存储地址,根据存储地址找到对应的存储空间并读取数据,或者将数据写入对应的存储空间中。如果指令中带有偏移量offset,则存储地址是寄存器的值与偏移量之和。例如
swx1,1000(x2),以寄存器x2的值为基地址加上偏移量1000得到数据的存储地址,将寄存器x1中的32位数值存储到该地址对应的存储空间中。例如
addx9,x20,x8,一个源操作数是寄存器x20,另一个源操作数是寄存器x8,两者相加后的结果存入目的寄存器x9中。RISC-V寻址方式程序指针寄存器PC用来指示下一条指令的地址,也就是会决定程序执行的流程。PC相对寻址方式就是以当前PC值为基地址,以操作数为偏移量,两者相加后得到新的存储空间地址,处理器将该地址作为下一条指令的存储地址,实现程序流程的跳转。RISC-V指令提供了一条PC相对寻址指令auipc:auipcrd,imm该指令先将立即数imm符号扩展为20位,再左移12位后成为一个新的32位立即数,再将当前PC的值和32位的新立即数相加,结果存入寄存器rd中。由于生成的32位新立即数是有符号数,因此该指令的寻址范围是以当前PC值为基地址前后2GB地址空间,即PC±2GB。(4)PC相对寻址07基础指令7.1RV32I指令7.2伪指令RISC-V指令集RISC-V指令集采用模块化的方式进行组织,由基本指令集+扩展指令集组成。RISC-V指令集提供了大量自定义编码空间以支持对指令集的扩展,从而允许开发者根据资源、能耗、权限、实时性等不同需求,基于部分特定的模块和扩展指令集进行模块的组合,实现了强大的系统可定制化能力。其中RV32I是RISC-V指令架构中的基本指令集,RISC-V指令集架构仅仅需要RV32I,就能运行一个完整的软件栈,其他特殊功能的指令集在这个基本指令集上叠加。RISC-V指令集RISC-V指令架构采用模块化的方式进行组织,基本指令集+扩展指令集的方式进行组合。RISC-V指令集架构仅仅需要RV32I,就能运行一个完整的软件栈,其他特殊功能的指令集在这个基本指令集上叠加。RISC-V指令集采用固定长度指令,除了“C”指令集(压缩指令)中的指令长度为16位以外,其他指令集中的指令长度都是32位。RV64I和RV128I指令集中的指令长度也是32位,只是扩展了64位、128位的数据访问指令。32位的RISC-V架构,指令和数据寻址空间就是2的32次方,4GB空间。RISC-V指令集架构仅支持小端模式,以简化硬件的实现。RV32I指令示意图RV32I指令示意图。从左到右连接带下划线的字母即可组成RV32I指令。大括号{}中每一项都是该指令的不同变体,其中下划线_意味着不含大括号中任意一项亦可组成一条指令。RV32I指令算术运算指令RV32I指令集中只提供了基础的加法add、减法运算指令sub。01RV32I指令逻辑运算指令RV32I指令集中提供了与and、或or、非not和异或xor运算指令。02RV32I指令移位指令RV32I指令集中常见的移位指令有逻辑左移sll、逻辑右移srl、、算术右移sra。03RV32I指令比较置位指令04RV32I指令无条件跳转指令RV32I指令集支持的无条件跳转指令有jal和jalr两条。05RV32I指令有条件跳转指令06RV32I指令装载指令装载(load)指令是将存储器中的数据或立即数装载到寄存器中。07RV32I指令存储指令存储(store)指令将寄存器中的数据保存到存储器中。08RV32I指令csr操作指令RISC-V指令集架构还定义了一组控制和状态寄存器(ControlandStatusRegister,CSR),使用特定的csr操作指令来访问CSR寄存器。09依赖于零寄存器x0的32条RISC-V伪指令(1)在RV32I中,那些读取64位计数器的指令默认读取低32位,可通过“h”结尾的指令读取高32位。伪指令:为了增强汇编语言程序的可读性和编程的方便性,在汇编语言中常会定义一些特殊的符号,表示一些处理器的特殊应用或功能组合。伪指令也是汇编语言中的合法指令,它没有机器编码,但会被转换为一个或多个最终执行其功能的RISC-V机器指令。在下面列表中,展示一些伪指令及其通常的实现。《RISC-V-Reader》文档附录A的指令列表中也包含了伪指令。依赖于零寄存器x0的32条RISC-V伪指令(2)与零寄存器x0无关的28条RISC-V伪指令(1)与零寄存器x0无关的28条RISC-V伪指令(2)08扩展指令8.1模块化8.2RV32FandRV32D8.3RV32ARISC-V的模块化RISC-V针对32位处理器的最小指令集是RV32I,也是RISC-V指令集中固定不变的部分。RISC-V针对64位处理器的最小指令集是RV64I。在RV32I和RV64I的基础上,RISC-V的指令集使用模块化的方式进行组织,提供大量自定义编码空间以支持对指令集的扩展,从而允许开发者根据资源、能耗、权限、实时性等不同需求,基于部分特定的模块和扩展指令集进行模块的组合,实现了强大的系统可定制化能力。RISC-VISA的C扩展模块RV32C
扩展指令:RISC-VISA的D扩展模块RV32D扩展指令及其格式可见下表:RV32FandRV32DRV32F和RV32D指令示意图RV32ARV32A指令示意图09RISC-V的特权模式9.1RISC-V体系结构下的软件栈结构9.2RISC-V的特权模式上图给出了RISC-V体系结构支持的可能的软件栈。最左边的图给出了一个简单的系统,它只支持单个应用程序运行在一个应用执行环境(ApplicationExecutionEnvironment,AEE)上。这个应用程序被编码为与一个特定的应用程序二进制接口(ApplicationBinaryInterface,ABI)运行。这个ABI包含所支持的用户级ISA,加上一堆与AEE交互的ABI调用。ABI对应用程序隐藏了AEE的细节,使得实现AEE具有更大的灵活性。同样的ABI可被直接实现在多个不同的主机操作系统上,或者被一个用户模式下的仿真环境支持,这个仿真环境运行在一个不同的ISA机器上。RISC-V软件栈的可视化表示应用应用应用应用应用应用应用RISC-V软件栈的可视化表示中间的配置显示了一个传统的操作系统(OS),可支持多个应用程序的多道运行。每个应用程序通过ABI与OS通信,OS提供了AEE。正如同应用程序通过ABI与AEE通信一样,RISC-V操作系统通过一个管理员二进制接口(SupervisorBinaryInterface,SBI)与管理员执行环境(SupervisorExecutionEnvironment,SEE)通信。一个SBI包含了用户级和管理员级ISA,以及一堆BI函数调用。在所有SEE实现中,使用单一的SBI,允许单一的OS二进制镜像运行于任何SEE之上。在低端的硬件平台上,SEE可以只是一个简单的bootloader和BIOS类型的IO系统,在高端服务器上,SEE可以是一个提供hypervisor的虚拟机,或者在一个体系结构仿真环境中,SEE可以是一个运行在主机操作系统上的“很薄的”转换层。应用应用RISC-V软件栈的可视化表示最右侧的配置显示了一个虚拟机监视器配置,此处由一个单一的hypervisor支持多个多道操作系统。每个OS通过一个SBI与hypervisor通信,hypervisor提供了SEE。Hypervisor使用一个hypervisor二进制接口(HypervisorBinaryInterface,HBI)与hypervisor执行环境(HypervisorExecutionEnvironment,HEE)通信,这将把hypervisor与具体的硬件平台细节相隔离。应用应用应用应用对于任何比裸机嵌入式平台更复杂的东西,软件栈都是高度分层的。像普通个人计算机这样的复杂系统总是有多个程序在其上同时运行,以“垂直”方式(操作系统栈)或“并行”方式(在同一操作系统上运行多个应用程序):为了确保整个系统的正确功能,给定的程序不应对系统的其他部分,特别是系统的低级组件造成损害,这一点对计算机系统来说非常重要,因此特权模式系统可以帮助处理这些问题。在理想情况下,运行在hart(硬件线程)中的任何一行代码都应与一个特权模式相关联,该模式编码在CSR寄存器中,定义了其可以访问的资源。特权模式较高特权模式下运行的指令可以访问比在较低特权模式下运行的指令更底层的系统功能甚至硬件。任何时候,一个RISC-V硬件线程(hart)是运行在某个特权级上的,这个特权级被编码到一个或者多个CSR中的一种模式。RISC-VISA定义的模式及特权等级有:CSR不同的读写访问权限CSR寄存器中存储的信息字段所表示的CSR不同的读写访问权限:WPRI(ReservedWritesPreserveValues,ReadIgnoreValues)在CSR中,某些读/写字段是为未来发展而保留的,所以系统中的软件应当忽略从这些字段中读取的值(即ReadIgnoreValues),并且在向CSR其他字段写入数据的时候,还需要保护这些预留字段,维持字段中的值不变(即ReservedWritesPreserveValues)。为了将来的扩展需要,如果某一个RISC-V系统中实现了包含WPRI字段的CSR读写功能,则必须保持WPRI字段只读且为0,所以在RISC-V规范有关CSR的描述中,这些字段被标识为WPRI。特权模式M(机器)模式:M模式全称为Machinemode(机器模式),运行在这个模式下的程序为最高权限,它属于RISC-V里的最高权限模式,它具有访问所有资源的权限,它的代码是百分百可信的,通常运行在这个模式下的为固件和操作系统内核。S(监管者)模式:全称Supervisormode,监管者模式通常是用来运行操作系统内核,它的权限要比M模式低,它无法直接操作特殊寄存器和某些资源,但内核通常会运行在S和M两个模式之间,在最初系统启动阶段内核是运行在M模式下的,在这个模式下内核需要初始化所有的硬件资源和进行内存管理等等,当初始化完成之后会切换到S模式下,通常内核里有一段代码是运行在M模式下和S模式下,M模式下的代码为S模式下的代码提供访问硬件资源的能力。而S模式下的内核主要是为应用程序提供系统调用以及上下文切换。U(用户)模式:全称Usermode,用户模式为级别最低的模式,它不能访问硬件资源,只能访问某些通用寄存器和通用指令,一般用于执行应用程序。这些是类UNIX系统的三种标准模式。简单的嵌入式机器只有M模式,而复杂的嵌入式系统也有U模式,没有S模式。特权模式H(超级管理员)模式:全称Hypervisormode,可用于管理跨机器的资源,或者将机器整体作为组件承担更高级别的任务。例如,H模式可以协助实现一台机器系统的虚拟化操作。但是目前RISC-V对虚拟化还不太完善,基本不支持,因此是作为保留。RISC-V特权ISA定义了进一步的可选模式,即D(调试)模式。此模式具有比M模式更高的特权级,具有额外的硬件访问权限(CSR、物理地址空间的一部分等),并且存在用于外部调试器。特权模式通过不同特权模式的组合,可设计面向不同应用场景的处理器:所有硬件实现必须提供M-mode,因为这是唯一的模式,可以不受限制地访问整个机器。最简单的RISC-V实现可以仅提供M-mode,虽然这样做不能为防止不正确的、恶意应用代码提供保护。许多RISC-V实现还支持至少一个用户模式(U-mode),以对系统的其他部分进行保护,防止被应用程序代码破坏。管理员模式(S-mode)可被加入,以在管理员级操作系统和SEE、HAL之间提供隔离。Hypervisor模式(H-mode)将在一个虚拟机监视器和HEE、运行在机器模式的HAL之间提供隔离。10RISC-V的异常与中断10.1异常与中断概念10.2中断的响应过程和返回过程11.3机器模式异常相关的CSR寄存器11.4S(监管者)模式下的CSR异常、中断、自陷用以指代硬件线程(hart)正常运行时,内部指令出现的异常情形。异常用以指代硬件线程(hart)因出现了一个外部的异步事件而导致的意外的(此处的意外是指,对于一个正常运行的硬件线程hart来说,执行内部指令是正常行为,而外部事件则是意外行为)控制权转移。中断用以指代由异常或中断导致的,将系统控制权转移给自陷处理程序的行为。自陷异常和中断是现代处理器中不可缺少的功能。当发生异常或中断时,处理器暂停当前正在执行的程序,从暂停处跳转到异常处理程序或中断服务程序入口,执行处理程序。异常或中断处理结束后,返回主程序暂停处继续执行往下执行。异常(Exception)、中断(Interrupt)和自陷(Trap):异常、中断、自陷异常分为同步异常和异步异常两种:(1)同步异常:是指处理器执行某条指令而导致的异常,在处理完相应的异常处理程序后,处理器才能继续执行。在同样的环境下程序不管执行多少遍,同步异常通常都能够复现出来。常见的同步异常:从非法地址读取指令或数据,指令非法,指令地址未对齐,软件异常,调试导致的异常等。(2)异步异常是指触发原因和当前执行指令无关的异常。在同样的环境下程序执行多少,导致异常的原因都不同,而且发生异常时的当前指令可能也会不一样。最常见的异步异常就是外部中断。异常不同于中断,因为后者是软件或硬件产生的异步事件,它们从执行本身的外部停止执行。异常和中断都用陷阱处理。RISC-V体系架构中也提供了异常和中断的处理机制。异常、中断、自陷RISC-V架构为了使处理器能够在等级较低的权限模式下处理异常和中断,提供了委托机制。在机器模式下设置CSR寄存器中的中断委托(MachineInterruptDelegation,MIDeleg)和异常委托(MachineExceptionDelegation,MEDeleg)寄存器,将一些中断和异常委托给低权限模式处理。在被委托的低权限模式中,也可以通过软件屏蔽被委托的中断。在用户模式下(U-mode),如果设置了委托模式,则可以在用户模式(U-mode)或监管者模式(S-mode)下处理异常或中断。如果是设置在管理员模式(S-mode)下处理,在处理完成后,处理器通过SRET(监管者模式异常返回)指令从管理员模式返回到用户模式(U-mode)。在用户模式(U-mode)下,如果没有设置异常委托或中断委托,发生异常或中断后,处理器转入机器模式,响应并处理异常事件或中断请求。处理完成后,处理器通过MRET(MachineReturn机器模式异常返回)指令从机器模式返回到用户模式。机器模式(M-mode)是RISC-V架构处理器必须具备的权限模式,所以在默认情况下RISC-V架构处理器会在机器模式中处理异常事件和中断事件请求,执行异常处理或中断服务程序。异常和中断响应过程(2)根据异常或中断类型设置mcasue寄存器。(4)保存异常发生前的中断状态,即把mstatus寄存器的MIE字段保存到MPIE字段。(6)设置mstatus寄存器的MIE字段为0,关闭中断使能。(8)根据mtvec寄存器的值设置PC,跳转到异常向量表对应位置。(1)保存PC值到mepc寄存器中,即保存返回地址。(3)将发生异常时的错误指令编码或存储器访问的地址值保存到mtval寄存器。(5)保存异常发生前的处理器工作模式到mstatus寄存器的MPP字段。(7)设置处理器为机器模式。0102030405060708当异常或中断发生时,默认情况下都在机器模式下处理,处理器自动完成以下操作:异常和中断响应过程根据异常向量表获取到异常处理程序或中断服务程序的入口地址后,执行异常处理程序或中断服务程序,完成后处理器会恢复异常或中断发生前的工作模式,返回被暂停的程序继续执行。
返回的具体过程如下:01把mstatus寄存器MPIE字段的值设置到MIE字段,恢复异常发生前的中断使能状态。02根据保存在mstatus寄存器的MPP字段的处理器工作模式,把处理器恢复为异常发生前的工作模式。03把mepc寄存器中的值设置到PC寄存器中,返回被暂停的程序处。RV32权限模式和异常机器模式是RISC-V架构处理器必须具备的权限模式,所以在默认情况下RISC-V架构处理器会在机器模式中处理异常事件和中断事件请求,执行异常处理或中断服务程序。在用户模式下,如果设置了委托模式,则可以在用户模式或管理员模式下处理异常或中断。如果是设置在管理员模式下处理,在处理完成后,处理器通过SRET(管理员模式异常返回)指令从管理员模式返回到用户模式。在用户模式下,如果没有设置异常委托或中断委托,发生异常或中断后,处理器转入机器模式,响应并处理异常事件或中断请求。处理完成后,处理器通过MRET(MachineReturn机器模式异常返回)指令从机器模式返回到用户模式。RISC-V架构为了使处理器能够在等级较低的权限模式下处理异常和中断,提供了委托机制。在机器模式下设置CSR寄存器中的中断委托(MachineInterruptDelegation,MIDmideleg)和异常委托(MachineExceptionDelegation,MEDmedeleg)寄存器,将一些中断和异常委托给低权限模式处理。在被委托的低权限模式中,也可以通过软件屏蔽被委托的中断。机器模式异常相关的CSR寄存器与机器模式有关的异常寄存器主要有mstatus、mie、mip、mtvec、mcause、medeleg、mideleg、mepc、mtval。1mstatus寄存器:记录处理器内核当前的运行状态,如表2-18所示。机器模式异常相关的CSR寄存器(2)mie寄存器:用来开关各种中断使能,如表2-19所示2机器模式异常相关的CSR寄存器(3)mip寄存器:记录各种中断请求状态,如表2-20所示3机器模式异常相关的CSR寄存器(4)mtvec寄存器:记录异常向量表基地址,设置向量支持模式,如表2-21所示。4机器模式异常相关的CSR寄存器mcause寄存器:保存发生异常的原因,用异常编码表示。Bit[30:0]是ExceptionCode字段(异常编码);Bit[31]是Interrupt字段,1表示是中断,0表示是同步异常。5机器模式异常相关的CSR寄存器mideleg寄存器和medeleg寄存器:中断委托寄存器和异常委托寄存器。在机器模式下,可将各种中断或异常委托给管理员模式或用户模式处理。在管理员模式下,可将各种中断或异常委托给用户模式处理。mepc寄存器:用于保存进入异常前的PC的值,即当前程序的停止地址,以作为异常返回地址。mtval寄存器:用于保存进入异常前的错误指令的编码值或存储器访问的地址值。678RV32I指令csr操作指令RISC-V指令集架构还定义了一组控制和状态寄存器(ControlandStatusRegister,CSR),使用特定的csr操作指令来访问CSR寄存器。9虚拟内存是对物理内存的一种抽象。它通过将虚拟地址映射到硬件组件的各种物理地址空间,使内存空间在应用程序看来是简单且统一的。
S模式下的代码执行,通常是指由操作系统执行,操作系统可以访问除M模式之外的所有CSR。监管者软件层背后的设计理念是提供一个干净的虚拟内存(virtualmemory)。应用程序只能看到虚拟内存地址被划分成所谓的4KB大小的页(常规长度的连续内存部分):在监管者级别虚拟地址通过查询称为页表的内存管理数据结构被转换为物理内存地址,页表包含了对应的4KB大小的物理内存段的映射。S(监管者)模式下的CSRS(监管者)模式下的CSRsstatus,sip,sie,scause的工作方式与机器模式ISA中的mstatus、mip、mie非常相似。sepc和stval的作用相同,只是它们包含虚拟内存地址而不是物理内存地址。satp:“SupervisorAddressTranslationandProtection”寄存器没有对应的机器模式CSR,因为它用于内存地址转换。当操作系统改变执行进程时,例如上下文切换,satp寄存器将被写入。该寄存器包含三个WARL字段,与执行内存地址转换算法的信息相关:MODE字段根据特权规范文档的表4.4描述了基于页的虚拟寻址类型和宽度。ASID“AddressSpaceIDentifier”(地址空间标识符)字段以宽松的术语描述了正在使用内存页面的进程,它用于降低保护内存免受错误进程影响的难度,而在地址转换过程中并不具有直接意义。PPN“PhysicalPageNumber”(物理页码)字段就是监管者级物理地址除以4KB,用于标识物理内存中对应的页。S(监管者)模式下的CSR实际的内存地址转换算法根据MODE字段所标识的虚拟内存系统而变化,虚拟内存系统的内容不在本章的范围之内,下面提供了一个一般性的总结以供参考:遍历页表,直到找到一个“叶”页表项(PTE),这意味着它是一个指向实际物理内存的指针(而不是指向页表的另一层)如果内存请求被允许(通过比较PTE的相关位与mstatusCSR中的相关位得出),则计算物理地址(具体公式在特权规范文档的第4.3.2节中)S(监管者)模式下的CSR就像在机器级ISA中一样,监管者级ISA也定义了一些特权指令:SRET“SmodeReturn”I型格式指令,在S模式下处理异常后返回到原程序。SFENCE.VMAasidvaddr“SupervisorFence”R型格式指令的工作方式与其他fence指令类似,即要求在它之前的内存操作必须在它之后的操作开始执行之前完成,不同之处在于它的目标是隐式读取和写入内存中的内存管理数据结构(例如页表,发生在特权级别执行其他指令期间)。该指令使用rs1字段对虚拟地址进行编码,并在该地址上对读取和写入排序(如果rs1==0,则对所有虚拟地址进行排序),使用rs2字段编码ASID以选择要排序的地址空间(如果rs2==0,则对所有地址空间进行排序)。请注意,此指令不会影响显式内存操作。S模式下的RISC-V中断处理无论位于何种特权模式,所有异常都默认将控制权转移到M模式的异常处理程序。但Unix系统中大多数异常都应发送给S模式下的操作系统。RISC-V通过异常委托机制,可以使在S模式下产生的异常,委托给S模式进行处理,而不必切换到M模式进行处理,其中S模式也有自己中断处理时所用到的寄存器:sepc、stvec、scause、sscratch、stval和sstatus。发生异常的指令的PC被存入sepc,且PC被设置为stvec。scause根据异常类型设置,stval被设置成出错的地址或者其它特定异常的信息字。把sstatusCSR中的SIE置零,屏蔽中断,且SIE之前的值被保存在SPIE中。发生例外时的权限模式被保存在sstatus的SPP域,然后设置当前模式为S模式11RISC-V汇编语言概述11.1汇编语言的处理过程11.2汇编语言的组成汇编语言程序处理过程上图是汇编语言源程序翻译成可执行程序的步骤。汇编语言程序处理过程使用文本编辑器,用汇编语言指令和伪指令编写源程序,在Unix/Linux系统中,汇编语言源程序文件以.s作为后缀名。链接器的工作可以分为两个部分:根据对象文件中的全局标签衔接不同的二进制文件中的指令块;将程序中的指令和数据段映射到相应的存储空间,即分配内存地址及其范围。生成的可执行程序文件被存储在计算机的存储设备上。在运行时,由加载器将该可执行文件加载到内存中,并跳转到程序的起始地址。汇编器将汇编语言翻译成处理器能够理解的二进制指令,把汇编语言源程序文件转换成后缀名为.o的二进制对象文件。链接器把各个二进制的对象文件和二进制库文件等模块“拼接”起来,生产后缀名为.out的可执行程序文件。汇编器在RISC-V调用约定中的作用1.将参数存放到函数可访问的位置;2.跳转到函数入口(使用RV32I的jal指令);3.获取函数所需局部存储资源,按需保存寄存器;4.执行函数功能;5.将返回值存放到调用者可访问的位置,恢复寄存器,释放局部存储资源;6.由于程序可从多处调用函数,故需将控制权返回到调用点(使用ret指令)。函数调用过程通常分为6个阶段:为提升性能,应尽量将变量存放在寄存器而不是内存中,但同时也要避免因保存和恢复寄存器而频繁访问内存。幸运的是,RISC-V有足够的寄存器兼顾两者:既能将操作数存放在寄存器,还能减少保存和恢复它们的次数。关键在于,一些寄存器不保证其值在函数调用前后保持一致,称为临时寄存器;另一些能保证,称为保存寄存器。不再调用其他函数的函数称为叶子函数。当一个叶子函数只有少量参数和局部变量时,可将其分配到寄存器,无需分配到内存。大部分函数调用均如此,此时程序无需将寄存器保存到内存。RISC-V整数和浮点寄存器的汇编助记符RISC-V有足够的寄存器供ABI分配给过程自由使用,在其不产生其他调用时无需保存和恢复。过程调用前后保持不变的寄存器也称被调用者保存寄存器,反之则称调用者保存寄存器。图中顶部为高地址,底部为低地址。在RISC-V软件约定中,栈指针(sp)从bffffff0hex开始向下方的静态数据区生长;代码从00010000hex开始,包含静态链接库;代码区上方是静态数据区,本例假设从10000000hex开始;静态数据区上方是动态数据区,在C语言中通过malloc()分配,称为堆(heap),它向上方的栈区生长,还包含动态链接库。链接器链接器需要根据图中地址(为例)调整所有目标文件中指令的程序地址和数据地址。图RV32I程序和数据的内存分配汇编器与链接器汇编器向简洁的RISC-VISA增加了60条伪指令,在不增加硬件开销的同时令RISC-V代码更易于读写。只需将一个RISC-V寄存器专门用作0,即可实现上述许多有用的操作。装入高位立即数(lui)和PC加高位立即数(auipc)这两条指令简化了编译器和链接器调整外部数据和函数地址的工作,PC相对分支指令让链接器更容易处理位置无关代码。大量的寄存器减少了寄存器保存和恢复的次数,这样的调用约定加速了函数调用和返回。RISC-V汇编语言语法RISC-V的汇编语法遵循其他其他处理器的典型汇编语言规则,支持如指令和标签等基本元素,以及指定存储需求的指示符和方法。通常,汇编源文件由一系列代码块组成,每个代码块指定其内存节和存储需求。根据ABI规范,举例函数入口和出口的标准RV32I代码。函数的准备阶段如下:entry_label:addisp,sp,-framesize#调整栈指针(sp寄存器)来分配栈帧
swra,framesize-4(sp)#保存返回地址(ra寄存器)#按需保存其他寄存器...#函数体若寄存器无法容纳过多参数和局部变量,准备阶段会在栈上为函数栈帧分配空间。当函数任务完成后,其结束阶段将释放栈帧并返回调用点:
#按需恢复其他寄存器
lwra,framesize-4(sp)#恢复返回地址寄存器addisp,sp,framesize#释放栈帧空间
ret#返回调用点RISC-V汇编语言组成汇编语言程序由汇编命令和指令语句组成。010203汇编命令通常在汇编语言源程序的起始部分,声明源程序中的标签和段的属性。汇编语言指令语句是汇编语言程序的基本单位,由标签label、操作符operation、操作数operands和注释comment等4部分组成:[label:]operation[operands][;comment]标签是当前指令的位置表示符号,常用作汇编语言程序中子程序或跳转的目标,它是可选项。操作符可以使RISC-V指令、伪指令或宏等。操作数是指令执行所需的参数,可以是符号、常量、或者由符号和常量组成的表达式。注释是为了解释语句或程序功能添加的信息,对程序没有影响,仅仅起到注解的作用,以“;”或“#”作为分隔,它是可选项。依赖于零寄存器x0的32条RISC-V伪指令(1)在RV32I中,那些读取64位计数器的指令默认读取低32位,可通过“h”结尾的指令读取高32位。依赖于零寄存器x0的32条RISC-V伪指令(2)与零寄存器x0无关的28条RISC-V伪指令(1)与零寄存器x0无关的28条RISC-V伪指令(2)指示符常用的RISC-V汇编器指示符。.text——进入代码节。.align2——后续代码按22字节对齐。.globlmain——声明全局符号“main”。.section.rodata——进入只读数据节。.balign4——数据节按4字节对齐。string"Hello,%s!\n"——创建以空字符结尾的字符串。.string"world"——创建以空字符结尾的字符串。12案例分析Helloworld代码对比不同ISA汇编语言的对比-准备工作:C语言实现的插入排序插入排序在不同ISA下生成的指令数和代码大小插入排序的RV32I代码从左到右依次是十六进制地址、十六进制机器语言代码、汇编语言指令和注释。RV32I通过两个寄存器指向a[j]和a[j-1]。RV32I有充足的寄存器,其中一些是ABI专门为过程调用分配的。与其他ISA不同,RV32I无需保存和恢复这些寄存器。虽然RV32I的代码大小比x86-32大,但能通过可选的RV32C扩展缩小该差距。同时,RV32I使用比较-分支指令可节省ARM-32和x86-32所需的3条比较指令插入排序的ARM-32代码从左到右依次是十六进制地址、十六进制机器语言代码、汇编语言指令和注释。由于寄存器较少,代码需要将两个寄存器和返回地址保存到栈中供后续使用。代码采用的寻址方式将i和j展开为字节地址。鉴于分支跳转有可能在ARM-32和Thumb-2间切换,在保存返回地址前,需通过bxcs将其最低位置为0。条件码节省了递减j后的一条比较指令,但其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 4.3 海-气相互作用(课中)-高中地理人教版(2019)选择性必修1课前课中课后同步试题
- 2026年焦作市山阳区政务服务中心(窗口人员)招聘笔试模拟试题及答案详解
- 2026年呼和浩特市新城区工会人员招聘笔试模拟试题及答案详解
- 2026年乌鲁木齐市水磨沟区医疗系统事业编人员招聘笔试备考试题及答案详解
- 个人述职报告转正述职报告(3篇)
- 备用煤矿职工思想调研报告第二季度(3篇)
- 电力消防自查报告(3篇)
- 2026年厦门市同安区工会人员招聘考试备考试题及答案详解
- 2026年甘肃省平凉市医疗系统事业编人员招聘笔试参考题库及答案详解
- 2026年平凉市崆峒区工会人员招聘考试参考试题及答案详解
- 2026年心理健康全科专任小学教师招聘考试笔试试题(含答案)
- 2026年新疆第三师图木舒克市高校毕业生“三支一扶”计划招募(347人)笔试参考试题及答案详解
- 2026年三支一扶考试综合基础知识考试卷及答案(六)
- 2026年秋新教材外研版九年级上册英语Unit 1-8课文+翻译
- 2026-2030中国减肥市场发展动向分析与未来营销创新策略研究报告
- 高标准农田建设项目监理服务方案投标文件(技术方案)
- 新生儿灌肠操作规范
- 2026年防疫员技师实操题库及评分细则
- 医院供氧中心工作制度
- 【低空经济】低空政务航空平台设计方案
- GB/T 46585-2025建筑用绝热制品试件线性尺寸的测量
评论
0/150
提交评论