RISCV开发记录

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

结束!

猜你喜欢

转载自blog.csdn.net/tugouxp/article/details/112260660