当前位置: 首页 > news >正文

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模式。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Leetcode 68. 文本左右对齐
  • GFS分布式 文件系统
  • 前端小白的学习之路(Vue2 一)
  • Excel全套213集教程
  • 【数据结构】考研真题攻克与重点知识点剖析 - 第 5 篇:树与二叉树
  • Rust 实现线程安全的 Lock Free 计数器
  • Springboot使用教程
  • c语言:操作符
  • 【远程桌面】Microsoft Remote Desktop 4 mac
  • 景芯2.5GHz A72训练营dummy添加(一)
  • 4.8作业
  • 蓝桥杯 历届真题 双向排序【第十二届】【省赛】【C组】
  • 创建线程的方式
  • VGA显示器字符显示
  • GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程)
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • crontab执行失败的多种原因
  • docker容器内的网络抓包
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java 23种设计模式 之单例模式 7种实现方式
  • java第三方包学习之lombok
  • JSONP原理
  • spring学习第二天
  • 闭包,sync使用细节
  • 产品三维模型在线预览
  • 多线程事务回滚
  • 理解在java “”i=i++;”所发生的事情
  • 前端
  • 前端存储 - localStorage
  • 前端之Sass/Scss实战笔记
  • 阿里云移动端播放器高级功能介绍
  • 容器镜像
  • #《AI中文版》V3 第 1 章 概述
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #在 README.md 中生成项目目录结构
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (阿里云万网)-域名注册购买实名流程
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net SqlSugarHelper
  • .net 获取url的方法
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET开源快速、强大、免费的电子表格组件