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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/301432.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理环境配置opencv-python

下载python,配置pip使用清华源下载镜像: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 切换到python目录下,右击cmd,执行pip升级指令: python -m pip install --upgrade pip 下载opencv&#x…

西圣、万魔、倍思开放式耳机值不值得买?测评对比探讨!

自开放式耳机问世以来,便凭借其独特魅力赢得了众多音乐爱好者的青睐。它不仅佩戴起来舒适无比,还能让用户随时聆听周围的环境声音,保持与外界的沟通。同时,在卫生方面也有着不俗的表现。相较于传统的入耳式耳机,这些优…

uniapp使用npm命令引入font-awesome图标库最新版本并解决APP和小程序不显示图标的问题

uniapp使用npm命令引入font-awesome图标库最新版本 图标库网址:https://fontawesome.com/search?qtools&or 命令行: 引入 npm i fortawesome/fontawesome-free 查看版本 npm list fortawesome在main.js文件中: import fortawesome/fo…

嵌入式Linux系统调用执行基本流程

内核态与用户态 什么是系统调用 系统调用是怎么实现的 库函数write 库函数扩展汇编宏 int 0x80中断 调用对应的中断处理函数 检索系统调用函数表 最终执行sys_write 内核态与用户态数据交互 内核态与用户态 早期工程师们在操作系统上编写程序的时候,自己写个程序可以访问别人…

3.5、文本显示(Text/Span)

创建文本 Text 可通过以下两种方式来创建: string 字符串 效果图 Text(我是一段文本)引用 Resource 资源 资源引用类型可以通过 $r 创建 Resource 类型对象,文件位置为 /resources/base/element/string.json。 引用的资源位于:src/main/resources/base/element/string…

红酒:按年份分类,探究不同类型红酒的品质

在红酒的世界里,年份是一个至关重要的因素,它对红酒的品质和价值有着深远的影响。云仓酒庄雷盛红酒深知这一点,从酿造的首年起,就严格把控每一个环节,力求为消费者提供品质的红酒。 首先,让我们了解一下什么…

飞企互联-FE企业运营管理平台 druid路径 弱口令漏洞复现

0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外,支持企业B2B、C2B与O2O等核心需求,为不同行业客户的互联网+转型提供支持。 0x02 漏洞概述 飞企互联-FE企业…

ctf刷题记录2(更新中)

因为csdn上内容过多编辑的时候会很卡&#xff0c;因此重开一篇&#xff0c;继续刷题之旅。 NewStarCTF 2023 WEEK3 Include &#x1f350; <?phperror_reporting(0);if(isset($_GET[file])) {$file $_GET[file];if(preg_match(/flag|log|session|filter|input|data/i, $…

QT----opencv4.8.0编译cuda版本,QTcreater使用

目录 1 编译opencv4.8.02 验证能否加载GPU cuda12.1 opencv4.8.0 vs2019 cmake3.29 1 编译opencv4.8.0 打开cmake&#xff0c;选择opencv480路径&#xff0c;build路径随意 点击configure后&#xff0c;选择这些选项&#xff0c;opencv_word&#xff0c;cuda全选&#xff0c;…

Java环境变量配置说明

1、右键点击“此电脑”&#xff0c;选择“属性”项。 2、点击“高级系统设置”&#xff0c;在弹出的系统属性框中&#xff0c;选择“高级”选项卡&#xff08;默认即显示该选项卡&#xff09;&#xff0c;点击“环境变量”。 3、在弹出的“环境变量”框&#xff0c;中选择下方…

酷开科技不断深耕智能电视领域,用酷开系统带给消费者更多可能性

在这个网络快速发展的时代&#xff0c;电视行业也发生了巨大变革。与以往单纯的“看”电视不同&#xff0c;人们不再满足于现有的状态&#xff0c;消费者对电视娱乐的追求更加丰富&#xff0c;这也就带给智能电视产业无限的发展可能。酷开科技瞄准这一产业趋势&#xff0c;不断…

K8S - Service简介和 1个简单NodePort例子

大纲图 流量方向 如上图&#xff0c; 当用户or 别的service 从k8s 集群外部访问 集群内的services 流量方向有两种 一种是垂直方向&#xff0c; 通过域名 -> Load Balancer -> gateway -> services , 在k8s 一般是通过ingress 来实现&#xff0c; 而ingress 不是本文…

面试经典150题——删除链表的倒数第 N 个结点

1. 题目描述 2. 题目分析与解析 这个题目整体来讲还是比较简单的&#xff0c;因此直接给出解题思路&#xff1a; 遍历链表计数 计算要删除的节点的位置 创建虚拟头节点 创建指针指向虚拟头节点 移动指针到要删除的节点的前一个节点 删除节点 返回头节点 3. 代码实现 …

IDEA new ui 找不到evaluate

问题 idea升级新版本之后&#xff0c;发现熟悉的evaluate不见了&#xff0c;只能通过快捷键启动&#xff0c;未免太麻烦了&#xff0c;如何像旧版一样添加图标直接点呢&#xff1f; 解决方案 打开debug窗口&#xff0c;在这个地方右键&#xff0c;然后选择add actions 搜索…

LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)

引言 简介 编译Android可用的模型 转换权重 生成配置文件 模型编译 编译apk 修改配置文件 绑定android library 配置gradle 编译apk 手机上运行 安装 APK 植入模型 效果实测 0. 引言 清明时节雨纷纷&#xff0c;路上行人欲断魂。 小伙伴们好&#xff0c;我是《小…

VAR模型(二)结婚率的影响因素分析

本文研究分析了普通本专科毕业人数、城乡居民人民币储蓄存款年底余额对结婚率的影响。以计量经济学中VAR模型为主要分析模型,建立了结婚率的多元回归模型。分析了普通本专科毕业人数、城乡居民人民币储蓄存款年底余额和结婚率现状。并且对未来结婚率进行了预测。 1.理论模型和…

C语言面试题之化栈为队

化栈为队 实例要求 C语言实现实现一个MyQueue类&#xff0c;该类用两个栈来实现一个队列&#xff1b;示例&#xff1a; MyQueue queue new MyQueue();queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false说明&…

NCI SEER breast cancer美国国立癌症研究所数据库乳腺癌生存分析和乳腺癌预测模型(2024年新项目)

​作者Toby&#xff0c;来源公众号&#xff1a;python生物信息学,美国国立癌症研究所数据库乳腺癌生存分析和乳腺癌预测模型 NCI美国国立癌症研究所(NationalCancerInstitute,NCI) 美国国立癌症研究所&#xff08;NCI&#xff09;是美国国家卫生研究院&#xff08;NIH&#xf…

USACO 2024 Open Bronze铜组题解

迟到了一个月的题解...... Logical Moos: 啊这题放在铜组T1雀食有点BT...... 首先&#xff0c;我们关注l前第一和r最后那两组。如果这俩有一个是true&#xff0c;那答案肯定也是true。 否则&#xff0c;在l和r外边的都是false。那我们就只用仔细看l和r中间的玩意儿。对于l和…

如何挂载img镜像以及lvm分区

上一章节&#xff0c;我在win10下利用qemu安装了一个aarch64的 kylin-server-v10的ISO系统镜像包。安装时将系统安装到了虚拟硬盘kylin-server-v10.img 里&#xff0c;现在有个需求&#xff0c;要读出kylin-server-v10.img中文件系统的内容。 通过fdisk命令可以看到 kylin-ser…