中断概念
计算机在执行程序过程中,遇到异常情况或者特殊请求时,暂停当前程序,转而处理异常,处理结束后返回程序的间断处,继续执行原程序,这就是中断。
中断源包括哪些?
- 人为设置中断
- 程序性中断,如除法非法,操作码不能识别
- 硬件故障,如突然断电
- I/O设备发送中断请求,如向内存发送读写请求
- 外部事件,如按键
各中断源如何向CPU提出中断请求?
- 中断请求标记触发器 置1;
- 每个中断源对应一个触发器,多个触发器组成中断请求寄存器;
CPU什么条件下会响应中断请求?
- 程序状态字PSW(寄存器)中的中断总开关为1;
- 中断屏蔽位为0;每个中断源对应一个屏蔽位触发器,多个触发器组成中断屏蔽寄存器;
PSW组成:
- 控制位,设置控制位,让处理器工作在某种模式下;
- 状态位,实时反应当前指令运行状态,根据状态来决定程序是否可以跳转;其中有一个中断允许位,中断总开关,如果值为1,则表明CPU可以接受外部的中断。
CPU什么时间响应?
- 当前指令执行完
CPU响应中断时执行如下3步(中断隐指令)
- 硬件关中断,关闭中断总开关
- 保护断点,保存主程序返回地址,CPU即将要执行,但是还没执行到的指令的地址;保存到特定地址,或断点进栈。
- 向中断服务程序入口跳转
方式一,硬件向量法,设备编码器生成中断号,在中断向量表查找,表中找到入口地址
方式二,软件查询法,运行 中断识别程序(将中断识别程序入口地址存入PC,即可运行),识别是哪一个设备发出的请求,相应的执行其中断服务程序中断隐指令,CPU是按指令执行,但是在执行如上三个步骤时没有实际指令,所以将三个步骤叫做隐指令
CPU执行中断服务程序流程
- 保护现场,由于中断服务程序和主程序会共用寄存器,所以首先将中断服务程序会用到的寄存器的值入栈保存,以便后续恢复现场;
- 执行中断服务,执行中断主体程序;可以视情况开中断;
- 恢复现场,恢复寄存器的值,出栈指令;先进后出;此时应关闭中断;
- 打开中断,保证在主程序执行过程中,中断都是打开的;
- 中断返回,将返回地址(断点)赋值给程序计数器PC;
执行中断服务 详细过程(risc_v架构)
1.停止执行当前程序流,转而从寄存器mtvec中定义的PC地址开始执行(该PC地址为异常服务程序),同时更新其他四个CSR寄存器:
a).异常原因寄存器mcause,记录异常种类,低31位表示12种中断和16中异常;
b).异常PC寄存器mepc(保护断点),记录遇到异常时的指令PC值,异常结束后可回到该程序点;
如果异常由 ecall或 ebreak产生,mepc值会被更新为 指令自己的PC,因此在返回时,又会回到该异常指令,造成死循环;
正确做法为在程序中改变 mepc 值指向下一条指令 mepc = mepc +4(或2);
c).异常值寄存器mtval,如果是存储器访问造成的异常,则将存储器的访问地址更新到寄存器中
如果是非法指令造成,则将指令的指令编码更新到寄存器
d).状态寄存器mstatus,异常发生时,更新其中的某些域;
2.异常服务程序
处理器进入异常后,从mtvec定义的PC地址进入该程序,
通过查询mcause异常编号,进入更具体的异常服务程序
最后退出异常程序,返回 mepc值
4.退出异常,返回主程序
退出异常指令:MRET、SRET、URET,其中SRET/URET仅用在支持监督模式和用户模式中
执行MRET指令后,停止当前程序,转而从mepc定义的PC地址开始执行(恢复断点);
同时更新状态寄存器mstatus;
一条典型的RISC-V汇编语句由4部分组成,包含如下字段:
1.标签:表示当前指令的位置标记
2.操作码:操作码可以是如下任意一种
(1)RISC-V指令的指令名称,譬如addi指令、lw指令等
(2)汇编语言的伪操作
(3)用户自定义的宏
3.操作数:操作数是操作码所需的参数,与操作码之间以空格分开
4.操作数:可以是符号、常量、或者由符号和常量组成的表达式
5.注释:注释即为了使的程序代码便于理解而添加的信息,注释是可选的,如果添加注释,需要
以“;”或者“#”作为分隔号,以分隔号开始的本行之后部分到本行结束都会被当做注释
或者使用类似C语言的注释语法//和/* */对单行或者大段程序进行注释。
备注:伪操作在汇编程序中的作用是指导汇编器处理汇编程序的行为,这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就此结束