1. RISCV处理器的工作状态机
RISCV 处理器工作时,有三种大的工作场景,分别是常态工作时,低功耗工作时以及调试工作时。当转换条件满足时,不同的状态之间可以发生转换。
其中常态工作下,处理器内部又可分为三种模式(对于实现了虚拟化“H”实现的RISCV IP,是四种).
注意一些状态转换是不会发生的,比如用户模式无法直接进入低功耗状态,需要在S或者M模式才可以执行WFI指令进入,S模式执行WFI也需要mstatus.tw==0.
还有比如,低功耗状态下无法调试,但常态的工作时,不管处理器处于何种模式,都可以进行调试等等。
2.RISCV处理器工作模式转化
3.关于RV64I位机运行RV32I程序的思考。
参考其它架构,基本上只有两条路,硬件的和软件的。
- 处理器硬件层面兼容32位模式,这种方式软件不需要改,硬件32位模式和32位处理器没区别,比如AARCH64兼容32位应用的做法,由于程序运行的仍然是32位ISA,之前的32位二进制可以直接跑。
- 软件方式,这种比较麻烦,它要求程序运行的指令集仍然是64位,但指针类型,long类型要编译成为32位的长度,这就需要修改编译器,内核,C库等等一串的代码,实现工作量巨大。好处是不用改硬件。这样做的有x86-32,MIPS n32, AACH64的ILP32模式等,其中MIPS做的比较彻底,它的mips-o32 abi也能保证二进制不加修改运行于64位机上,而且n32主要是解决利用64位的ISA特性运行32位代码的问题。
基本上,RISCV32和RISCV64的指令集之间的关系是下面这个样子,大部分指令都RV64和RV32都共同有定义,有完全一样的编码,但是RV64舍弃了一部分RV32的指令,将编码腾出来定义了新的指令格式,这部分会导致二进制不兼容。
部分指令在两种架构下的定义差异:
根据spec,misa的高位mxl可以控制运行于32还是64位架构,但qemu不支持,相信大部分vendor也不支持:
4.关于Supervisor模式下的中断控制、状态逻辑。
5.关于编译器和32/64位支持的问题
6.FPU Context保护的问题.
7:context switch , callee and caller reigster.
8:主中断和主异常分布:
9:关于编译优化选项的一些记录:
10:RV ISA 系统寄存器的设计有一个明显的特点,就是有些寄存器,在不同的运行级别下虽然名字不同,但是全部对应到同一个微架构中的物理寄存器实现,下面是一些总结。
11:关于进入异常的前处理
12:关于受委托的异常和中断
12:从qemu代码中分析mret和sret的执行动作。
13:M模式内存访问的问题,由qemu 代码观察到的. MMU页表翻译功能在M模式默认是disable的,尽管如此,你可以通过设置mstatus.MPRV 为1,并配合设置mstatus.MPP为S模式或者U模式来通过MMU访问S模式或者U模式的虚拟地址。这能访问形式只适用于数据存取,对指令fetch没有影响。这种看似另类的设计方式其实并不少见,在SPARC, IBM z/ARCH, 和power里面都可以见到。只是我们接触比较少罢了。
14:关于FS,XS和Context Save/Restore