对于RISC-V的学习,前期是系统的看书,了解处理器架构和RISC-V的特点,最近看完的这几章让我大概有一些了解,算是有了一个大概的认知吧,在此对这几章的内容做一些精炼与回顾。

还是抓住主题吧——“大道至简,RISC-V架构之魂”,这一章中出现最多的一句话为“再次印证了RV最求硬件简单的哲学”,嗯,在每一小节都出现了这句话,那我我就当是作者的强调和rv最大的特点或是优势吧,那这种哲学具体体现在哪些方面?回顾如下(可暂时我的理解还没有那么深入,但初探嘛,来日方长)

架构的篇幅

这主要是因为RV架构的后发优势,没有历史的包袱,即不需考虑向后的兼容性,而且是一个新生的架构,它可以有效的规避计算机体系结构中已经暴露的问题。所以rv的篇幅可以说是短小精悍。

模块化的指令集

RV的指令集使用模块化的方式进行组织,可使用不同的模块组合通过一套统一的架构满足各种不同的应用;其中最基本也是唯一强制要求实现的指令集部分是由字母I表示的基本整数指令集。使用这个整数指令集便可以实现完整的软件编译器。而模块有一个通用组合“IMADF”,用英文字母G表示,如RV32G则表示RV32IMADF。

压缩指令集

为了提高代码密度,满足对代码体积要求较高的场景,比如嵌入式领域,RV提供可选的压缩指令集,用C表示,普通的非压缩指令集的编码长度为32bit而压缩的指令集编码长度为16bit,而这种压缩策略也具有特别之处,是通过将一部分最普通的常用三十二位指令中的信息进行压缩和重排得到,(如假设一条指令使用了两个同样的操作数索引,则可以省去其中的一个索引的编码空间)由此每一条十六位长的指令都可以找到其一一对应的原始32位指令。

简介的存储器访问指令

与所有的risc处理器架构一样,rv架构也使用专用的存储器读(load)指令和存储器写(store)指令来访问存储器(memory),其他的普通指令无法访问存储器,但rv还具有显著不同的地方

首先rv架构推荐使用地址对齐的存储器读写操作,但也支持地址非对齐的存储器操作rv架构,处理器可以选择硬件来支持,也可以选着软件来支持——》关于对齐,所谓地址对齐,即目标地址为所访问数据单元字节数的整数倍,下图为不对齐状态:

alt

此外,RV架构仅支持小端模式(即高字节,高地址;低字节,低地址)

RV架构的存储器读写指令并不支持地址自增和自减的模式,这种模式能够提高处理器访问连续地址区间的性能,但是会增加设计处理器的难度,所以,就像文中提到最多的那句话一样,哲学,这是它的哲学。

RV采用了松散存储器模型,(relaxed memory model),对访问不同地址的存储器读写指令的执行顺序不做要求,除非使用明确的存储器屏蔽指令(Fence)加以屏蔽。

分支跳转指令

两条无条件跳转指令“jal\jalr”分别可进行子程序调用和子程序返回

六条带条件跳转指令,这种跳转指令直接使用两个整数操作数进行比较,比较条件满足则跳转,,且比较与跳转放在一条指令里面完成,,很多其他的跳转指令使用了两条独立的指令

对没有配备硬件分支预测器的低端CPU,RV架构采用默认的静态分支预测,即如果是向后跳的条件跳转指令,则预测为跳,如果是向前跳转的条件跳转指令,则预测为不跳,且RV架构也要求编译器按照这种默认的静态分支预测机制来编译生成汇编代码,这可让低端CPU获得不错的性能。

(关于分支预测期:分支预测器(英语:Branch predictor)是一种数字电路,在分支指令执行结束之前猜测哪一路分支将会被执行,以提高处理器的指令流水线的性能。使用分支预测器的目的,在于改善指令流水线的流程,就像一家公司的员工***公司所需要的东西,即交付不同单位进行准备工作,而那各个部门之间的等待交办的时间大大地缩短,整个公司的效率就会提高了。现代使用指令流水线处理器的性能能够提高,分支预测器对于现今的指令流水线微处理器获得高性能是非常关键的技术。)

子程序调用

为了加速“保护现场”和“恢复现场”(进入子程序,回到主程序)的过程,有些RISC架构会一次写或读多个寄存器到存储器中,虽然如此一条指令就可以完成许多事情,可减少汇编指令的代码量,但这让CPU的硬件设计变得复杂,还可能会损伤时序,,使CPU的主频无法提高,而RV架构放弃了这种,实在需要减少指令条数,则可以通过公用的程序库(专门用于保护和恢复现场)的方法减少代码量,并提高性能。

无分支延迟槽

所谓分支延迟槽指的是在一条指令后面紧跟的一条或者若干条指令不受分支跳转的影响,这几条指令不管跳不跳转都一定会被执行,有分支延迟槽的主要原因是当时处理器的流水线简单,没有使用高级的硬件动态分支预测器,而现代高性能处理器的分支预测算法的精度已经十分高,所以RV架构放弃了无分支延迟槽。

无零开销硬件循环

即通过硬件的直接参与,设置某些循环次数寄存器,让程序自动进行循环,每次循环,寄存器的次数自动减1,变为零时,退出循环,因为一般的for循环是通过若干条加法和分支跳转指令实现的,所以这种设计会减少指令条数提高性能。但还是,这违背了RV的设计哲学,所以RV架构中并没有使用!

无条件码执行

指令编码的头几位是条件码,条件码对应的条件为真,指令才被执行。这可以使编译器将短小的分支指令块编译成待条件码的指令,而不是分支跳转指令,但同样,硬件哲学嗷,RV架构放弃了这种指令。

无运算溢出

在运算指令产生错误时,如上溢、下溢、分规格化浮点数,除零等都会产生软件异常。而RV架构不产生异常,产生某个特殊的默认值,同时设置某些寄存器的状态位。推荐软件通过其他方法找到这些错误。(说实话,这里怎么体现了它的设计哲学?哈哈哈哈,等我再深入探究一下)

其他略提

特权模式:三种工作模式machine mode、 supervisor mode、user mode,m模式为必选模式,可通过不同的模式组合实现不同的系统

存储器地址管理机制:支持不同的管理机制,从物理地址到虚拟地址,这使得RV架构支持从简单嵌入式系统到复杂操作系统的各种系统

CSR寄存器: control and staatus register,控制和状态寄存器,用于配置或记录一些运行的状态,访问采用专用的csr指令

中断和异常:定义了一套相对简单基本的中断与异常机制,也允许用户对其进行定制与扩展

矢量指令集:在草案中使用长度可变的矢量

自定制指令扩展:支持第三方的扩展

这么写下来,发现内容还不少,虽然已经学过微机原理,但还是有少部分刚接触到的词语,想来最好是抽时间看一下计算机原理了,先再走一段路吧,前期是一个系统的了解,看后面进行开发试验后再来进行查漏补缺。这样看我写的东西还挺枯燥的,哈哈哈,可能我理解也不是那么深入,现在也不奢求注入自己独特而生动的理解,继续前行吧。