先给出一个参考资料:risc-v中文手册
到这依然没有开始实践操作,而是来了解学习RISCV的ISA。
一.什么是ISA
指令集架构(instruction set architecture):是底层硬件电路面向上层应用程序提供的一层接口规范。
定义了什么
- 基本数据类型(byte,halfword,word)
- 寄存器
- 指令
- 寻址模式
- 异常或者中断的处理方式
- 等等。。
也就是操作系统和底层硬件之间的东西。是一种规范。这里的底层硬件可能指的是微架构。比如有一个指令集架构叫做x86,那么除了intel还有amd在做x86这一套指令集。两个硬件结构不同,但是都实现的一种微架构。理解为:微架构就是对这个指令集的实现。
1.为什么要ISA
分层,开发操作系统就不需要关注底层硬件电路结构了。
和指令集架构相关的一些概念
cisc(complex instruction set computing):复杂指令集。针对特定功能设计指令,导致指令较长,但生成程序较短。
risc(reduced instruction set computing):精简指令集。只设计常用指令,复杂功能由其组合而成,导致指令较短,但是生成的程序会较长。
趋势:正在相互融合。
2.ISA的宽度
指的是cpu中通用寄存器的宽度(二进制的位数)。注意isa的宽度(cpu宽度)和指令编码长度无关。比如risc-v不管是64位还是32位,指令编码宽度都是32位。
常见ISA:x86,sparc,power,arm,mips,risc-v。除了x86都是risc架构。
二.RISC-V的历史
来自于一所大学,用于科研教学时的架构选择时,因为ip原因和比较复杂不适合教学。于是他们自己着手开发的一个指令集架构,最后得到我们的第五代:也就是risc-v。开源的原因就是因为不在一家公司的手里,为了管理,后来还成立了一个基金会。
risc-v到底是什么?
- 一款高质量,免许可证,开放的risc ISA。
- 一套由非盈利的RISC-V基金会维护的标准。
- 适用于所有类型的计算系统。从微控制器到超级计算机。
- RISC-V不是一家公司,也不是一个或一款cpu实现。(是一个标准)
risc-V发展现状
这是一款新兴的指令集架构,中国对于芯片这些也很重视,对于这些卡脖子的技术。值得一提的是,基金会也搬到中立国了。
三.risc-v的特点
- 简单
- 清晰的分层设计(特权级别)
- 模块化
- 稳定
- 社区化
可以在官方网站下载到risc-v标准文件。特权指令和非特权指令。
1.ISA命名格式
RV[###][abc...xyz]
RV:即risc-v的缩写。
###:32位,64位,处理器字宽。
abc...xyz:标识该处理器支持的指令集模块集合。
例如:RV32IMA,RV64GC。
2.增量的ISA
在增添新扩展的同时,还要支持旧拓展。如x86架构的指令集到现在还支持很老的处理器。导致了学习成本和开发成本很高。所以模块化的ISA是很有必要的。也就是抛弃完全增量。
那么基础就是基础整数指令集(字母I),这就是risc-v所要求必须实现的模块。
RV32I:32位基础整数指令集。
RV32E:前者的子集。主要用于嵌入式场景。(这里的字母E指的是embedded)
RV64I:64位基础整数指令集,兼容32位。
RV128I:64位基础整数指令集,兼容32,64位。
M:整数乘除法 multiplication
A:存储器原子指令集 atomic
F:单精度浮点指令。(32bitfloat)
D:双精度浮点指令。(64bitdouble)
C:压缩指令集(compressed)(指令长度压缩)
。。。等等
IMAFD被称为G(general)
3.通用寄存器的概念
非特权文档(unprivileged specification)定义了32个通用寄存器以及一个PC(程序计数器)。如果实现浮点单/双精度的扩展则要额外多32个浮点寄存器。对于RV32E,embedded,则是将寄存器缩少到16个。寄存器的宽度由ISA指定,RV32I为32位,RV64I为64位。
每个寄存器都有特定用途与别名。由risc-v application binary interface(ABI)定义。PC在risc-v指令集架构不暴露出来。
4.HART=HARdware Thread
硬件线程的概念。cpu如果只有一个cu,那就只有一个指令执行流,但是如果有两个,就可以跑两个指令执行流。(类似intel说的超线程)这也是现代cpu的可能的一个发展方向和趋势。为了不引起混淆,我们把这个指令执行流抽象为HART(硬件线程)。
抽象的,一种资源化的,可以自主取指,运行指令的一个虚拟的处理器。
5.特权级别
用户态U和内核态S的概念,还有一个机器态M。
实模式和保护模式的概念。实模式的时候,虚拟地址是不起效的,全都是物理地址。在修改了一个cpu之后,MMU(内存管理单元)就被打开,进入保护模式。
刚刚上电相当于机器态,不开虚拟地址,类似实模式。然后进入supervisor(内核态)态,实际上就是保护模式,user态就是类似linux用户模式。其实起到的是分层保护的作用。debug级别就是专门调试cpu,普通编程用不上。
提供不同的模式,支持虚拟地址与否,是一个cpu架构的特点。
对于不同的级别下有不同的一套寄存器(csr),不同的模式下是不能互相访问的。高级别可以访问低级别的寄存器。(csr:Control and status registers)
CSR指令就是操作CSR的指令。(Zicsr扩展)这里我也不算特别了解,所以只是解释一下概念,具体作用暂时没有涉及。
risc-v也定义了用来操作特权级别的指令。(ECALL,Ebreak)
系统调用就是应用在用户态怎么调用到内核态的东西。
6.内存管理与保护
物理内存保护(PMP,physical memory protection)和虚拟内存(virtual memory)
首先,物理内存保护较为低级的一种管理方式,而虚拟内存就比较高级。
物理内存支持R/W/X,以及lock。(读写执行以及保护锁)允许M模式指定U模式可以访问的内存地址。
虚拟内存就需要cpu支持supervisor level,通常用于实现高级的操作系统特性。有多种映射方式sv32、sv39、sv48。(多线程,MMU和虚拟内存之间的关联,同学们可以去了解。)
7.异常和中断
异常是特殊的中断。中断是操作系统的一个运行机制。异常是运行中出现了异常,导致无法继续访问(比如出现了非法访问)。这时候cpu停掉指令流,跳到一段异常处理程序(一般是自己写的。)处理完之后会再次执行这条指令。
而中断则是正常的,执行到这条指令,出现中断,会让cpu转到一个中断处理程序,但是处理完之后就不会再回到刚刚那条指令,而是继续向下。
也就是异常会给你一个机会去挽救你的程序(异常处理)再去执行刚刚出错的指令,而中断是你程序发生一些需要等待或者其他需要中断的操作的任务,联系外设等,处理完之后就会到下一条指令。
risc-v的特点和一些知识就讲到这里,希望对大家有所帮助。
下一节讲编译和链接。