RISC-V学习整理

RISC-V学习整理

目前网上关于risc-v架构概念介绍的文章比较多,本文从开发角度把学习中的记录整理出来。
以下为作者为自学记录内容,文章仅抛砖引玉,有学习需要的同学还需以官网及risc-v专家的书籍为准。
有错误欢迎指出,共同学习进步。

RISC-V:

  1. RV32I RV32E
    RV32G表示RV32IMAFD
    I – 32位地址空间,32个通用寄存器
    M – 整数乘,整数除
    A – 原子操作指令
    F – 单精度浮点
    D – 双精度浮点
    C – 压缩指令,长度16
  2. RISC-V仅支持小端
    RISC-V不支持地址自增自减
    RISC-V有2条无条件跳转指令,6条条件跳转指令

汇编部分:

1.伪操作,汇编结束伪操作就结束
2. .option rvc 表示接下来的汇编程序可以被汇编生成16位宽的压缩指令
  .option norvc 表示接下来的汇编程序不可以被汇编生成16位宽的压缩指令
3. li 赋值
  la 标签地址赋值

中断和异常:

  1. 广义中断和异常都称为异常
    同步:非法地址空间,访问地址属性,取指非对齐,非法指令,断点
    异步:外部中断(精确),读写存储器(非精确)
  2. 异常发生 --> 硬件更改寄存器 --> 软件读取寄存器判断 --> 异常处理
    系统会读取mcause寄存器判断何种异常从而跳转异常处理
    RISC-V硬件不会保存上下文,需要软件保存和恢复
  3. 相关寄存器
    mtvec
    异常入口地址寄存器,指定异常处理的pc地址,软件可以更改其值
    高30为是BASE
    低2位是mode模式 —| mode=0 所有异常响应 BASE 为 PC
    | mode =1 —| 狭义异常响应 BASE 为 PC
    | 狭义中断响应 BASE+4×casue(中断异常编号) 为 PC
    mcause
    软件可读取寄存器,查看异常原因
    高1位 interropt域
    低31位 异常编号域 --> 定义了12种中断类型和10种异常类型
    mepc
    保存原PC,用于异常返回,可读写,软件可以更改
    中断时,mepc为下一条指令
    异常时,mepc为发生异常时当前的PC
    mtral
    异常值
    如果存储器访问,mtral为存储器地址
    如果非法指令,mtral为非法指令编码
    mstatus
    机器模式状态
    MIE=1,该模式下中断全局打开,为0关闭
    进入异常和退出时都会更改此寄存器
  4. RISC-V狭义的异常不可以被屏蔽
    狭义的中断可以被屏蔽,通过中断使能寄存器mie控制
  5. RISC-V不支持硬件中断嵌套
    进入异常后,mstatus中mie会被硬件该为0,则中断全局关闭,不支持硬件中断嵌套
    中断嵌套需要有软件实现:
    a.读取mcause确认是中断
    b.软件强写mie为1
      打开mie前需要注意 —| 屏蔽优先级低的中断可以修改mie中几个域
                          | 也可以通过修改PLIC屏蔽低优先级中断
                          | 软件注意保存中断上下文
                          | 软件注意修改mepc值,恢复使用

PLIC 平台级别中断控制器:

  1. 支持0~7共8个中断目标
    中断编号0 做为保留,实际中断源为(支持个数-1)个
    优先级为0~7,数字越大,优先级越高。优先级0可以认为屏蔽中断
    另一种屏蔽中断方法是设置中断使能寄存器 IE为0

  2. 中断处理流程
    a 中断使能IE为1,中断源优先级大于0
    b 外部中断经过gateway 寄存器IP(只读)被置1。
    c 仲裁,优先选择高优先级中断,优先级一样则选编号小的中断,仲裁结果必须大于中断目标优先级阈值
    d 产生中断。
    e 中断目标读取存储器地址映射的中断响应寄存器(可读)进行响应,且返回id ,通过此id进行中断处理
    f 将id写入中断完成寄存器(可写)表示中断结束,硬件自动将IP置0, 解除gateway屏蔽,以便其他中断产生

你可能感兴趣的:(RISC-V学习整理)