RV32/64 特权架构 - 特权模式与指令

RV32/64 特权架构 - 特权模式与指令

  • 1 特权模式
  • 2 特权指令
    • 2.1 mret(从机器模式返回到先前的模式)
    • 2.2 sret(从监管模式返回到先前的模式)
    • 2.3 wfi(等待中断)
    • 2.4 sfence.vma(内存屏障)
  • 3 特权模式的切换

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。

1 特权模式

RISC-V 架构定义了三种主要的工作模式,也被称为特权模式
这些模式的主要区别在于,它们的权限级别和所能够执行的操作。

  • 用户模式(User Mode)

权限等级最低。
在这个模式下运行的程序(如应用程序)不能直接访问硬件资源或执行特权操作。
用户模式提供了最基本的程序执行环境,用于隔离和保护操作系统内核和其他程序。
它确保了应用程序的稳定性和安全性,防止它们对系统造成损害。

  • 监管模式(Supervisor Mode,也称为超级用户模式)

权限等级介于用户模式和机器模式之间。
通常用于操作系统内核的运行
在监管模式下,程序可以执行一些特权操作,如访问物理内存、管理设备驱动程序等。
它允许操作系统管理硬件资源,为多个用户模式的程序提供服务和调度。

  • 机器模式(Machine Mode)

权限等级最高。
在这个模式下,程序可以执行所有操作,包括直接访问和修改所有硬件资源。
机器模式通常用于硬件初始化、系统引导、中断和异常处理等关键任务。
由于其高度特权,机器模式通常只允许特定的、受信任的代码运行。

这些模式的优先级顺序为:机器模式 > 监管模式 > 用户模式
机器模式,是最高级特权,也是 RISC-V 硬件平台唯一必须实现的特权级。
处理器通常在最低特权模式下运行,当发生中断和异常时,则将控制权转移到更高特权的模式。

这些模式的存在意义在于提供了一种灵活而安全的计算环境。通过限制不同程序的权限,RISC-V 架构能够防止恶意软件或不受信任的程序对系统造成损害。同时,它也允许操作系统有效地管理硬件资源,确保多个程序能够公平地共享这些资源。

RISC-V 架构的模块化设计使得这些模式可以根据需要进行组合和配置,从而满足不同系统的需求。例如,一些嵌入式系统可能只需要用户模式和机器模式,而不需要监管模式。

2 特权指令

RISC-V 特权架构的指令示意图,如下所示:
在这里插入图片描述
RISC-V具备的特权指令,如下所示:
在这里插入图片描述
特权架构添加的指令非常少,但增加了若干控制状态寄存器(CSR)来实现其新增功能。

2.1 mret(从机器模式返回到先前的模式)

指令形式:mret

在RISC-V架构中,mret(Machine Return)指令用于从异常或中断处理程序返回到先前的执行环境(通常是从机器模式返回到之前的模式,如监管模式或用户模式)。这个指令负责恢复处理器的状态,并确保返回到正确的执行地址。

具体来说,当处理器遇到中断或异常时,它会切换到机器模式(M模式)以处理该中断或异常。在处理完成后,mret指令被用来退出机器模式,并返回到之前的状态和模式

mret指令的执行过程涉及以下几个步骤:

  • 恢复状态:mret指令会从特定的CSR寄存器(如mstatus、mepc等)中恢复处理器的状态。这些寄存器在中断或异常发生时保存了处理器的状态信息。
  • 切换模式:根据mstatus寄存器中的MPP字段的值,mret指令将决定返回到哪个模式(机器模式、监管模式或用户模式)。
  • 跳转到程序计数器:mret指令将mepc寄存器中的值(即中断或异常处理完成后应该返回的程序地址)复制到程序计数器(PC),从而确保处理器从正确的地址开始执行。

需要注意的是,mret指令只能在机器模式下执行,并且只有在软件修改了mstatus寄存器的MPP字段以指定要返回到的模式之后,才能安全地使用该指令进行返回操作。

总的来说,mret指令在RISC-V架构中扮演着从机器模式返回到其他模式的关键角色,确保了处理器在中断或异常处理完成后能够正确地恢复到先前的执行环境。

2.2 sret(从监管模式返回到先前的模式)

指令形式:sret

在RISC-V架构中,sret(Supervisor Return)指令用于从异常或中断处理程序返回到监督模式(Supervisor Mode)。它是RISC-V处理器的一组退出指令之一,专门用于在监督模式下退出异常

当处理器在执行用户模式的程序时遇到需要由监督模式处理的异常或中断时,它会切换到监督模式来执行相应的异常或中断处理程序。在异常或中断处理程序执行完成后,sret指令被用来从监督模式返回到用户模式,并继续执行原来的程序。

sret指令的执行过程与mret类似,也会恢复处理器的状态并跳转到正确的程序计数器(PC)。它会从特定的CSR寄存器(如sstatus、sepc等)中恢复监督模式的状态信息,并将sepc寄存器中的值复制到程序计数器(PC),从而确保处理器从正确的地址开始执行用户模式的程序。

需要注意的是,sret指令只能在监督模式下执行,并且只有在软件修改了相应CSR寄存器的字段以指定要返回到的模式之后,才能安全地使用该指令进行返回操作。

总之,sret指令在RISC-V架构中用于从监督模式返回到用户模式,确保处理器在异常或中断处理完成后能够正确地恢复到用户模式的执行环境。

2.3 wfi(等待中断)

指令形式:wfi

RISC-V架构中的WFI(Wait For Interrupt)指令是一条特殊的休眠指令。当处理器执行到WFI指令后,它会停止执行当前的指令流,进入一种空闲状态,通常被称为“休眠”状态。处理器会在这个状态下等待,直到接收到一个使能的中断请求,这时处理器会被唤醒并继续执行。

具体来说,WFI指令的作用是将处理器置于低功耗的等待状态,直到下一个中断或触发事件发生。在这个过程中,CPU的功耗会被降到最低水平。这是一种常用于节能和功耗优化的待机指令。

此外,WFI指令也可以被当作一种NOP(无操作)指令来使用,即它不会真正进入休眠模式,但仍然会停止当前的指令执行,直到下一个中断或触发事件发生。

需要注意的是,WFI指令的执行需要满足一些条件,例如中断局部开关必须被打开(由mie寄存器控制),并且全局中断也需要被使能(由mstatus寄存器的MIE域控制)。如果中断被全局关闭,处理器在唤醒后会继续顺序执行之前停止的指令流。

总的来说,WFI指令在RISC-V架构中提供了一种有效的机制来降低处理器的功耗,并在需要时通过中断来唤醒处理器,从而实现了节能和高效的处理器管理。

2.4 sfence.vma(内存屏障)

指令形式:sfence.vma rs1, rs2

在RISC-V架构中,sfence.vma指令是一个同步屏障(Synchronization Fence)指令,用于确保内存操作的顺序性。这条指令在RISC-V的特权模式(Supervisor Mode)中提供内存访问的同步机制。

sfence.vma指令的具体语法是sfence.vma rs1, rs2,其中rs1和rs2是两个寄存器操作数。然而,需要注意的是,尽管sfence.vma指令接受两个寄存器操作数,但这两个操作数并不直接参与指令的功能。实际上,这两个寄存器通常被设置为零,因为sfence.vma指令的行为不依赖于这两个寄存器的具体值。

sfence.vma指令的主要作用是创建一个内存屏障,确保在指令之前的所有内存写操作(Store)在指令执行后对所有后续的内存读操作(Load)都是可见的。换句话说,它确保了在sfence.vma指令之前的所有写操作在指令执行后都已经被刷新到内存中,并且后续的读操作能够读取到这些更新的值

这种内存屏障机制在并发编程和多处理器系统中非常重要,因为它可以防止内存访问的竞态条件(Race Condition)。例如,当多个处理器或线程同时访问和修改共享内存时,如果没有适当的同步机制,就可能出现一个处理器读取到的内存值是另一个处理器尚未写入的旧值的情况,从而导致程序行为的不正确。通过使用sfence.vma指令,可以确保内存访问的顺序性,从而避免这类问题。

需要注意的是,sfence.vma指令只在Supervisor Mode下有效,并且在其他模式下执行该指令将导致未定义行为。此外,该指令的具体行为可能还取决于处理器的具体实现和配置。因此,在使用sfence.vma指令时,建议查阅相关的处理器文档或参考手册以获取准确的信息。

3 特权模式的切换

在 RISC-V 架构中,三种特权模式(用户模式、监管模式、机器模式)之间的切换是通过特定的指令和系统寄存器的配合来实现的。

(1) 指令控制

  • 使用特定的特权切换指令,如 mret(从机器模式返回到先前的模式)、sret(从监管模式返回到先前的模式)和 uret(从用户模式返回到先前的模式)。这些指令用于在完成特权操作后安全地返回到较低权限的模式。

(2) 系统寄存器

  • RISC-V 架构使用了一组称为 Control and Status Registers (CSRs) 的特殊寄存器来管理特权级别的切换。其中,mstatus 寄存器是机器状态寄存器,包含了关于机器模式状态的信息。
  • mstatus.mpp 字段用于指示当前特权级别。当需要切换特权级别时,软件会修改 mstatus.mpp 字段的值,并通过执行相应的返回指令来实际执行切换。

(3) 中断和异常处理

  • 当发生中断或异常时,处理器会根据中断或异常的类型自动切换到相应的特权级别。例如,处理器接收到一个中断时,可能会切换到机器模式来处理该中断。
  • 中断和异常处理完成后,处理器会根据 mstatus.mpp 寄存器的值返回到先前的特权级别。

(4) 硬件支持

  • RISC-V 架构的硬件设计支持这些模式的切换。处理器在执行特权切换指令时,会检查当前的特权级别和目标特权级别,并执行必要的状态保存和恢复操作。

需要注意的是,具体的切换机制和步骤可能会因具体的 RISC-V 实现和系统配置而有所不同。上述描述提供了一般的概述,但具体的实现细节可能会因处理器微架构、操作系统和硬件平台而异。

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

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

相关文章

idea 更新maven java版本变化

今天遇到个问题就是&#xff0c;点击maven的reload&#xff0c;会导致setting 里的java compiler 版本变化 这里的话&#xff0c;应该是settings.xml文件里面的这个限定死了&#xff0c;修改一下或者去掉就可以了 <profile><id>JDK-1.8</id><activatio…

华为OD机试真题-靠谱的车-2023年OD统一考试(C卷)---Python3-开源

题目&#xff1a; 考察内容&#xff1a; 思维转化&#xff0c;进制转化&#xff0c;9进制转为10进制&#xff0c;在4的位置1&#xff0c;需要判断是否大于4 代码&#xff1a; """ 题目分析&#xff1a; 9进制转化为10进制23-25 39-50 399-500输入&#xff1a…

06 基于单位脉冲信号的信号合成与分解

各位看官&#xff0c;大家好&#xff01;本讲为《数字信号处理理论篇》06 基于单位脉冲信号的信号合成与分解。&#xff08;特别提示&#xff1a;课程内容为由浅入深的特性&#xff0c;而且前后对照&#xff0c;不要跳跃观看&#xff0c;请按照文章或视频顺序进行观看。 笔者今…

排序算法--堆排序

堆排序的时间复杂度是O&#xff08;N*logN&#xff09;&#xff0c;优于选择排序O&#xff08;N^2&#xff09; 一、堆 1.堆的概念&#xff1a;堆一般指的是二叉堆&#xff0c;顾名思义&#xff0c;二叉堆是完全二叉树或者近似完全二 2.堆的性质&#xff1a;①完全二叉树 ②每…

MySQL基本数据类型

目录 一&#xff0c;各类型特点 1.1.整数 1.2.实数&#xff08;带有小数点&#xff09; 1.3.TEXT、BLOB 时间1.4.日期 1.5.选择标识符 一&#xff0c;各类型特点 1.1.整数 TINYINT 8位 &#xff08;-128 - 127&#xff09;SMALLINT 16位 &#xff08;-32768 - 32767&am…

数据结构(C语言)代码实现(九)——迷宫探路表达式求值

目录 参考资料 迷宫探路 顺序栈头文件SqStack.h 顺序栈函数实现SqStack.cpp 迷宫探路主函数 表达式求值 链式顺序栈头文件LinkStack.h 链式顺序栈函数实现LinkStack.cpp 表达式求值主函数 测试结果 参考资料 数据结构严蔚敏版 2021-9-22【数据结构/严蔚敏】【顺序…

istio学习记录——VirtualService详解

上一篇使用VirtualService进行了简单的流量控制&#xff0c;并通过Gateway将流量导入到了集群内。这一篇将更加深入的介绍 VirtualService。 k8s中有service&#xff0c;service能够对流量进行负载均衡&#xff0c;那为什么istio又引入了VirtualService呢&#xff0c;因为serv…

wsl2挂载识别U盘中的内容

&#xff08;1&#xff09;wsl2中识别U盘&#xff0c;访问U盘 U盘插入电脑后&#xff0c;WSL并不会识别出U盘&#xff0c;如果想要在WSL中使用或查看U盘文件&#xff0c;需要挂载USB设备。 1、首先建一个文件夹用来挂载USB设备里文件的文件夹&#xff1a; sudo mkdir /mnt/e…

android stdio环境搭建

android stdio环境搭建 Jdk环境搭建 1. 准备Jdk,这边已经准备好了jdk1.8.0,该文件直接使用即可 2. 系统变量添加 %JAVA_HOME%\bin JAVA_HOME 3. 系统变量&#xff0c;Path路径添加 4. 添加完成后&#xff0c;输入命令javac / java -version&#xff0c;验证环境是否搭建…

贪心算法练习day2

删除字符 1.题目及要求 2.解题思路 1&#xff09;初始化最小字母为‘Z’&#xff0c;确保任何字母都能与之比较 2&#xff09;遍历单词&#xff0c;找到当前未删除字母中的最小字母 3&#xff09;获取当前位置的字母 current word.charAt(i)&#xff1b; 4&#xff09;删…

MR混合现实情景实训教学系统在商务外语课堂的应用

一、MR混合现实情景实训教学系统的特点 MR混合现实情景实训教学系统是一种将虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术相结合的教育平台。它通过三维立体图像&#xff0c;模拟真实的商务环境&#xff0c;使学生在虚拟环境中进行外语沟通实…

精品基于SpringBoot的体育馆场地预约赛事管理系统的设计与实现-选座

《[含文档PPT源码等]精品基于SpringBoot的体育馆管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#…

状态模式(State Pattern)

定义 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。这意味着&#xff0c;当对象的状态发生变化时&#xff0c;它的行为也会发生变化。状态模式特别适用于行为依赖于其状态的对象&#xff0c;而且当这…

学习pybind11:Hello World例子

首先要明白pybind11是干啥的&#xff0c;对于一个C/C库&#xff0c;可以用pybind11封装它的接口为Python接口&#xff0c;这样得到一个python库&#xff0c;就可以把功能强大的库丢给使用python的boys & girls使用了~ 因此&#xff0c;使用pybind11做封装&#xff0c;是我…

分享便携式血氧仪单片机方案

血氧仪主要测量指标分别为脉率、血氧饱和度、灌注指数。血氧饱和度是临床医疗上重要的基础数据之一。以家用指压式血氧仪为例&#xff0c;一个血氧仪一般由MCU、存储芯片、两个控制LED的数模转换器、两个发光二极管驱动等组成。 灵动微电子的MM32MCU产品已被广泛地应用在了一些…

代码随想录算法训练营第44天|● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

文章目录 ● 完全背包卡码网&#xff1a;52. 携带研究材料-完全背包理论练习代码&#xff1a; ● 518. 零钱兑换 II思路&#xff1a;五部曲 代码&#xff1a;滚动数组代码二&#xff1a;二维数组 ● 377. 组合总和 Ⅳ思路&#xff1a;五部曲 代码&#xff1a; ● 完全背包 卡码…

LeetCode 2621.睡眠函数

请你编写一个异步函数&#xff0c;它接收一个正整数参数 millis &#xff0c;并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1&#xff1a; 输入&#xff1a;millis 100 输出&#xff1a;100 解释&#xff1a; 在 100ms 后此异步函数执行完时返回一个 Promise 对象 …

Bert-as-service 学习

pip3 install --user --upgrade tensorflow 安装遇到的问题如下&#xff1a; pip3 install --user --upgrade tensorflow 1052 pip uninstall protobuf 1053 pip3 uninstall protobuf 1054 pip3 install protobuf3.20.* 1055 pip3 install open-clip-torch2.8.2 1…

C#单向链表实现:Append,Move,Delete,InsertAscending, InsertUnAscending,Clear

目录 一、链表定义 二、链表设计 1.先定义一个结点类&#xff08;Node&#xff09; 2.再定义链表类&#xff08;LinkedList&#xff09;并依次设计其方法 3.再实现删除方法 4.再实现Insert 的方法 5.再增加InsertAscending升序插入 6.再增加 InsertUnAscending 的方法…

数据库CLOB类型

CLOB&#xff08;Character Large Object&#xff09;是一种数据库字段类型&#xff0c;通常用于存储大量的字符数据&#xff0c;如文本、日志、XML 数据等。 在数据库中&#xff0c;CLOB 类型可以存储比普通字符串类型更大的数据量&#xff0c;通常用于保存超过数据库限制长度…