riscv-xv6单步调试1.5

本文详细介绍了RISC-V架构中的异常处理机制,包括异常的定义、涉及的控制状态寄存器(CSR)、异常处理流程、相关指令及异常代理。mstatus、mepc、mtvec等寄存器在异常发生时的角色被详细阐述,并提到处理器如何保存和恢复执行状态。此外,还提到了异常的代理机制,允许在不同模式下处理异常。关键词涵盖了RISC-V、异常处理、CSR、中断和异常代理。
摘要由CSDN通过智能技术生成

0. 序

  在2之前,先记录一下riscv异常处理的机制。

1. 异常定义

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328135304591.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Bhc3NlbmdlcjEyMjM0,size_16,color_FFFFFF,t_7

2. 异常相关的CSR

  主要有这几个mstatus, mepc, mtvec, mcause, mie, mip, mscratch, mtval。这是以m模式为例,因此寄存器带有m前缀(否则为s前缀)。其中mie指定哪些中断需要屏蔽,mip保存哪些中断等待被接收。mtvec指令指定异常处理程序的位置。如果mtvec的第一位为1,则异步中断跳转到mtvec+4*mcause的位置(我怎么觉得64位应该是8*mcause?)。
  当异常发生时,处理器在mstatus的mpp字段填写异常发生时的运行模式,而mpie字段填写异常发生时中断使能(是否有禁止中断,由mstatus的mie字段指定),然后将mie字段置0(即禁止中断)。因此前面两个步骤相当于在保存之前的PSW。
  mepc会保存导致异常的指令或者中断后需要执行的下一条指令的pc值。这一步相当于在保存之前的PC。mcause保存异常号。
  和x86不同的是,处理器不会自动切换栈,因此需要一个mscratch寄存器来临时保存通用寄存器的值。

3. 异常相关指令

  ecall环境调用,程序主动触发8或9或11号异常(取决于当前运行模式)。mret或者sret指令,用于从异常中返回,语义是:将运行模式修改为mstatus的mpp字段,将中断使能修改为mstatus的mpie字段,将pc值修改为mepc指定的值(恢复之前的运行环境)。

4. 异常的代理

  默认情况下,在任何运行模式下引发的异常,处理器默认都会切换到M模式,可以由medeleg,mideleg分别指定异常,中断的代理,若寄存器的相应位置1,表明该异常或者中断由S模式进行处理(当指定异常触发时,处理器将切换到S模式而不是M模式)。

5. 关键词

riscv异常处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值