文章目录
- 前提
- ISA的基本介绍
- ISA是什么
- CISC vs RISC
- ISA的宽度
- RISC-V指令集
- RISC-V ISA的命名规范
- 模块化的ISA
- 通用寄存器
- Hart
- 特权级别
- 内存管理与保护
- 异常和中断
目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。
前提
这个系列的大部分文章和知识来自于:[完结] 循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春,以及相关的github地址。
在这个过程中,这个系列相当于是我的学习笔记,做个记录。
ISA的基本介绍
ISA是什么
指令集架构(ISA)是底层硬件电路向上层软件程序提供的一层接口规范。这样就为上层软件提供了一层抽象,让使用者不用操心具体的电路结构。
CISC vs RISC
复杂指令集(CISC):它针对特定的功能实现特定的指令,导致指令数目多,但生成的程序长度较短。
精简指令集(RISC):只定义常用指令,对复杂的功能采用常用指令组合进行实现。导致指令数目比较精简,但是生成的程序长度较长。‘
ISA的宽度
这块需要重点理解。
ISA(处理器)的宽度指的是CPU中通用寄存器 的宽度(bit数),这决定了寻址范围的大小,以及数据运算的能力。
举个例子:32位的CPU,它的通用寄存器的宽度为32bit。如果我们给内存中的每一个空间进行编号,那么我们最多可以有多少个编号呢?(也就是最多可以找到多个地址呢?)
答案应该是
2
32
2^{32}
232个编号。假如通用寄存器的宽度位2bit,最多可以有
2
2
=
4
2^2=4
22=4个编号,00
,01
,10
,11
。这里也就可以回答为什么32位的CPU的内存空间最大是4GB,因为CPU最多可以寻址的内存单元数量为2的32次方,即4,294,967,296个单元,同时由于内存寻址是以字节为单位的,因此32位寻址架构可以寻址的最大内存量为4GB(4,294,967,296字节)。
注:ISA的宽度和指令编码长度无关。
RISC-V指令集
RISC-V 代表这Berkeley所研发的第五代精简指令集,该项目2010年始于加州大学伯克利分校。
RISC-V ISA的命名规范
ISA的命名格式:RV[###][abc…xyz]
其中:RV
用于表示RISC-V体系结构的前缀,即RISC-V的缩写;[xxx]
{32,64,128},处理器的通用寄存器的宽度;[abc..xyz]
标识该处理器支持的指令集模块集合。
模块化的ISA
RISC-V的ISA是模块的ISA,模块化ISA的概念是:由1个基本整数指令集+多个可选的扩展指令集组成。基础指令集是固定的,永远不会变。
通用寄存器
RISC-V的非特权规格书(Unprivileged Specification)定义了32个通用寄存器以及一个PC寄存器(无法访问),寄存器的宽度由ISA指令,RV32的寄存器宽度为32bit,RV64的寄存器宽度为64bit。
Hart
HART = Hardware Thread()
这个属于是RISC-V中自己建立的,我的理解就是我们所说的CPU中核的概念,一个CPU有几个核对应到RISC-V中就是有几个Hart。
特权级别
RISC-V的特权规格书(Privileged Specification)定义了三个特权级别。这个可以理解为CPU的三种状态。我们知道Linux操作系统中有用户态和内核态。当我们的程序运行在用户态时,对应的就是进入User态,当运行在内核态,对应的就是进入Supervisor态。如果这里不太理解,可参考视频中的P4节。
Machine(机器态)级别是最高的,所有的实现都需要支持。
不同特权级别下分别对应各自的一套Registers(CSR),用于控制和获取相应Level下的处理器工作状态。高级别的特权级别下可以访问低级别的CSR,例如Machine可以访问Supervisor/User的CSR,但反之不可以。RISC-V定义了专门用于操作CSR的指令,同时也定义了特定的指令用于在不同级别中进行切换。
内存管理与保护
物理内存保护
虚拟内存:启用虚拟内存需要支持Supervisor Level。物理内存和虚拟内存之间的映射实际上是通过硬件实现的,我们称之为MMU(内存管理单元)
异常和中断
异常(Exception),当遇到异常指令时,CPU会执行一段异常处理程序。处理完毕后,它会再次执行这条异常指令,然后继续向下执行。主动触发
中断(Interrupt),当遇到中断时,CPU会执行中断程序,处理完毕后,它会从中断指令的下一条指令开始执行。被动触发