RISC-V特权架构 - 中断定义

RISC-V特权架构 - 中断定义

  • 1 中断类型
    • 1.1 外部中断
    • 1.2 计时器中断
    • 1.3 软件中断
    • 1.4 调试中断
  • 2 中断屏蔽
  • 3 中断等待
  • 4 中断优先级与仲裁
  • 5 中断嵌套
  • 6 异常相关寄存器

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

1 中断类型

RISC-V 架构定义的中断类型分为4 种:

  • 外部中断(External Interrupt)
  • 计时器中断(Timer Interrupt)
  • 软件中断(Software Interrupt)
  • 调试中断(Debug Interrupt)

下文将分别予以详述,由于本文为简化知识模型,在此仅介绍“机器模式”的相关内容。

1.1 外部中断

RISC-V 架构定义的外部中断,要点如下:

  • (1)外部中断,是指来自于处理器核外部的中断,譬如外部设备UART、GPIO 等产生的中断。
  • (2)RISC-V 架构,在机器模式、监督模式和用户模式下,均有对应的外部中断
  • (3)机器模式外部中断(Machine External Interrupt)的屏蔽,由CSR 寄存器mie 中的MEIE域控制;等待(Pending)标志,则反映在CSR 寄存器mip 中的MEIP 域。
  • (4)机器模式外部中断,可以作为处理器核的一个单比特输入信号,假设处理器需要支持很多个外部中断源,RISC-V 架构定义了一个平台级别中断控制器(Platform Level Interrupt Controller,PLIC)可用于多个外部中断源的优先级仲裁和派发。
    • PLIC 可以将多个外部中断源,仲裁为一个单比特的中断信号送入处理器核,处理器核收到中断,进入异常服务程序后,可以通过读PLIC 的相关寄存器,查看中断源的编号和信息。
    • 处理器核,在处理完相应的中断服务程序后,可以通过写PLIC 的相关寄存器和具体的外部中断源的寄存器,从而清除中断源(假设中断来源为GPIO,则可通过GPIO 模块的中断相关寄存器,清除该中断)。
  • (5)虽然RISC-V 架构,只明确定义了一个机器模式外部中断,同时明确定义可通过PLIC在外部管理众多的外部中断源,将其仲裁成为一根机器模式外部中断信号,传递给处理器核。但是RISC-V 架构,也预留了大量的空间,供用户扩展其他外部中断类型,如以下3 种。
    • CSR 寄存器mie 和mip 的高20 位,可以用于扩展控制其他的自定义中断类型。
    • 用户甚至可以自定义若干组新的mie和mip寄存器,以支持更多自定义中断类型。
    • CSR 寄存器mcause 的中断异常编号域为12 及以上的值,均可以用于其他自定义中断的异常编号(Exception Code)。因此理论上通过扩展,RISC-V 架构可以支持无数根自定义的外部中断(External Interrupt)信号,直接输入给处理器核。

1.2 计时器中断

RISC-V 架构定义的计时器中断,要点如下:

  • (1)计时器中断,是指来自计时器的中断。
  • (2)RISC-V 架构,在机器模式、监督模式和用户模式下,均有对应的计时器中断
  • (3)机器模式计时器中断的屏蔽,由mie 寄存器中的MTIE 域控制,等待(Pending)标志则反映在mip 寄存器中的MTIP 域。
  • (4)RISC-V 架构定义了,系统平台中必须有一个计时器,并给该计时器定义了两个64 位宽的寄存器mtimemtimecmp。mtime 寄存器用于反映当前计时器的计数值,mtimecmp 用于设置计时器的比较值。当mtime 中的计数值大于或者等于mtimecmp 中设置的比较值时,计时器便会产生计时器中断。计时器中断会一直拉高,直到软件重新写mtimecmp 寄存器的值,使得其比较值大于mtime 中的值,从而将计时器中断清除。
    • 值得注意的是,RISC-V 架构,并没有定义mtime 寄存器和mtimecmp 寄存器为CSR寄存器,而是定义其为存储器地址映射(Memory Address Mapped)的系统寄存器,具体的存储器映射(Memory Mapped)地址RISC-V 架构并没有规定,而是交由SoC系统集成者实现。
    • 另一点值得注意的是,RISC-V 架构定义mtime 定时器,为实时(Real-Time)计时器,系统必须以一种恒定的频率作为计时器的时钟。该恒定的时钟频率必须为,低速的电源常开的(Always-on)时钟,低速是为了省电,常开是为了提供准确的计时。

在这里插入图片描述

1.3 软件中断

RISC-V 架构定义的软件中断,要点如下:

  • (1)软件中断,是指来自软件自己触发的中断。
  • (2)由于RISC-V 架构,在机器模式、监督模式和用户模式下,均有对应的软件中断
  • (3)机器模式软件中断的屏蔽,由mie 寄存器中的MSIE 域控制,等待(Pending)标志则反映在mip 寄存器中的MSIP 域。
  • (4)RISC-V 架构定义的机器模式软件中断,可以通过软件写1 至msip 寄存器来触发
    • 注意:此msip 寄存器和mip 寄存器中的MSIP 域,命名不可混淆。且RISC-V 架构,并没有定义msip 寄存器为CSR 寄存器,而是定义其为存储器地址映射的系统寄存器,具体的存储器映射地址RISC-V 架构并没有规定,而是交由SoC 系统集成者实现。
  • (5)当软件写1 至msip 寄存器,触发了软件中断之后,CSR 寄存器mip 中的MSIP 域便会置高,反映其等待状态。软件可通过写0 至msip 寄存器来清除该软件中断。

1.4 调试中断

除了上述3 种中断之外,还有一种特殊的中断——调试中断(Debug Interrupt),此中断专用于实现调试器(Debugger)。

2 中断屏蔽

RISC-V 架构的狭义上的异常,是不可以被屏蔽的,也就是说一旦发生狭义上的异常,处理器一定会停止当前操作转而处理异常。但是狭义上的中断,则可以被屏蔽掉,RISC-V 架构定义了CSR 寄存器机器模式中断使能寄存器mie(Machine Interrupt Enable Registers)可以用于控制中断的屏蔽。
在这里插入图片描述

  • (1)mie 寄存器的详细格式,如上图,其中每一个比特域,用于控制每个单独的中断使能。
    • MEIE 域控制机器模式(Machine Mode)下,外部中断(External Interrupt)的屏蔽。
    • MTIE 域控制机器模式(Machine Mode)下,计时器中断(Timer Interrupt)的屏蔽。
    • MSIE 域控制机器模式(Machine Mode)下,软件中断(Software Interrupt)的屏蔽。
  • (2)软件可以通过写mie 寄存器中的值,达到屏蔽某些中断的效果。假设MTIE 域为被设置成0,则意味着将计时器中断屏蔽,处理器将无法响应计时器中断。
  • (3)如果处理器只实现了机器模式,则监督模式和用户模式对应的中断使能位(SEIE、UEIE、STIE、UTIE、SSIE 和USIE)无任何意义。

注意
除了对3 种中断的分别屏蔽,通过mstatus 寄存器中的MIE 域,还可以全局关闭所有中断

3 中断等待

RISC-V 架构定义了,CSR 寄存器机器模式中断等待寄存器mip(Machine Interrupt Pending Registers),可以用于查询中断的等待状态。
在这里插入图片描述

  • (1)mip 寄存器的详细格式,如上图所示,其中的每一个域,用于反映每个单独的中断等待状态(Pending)。
    • MEIP 域反映机器模式(Machine Mode)下的,外部中断的等待(Pending)状态。
    • MTIP 域反映机器模式(Machine Mode)下的,计时器中断的等待(Pending)状态。
    • MSIP 域反映机器模式(Machine Mode)下的,软件中断的等待(Pending)状态。
  • (2)如果处理器只实现了机器模式,则mip 寄存器中监督模式和用户模式对应的中断等待状态位(SEIP、UEIP、STIP、UTIP、SSIP 和USIP)无任何意义。
  • (3)软件可以通过读mip 寄存器中的值,达到查询中断状态的效果
    • 如果MTIP 域的值为1,则表示当前有计时器中断(Timer Interrupt)正在等待“Pending”。
    • 注意: 即便mie 寄存器中MTIE 域的值为0(被屏蔽),如果计时器中断到来,则MTIP 域仍然能够显示为1。也就是说,mie寄存器将中断屏蔽,只是让处理器无法响应中断,但是mip的pending状态仍然存在
    • MSIP、MEIP 与MTIP 同理。
  • (4)MEIP/MTIP/MSIP 域的属性均为只读,软件无法直接写这些域改变其值。只有这些中断的源头,被清除后将中断源撤销,MEIP/MTIP/MSIP 域的值才能相应地归零。譬如MEIP对应的外部中断,需要程序进入中断服务程序后,配置外部中断源,将其中断撤销。MTIP 和MSIP 同理。

下一节将详细介绍,中断的类型和清除方法。

4 中断优先级与仲裁

对于中断而言,多个中断可能存在着优先级仲裁的情况。对于RISC-V 架构而言,分为如下3 种情况:

  • (1)如果3 种中断同时发生,其响应的优先级顺序如下,mcause 寄存器中,将按此优先级顺序选择更新异常编号(Exception Code)的值。
    • 外部中断(External Interrupt)优先级最高
    • 软件中断(Software Interrupt)其次。
    • 计时器中断(Timer Interrupt)再次。
  • (2)调试中断比较特殊。只有调试器(Debugger)介入调试时才发生,正常情形下不会发生,因此在此不予讨论。
  • (3)由于外部中断来自PLIC,而PLIC 可以管理数量众多的外部中断源,多个外部中断源之间的优先级和仲裁,可通过配置PLIC 的寄存器进行管理。

5 中断嵌套

曾经提到多个中断,理论上可能存在着中断嵌套的情况。而对于RISC-V 架构而言:

  • 进入异常之后,mstatus 寄存器中的MIE 域,将会被硬件自动更新成为0(意味着中断被全局关闭,从而无法响应新的中断)。
  • 退出中断后,MIE 域才被硬件自动恢复成中断发生之前的值(通过MPIE 域得到),从而再次全局打开中断。

由上可见,一旦响应中断进入异常模式后,中断被全局关闭再也无法响应新的中断,因此RISC-V 架构定义的硬件机制,默认无法支持硬件中断嵌套行为。

如果一定要支持中断嵌套,需要使用软件的方式,达到中断嵌套的目的,从理论上来讲,可采用如下方法:

  • (1)在进入异常之后,软件通过查询mcause 寄存器,确认这是响应中断造成的异常,并跳入相应的中断服务程序中。在这期间,由于mstatus 寄存器中的MIE 域被硬件自动更新成为0,因此新的中断都不会被响应。
  • (2)待程序跳入中断服务程序中后,软件可以强行改写mstatus 寄存器的值,而将MIE域的值改为1,意味着将中断再次全局打开。从此时起,处理器将能够再次响应中断。但是在强行打开MIE 域之前,需要注意如下事项。
    • 假设软件希望屏蔽比其优先级低的中断,而仅允许优先级比它高的新来打断当前中断,那么软件需要通过配置mie 寄存器中的MEIE/MTIE/MSIE 域,来有选择地屏蔽不同类型的中断。
    • 对于PLIC 管理的众多外部中断而言,由于其优先级受PLIC 控制,假设软件希望屏蔽比其优先级低的中断,而仅允许优先级比它高的新来中断打断当前中断,那么软件需要通过配置PLIC 阈值(Threshold)寄存器的方式,来有选择地屏蔽不同类型的中断。
  • (3)在中断嵌套的过程中,软件需要注意保存上下文至存储器堆栈中,或者从存储器堆栈中将上下文恢复(与函数嵌套同理)。
  • (4)在中断嵌套的过程中,软件还需要注意将mepc 寄存器,以及为了实现软件中断嵌套,被修改的其他CSR 寄存器的值,保存至存储器堆栈中,或者从存储器堆栈中恢复(与函数嵌套同理)。

除此之外,RISC-V 架构,也允许用户实现自定义的中断控制器,实现硬件中断嵌套功能。

6 异常相关寄存器

将RISC-V 架构中,所有中断和异常相关的寄存器(M模式),加以总结,如下表所示:
在这里插入图片描述


参考文档:

  • 《手把手教你设计CPU.RISC-V处理器》

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

HCIA-Datacom H12-811 题库补充(3/28)

完整题库及答案解析,请直接扫描上方二维码,持续更新中 OSPFv3使用哪个区域号标识骨干区域? A:0 B:3 C:1 D:2 答案:A 解析:AREA 号0就是骨干区域。 STP下游设备通知上游…

ZK友好代数哈希函数安全倡议

1. 引言 前序博客: ZKP中的哈希函数如何选择ZK-friendly 哈希函数?snark/stark-friendly hash函数Anemoi Permutation和Jive Compression模式:高效的ZK友好的哈希函数Tip5:针对Recursive STARK的哈希函数 随着Incrementally Ve…

vue中使用jsmind生成脑图

项目部分参数&#xff1a; vue&#xff1a;2.6.10 node:16.20.0 1、使用命令行安装jsmind&#xff1a; npm i jsmind -S 2、在文件中引入jsmind&#xff0c;并编写渲染jsmind的代码&#xff1a;&#xff1a; <template><!-- jsmind容器 --><divid"jsmi…

MySQL进阶-----索引的语法与SQL性能分析

目录 前言 一、索引语法 1.SQL语法 2.案例演示 二、SQL性能分析 三、慢查询日志 1.开启日志 2.测试样例 四、profile详情 1.开启profile 2.profile测试SQL语句 五、explain详情 1.语法结构 2.执行顺序示例&#xff08;id&#xff09; 3.执行性能示例(type) 前言 本…

k8s1.28.8版本配置prometheus监控告警

文章目录 官方架构图组件的具体介绍kube-prometheus包含的组件简介&#xff1a;文件存储路径&#xff1a; 结构分析官网自带的一些规则自己总结流程 1-创建规则磁盘使用率报警规则 详解上面rule流程Alertmanagerg查看 2-报警接收器2.1-邮件报警修改Alertmanager配置查看现有的s…

钡铼技术R40路由器助力智能船舶航行数据实时传输与分析

钡铼技术R40路由器在智能船舶领域的应用&#xff0c;对于航行数据的实时传输与分析具有重要意义。随着航运业的不断发展和智能化水平的提升&#xff0c;船舶航行数据的及时传输和有效分析对船舶的安全、运营效率等方面至关重要。而引入钡铼技术R40路由器&#xff0c;则可以实现…

实时数仓之实时数仓架构(Hudi)

目前比较流行的实时数仓架构有两类&#xff0c;其中一类是以FlinkDoris为核心的实时数仓架构方案&#xff1b;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对FlinkHudi湖仓一体架构进行介绍&#xff0c;这套架构的特点是可以基于一套数据完全实现Lambda架构。实时数…

智慧工地安全生产与风险预警大平台的构建,需要哪些技术?

随着科技的不断发展&#xff0c;智慧工地已成为现代建筑行业的重要发展趋势。智慧工地方案是一种基于先进信息技术的工程管理模式&#xff0c;旨在提高施工效率、降低施工成本、保障施工安全、提升施工质量。一般来说&#xff0c;智慧工地方案的构建&#xff0c;需要通过集成物…

探索智慧农业精准除草,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建农田作物场景下杂草作物分割检测识别分析系统

智慧农业是未来的一个新兴赛道&#xff0c;随着科技的普及与落地应用&#xff0c;会有更加广阔的发展空间&#xff0c;关于农田作物场景下的项目开发实践&#xff0c;在我们前面的博文中也有很堵相关的实践&#xff0c;单大都是偏向于目标检测方向的&#xff0c;感兴趣可以自行…

c++|string模拟实现

目录 一、string.h 二、string.cpp 三、Test.cpp 对string的各种接口进行一个简易版的模拟实现&#xff0c;在模拟实现完之后对string的底层实现有了进一步的理解&#xff0c;了解大佬的编程写法思路。也算是对string有了一个小总结。 一、string.h 接口的声明。放在.h文件中…

实验7 内置对象response

编写代码&#xff0c;掌握request、response的用法。【参考课本4.6.2】 三、源代码以及执行结果截图&#xff1a; input.jsp <% page language"java" contentType"text/html; charsetutf-8" pageEncoding"utf-8"%> <!DOCTYPE html>…

【tensorflow框架神经网络实现鸢尾花分类】

文章目录 1、数据获取2、数据集构建3、模型的训练验证可视化训练过程 1、数据获取 从sklearn中获取鸢尾花数据&#xff0c;并合并处理 from sklearn.datasets import load_iris import pandas as pdx_data load_iris().data y_data load_iris().targetx_data pd.DataFrame…

Unbtun-arach64架构安装PySide2(python3.6)

aarch平台是无法通过pip安装PySide2的&#xff0c;同时利用源码下载一直报错 1. 我是python3.6.9&#xff0c;在官网上找到对应的PySide2版本 5.15.2.所以首先在官网下载Qt5.15.2的源码&#xff1a;https://download.qt.io/archive/qt/5.15/5.15.2/single/ 2. 编译qt环境 aar…

实验2-spark编程

实验目的 &#xff08;1&#xff09;通过实验掌握Spark的基本编程方法&#xff1b; &#xff08;2&#xff09;熟悉RDD到DataFrame的转化方法&#xff1b; &#xff08;3&#xff09;熟悉利用Spark管理来自不同数据源的数据。 实验内容 1&#xff0e;Spark基本操作 请参照…

Nginx官方镜像Dockerfile浅析

目录 Dockerfile获取 dfimage逆向获取 Nginx官网获取 Dockerfile分析 启动命令分析 Docker 容器入口点脚本分析 exec "$" exec 命令 "$" 参数 总结 在云原生技术快速发展的今天&#xff0c;Docker 作为容器技术的代表&#xff0c;为软件的打包、…

磐启/PAN7030/2.4GHz 无线收发SOC芯片/ESSOP10/SOP16

1 概述 PAN7030 是一款集成 8 位 OTP MCU 和 2.4GHz 无线收发电路芯片&#xff0c;适合应用于玩具小车、 遥控器等领域。 PAN7030 内置 8 位 OTP MCU&#xff0c;包括 1.25KW 的程序存储器、80 字节数据存储器、16 位定 时器和 8 位/11 位 PWM 定时器、看门狗、电压比较器等…

【QT入门】 QTabWidget各种常见用法详解

往期回顾&#xff1a; 【QT入门】 Qt代码创建布局之分裂器布局详解-CSDN博客 【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客 【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客 【QT入门】 QTabWidget各种常见用法详解 一般来说&#xff0c;学一个新的控…

出行在外,又想用微软远程桌面控制千里之外的电脑?

前言 说到远程控制&#xff0c;想必很多小伙伴都不陌生。毕竟向日葵软件都是各位所熟知的远程控制软件。 出行在外&#xff0c;使用向日葵远程控制家里或者办公室的电脑是很常见的做法。在各种远程维修电脑的场景下&#xff0c;客服都会要求客户先安装好远程控制软件。 但是向…

探索 2024 年 Web 开发最佳前端框架

前端框架通过简化和结构化的网站开发过程改变了 Web 开发人员设计和实现用户界面的方法。随着 Web 应用程序变得越来越复杂&#xff0c;交互和动画功能越来越多&#xff0c;这是开发前端框架的初衷之一。 在网络的早期&#xff0c;网页相当简单。它们主要以静态 HTML 为特色&a…

在scroll-view中使用input,input键盘弹出时,滚动页面,输入框内容会出现错位问题?

解决办法 <view classpages><view><scroll-view scroll-y"{{sysScroll}}" scroll-top"{{scrollTop}}" class"scroll-hei-2 bg-def">...<input bindfocus"onfocus" bindblur"onblur" placeholder&quo…