广州手机网站建设公司,创建网站的各项费用,长春平原网站建设,微信平台与微网站开发RISC-V特权架构 - 模式切换与委托 1 导致模式切换的常见动作2 异常处理规则3 异常处理时模式切换3.1 在U模式下#xff0c;发生异常3.2 在S模式下#xff0c;发生异常3.3 在M模式下#xff0c;发生异常 4 系统调用时模式切换5 中断处理时模式切换 本文属于《
RISC-V指令集基… RISC-V特权架构 - 模式切换与委托 1 导致模式切换的常见动作2 异常处理规则3 异常处理时模式切换3.1 在U模式下发生异常3.2 在S模式下发生异常3.3 在M模式下发生异常 4 系统调用时模式切换5 中断处理时模式切换 本文属于《
RISC-V指令集基础系列教程》之一欢迎查看其它文章。 1 导致模式切换的常见动作
RISC-V指令架构中模式切换通常与异常处理、系统调用或程序流程管理有关。以下是导致RISC-V模式切换的一些常见动作 异常处理 当RISC-V处理器遇到异常如中断、非法指令等时它会根据异常类型跳转到相应的异常处理程序。这个跳转过程往往涉及从当前模式如用户模式U切换到更高特权的模式如监督模式S或机器模式M以便执行必要的异常处理代码。 中断处理 当中断发生时如定时器中断、外部设备中断等处理器会暂停当前任务保存现场并跳转到中断处理程序。这个过程通常涉及模式切换以确保中断处理代码在适当的特权级别下执行。 系统调用 用户模式程序有时需要执行一些特权操作如访问硬件资源或执行某些管理任务。这些操作不能直接在用户模式下完成因此程序会发起系统调用。系统调用会导致处理器从用户模式切换到监督模式或机器模式以便内核或特权代码可以执行所需的操作。RISCV提供ECALL指令来实现系统调用。 模式切换指令 RISC-V提供了一些特权指令用于在模式之间显式切换。例如mret指令用于从机器模式返回到先前的模式sret指令用于从监督模式返回到先前的模式。当异常处理程序或系统调用处理完成后这些指令会被用来恢复之前的执行模式。
总之导致RISC-V模式切换的动作包括异常处理、系统调用、使用模式切换指令以及中断处理等。这些动作确保了处理器能够在不同的执行模式之间灵活切换以满足不同任务的需求。
2 异常处理规则
RISC-V架构指出有如下的异常处理规则
M模式下发生中断只能在M模式下处理S模式下发生中断默认在M模式下处理也可以委托到S模式下处理U模式下发生中断默认在M模式下处理也可以委托到S模式下处理
不能把M模式产生的中断委托给S模式这意味着在M模式下发生的中断通常需要在M模式下处理而不能直接委托给S模式。
处理器在某时刻只会处于某一个模式下但是会根据当前的执行上下文和任务需求在不同的模式之间进行切换。
3 异常处理时模式切换
中断、异常、系统调用他们都属于广义上的异常。 但是在RISCV体系结构中委托机制使用2个寄存器实现委托
将中断归为一类使用mideleg寄存器以便将中断委托给S模式处理将异常与系统调用归为一类使用medeleg寄存器以便将异常委托给S模式处理。
进行异常处理时模式转换图如下 低权限模式切换到高权限模式 通常是由异常/中断/系统调用ecall指令触发了异常需要切换到更高权限模式进行异常处理。此时才会发生由低到高模式的切换。 高权限模式切换到低权限模式 通常是在异常处理程序结束后使用xret指令返回到之前的模式。此时才会发生由高到低模式的切换。
3.1 在U模式下发生异常 若medeleg中该异常对应bit为1表示该异常需要委托给S模式处理则更新scause、sepc、stval、mstatus、pc这些S模式寄存器并切换到S模式异常服务程序执行完毕后通过sret指令返回到之前的模式。 若bit为0表示不委托则更新mcause、mepc、mtval、mstatus、pc这些M模式寄存器并切换到M模式异常服务程序执行完毕后通过mret指令返回到之前的模式。 寄存器具体如何更新可参考《RISC-V特权架构 - 机器模式下的异常处理》。至于为何在S模式下仍然更新mstatus寄存器而不是sstatus寄存器暂时未知查看QEMU和TinyEMU源码中均是如此实现的暂时不管。 3.2 在S模式下发生异常
与U模式下完全一致。判断medeleg中该异常对应bit
为0时更新对应M模式寄存器切到M模式之后通过mret返回为1时更新对应S模式寄存器保持在S模式。
3.3 在M模式下发生异常
不再关心medeleg寄存器值仅能在M模式下处理并会更新对应M模式寄存器。
4 系统调用时模式切换 系统调用其实就是medeleg寄存器定义的异常之一只不过这种异常是由U或S模式下程序通过ecall指令软件触发的异常主要用于系统调用实现一些底层调用例如输出打印信息到串口等。
因此系统调用这种异常的处理与《2.1 异常处理时模式切换》完全一致不再赘述。
5 中断处理时模式切换
进行中断处理时模式转换图如下 与异常处理时模式转换是类似的。 只是在异常处理中我们判断medeleg寄存器确定是否委托而这里判断mideleg寄存器来确定是否委托。
整体上异常与中断的处理过程非常相似。
更新寄存器进入模式以及返回指令与异常处理时完全一致不再赘述。 本文描述的更详细内容可阅读TinyEMU源码riscv_cpu.c中raise_exception2函数。 综上只有异常或中断发生在U或S模式下时才能委托给S模式处理发生在M模式下时只能在M模式处理无法委托给S模式。
换句话说委托的目的地一定是S模式而被委托异常的源头可以是U或S模式。