RISC-V特权架构 - 时钟中断处理

news2024/9/20 0:16:57

RISC-V特权架构 - 时钟中断处理

  • 1 MTI中断处理
    • 1.1 触发中断
    • 1.2 查询mie.MTIE与mip.MTIE
    • 1.3 若运行在M模式下
    • 1.4 若运行在S模式下
    • 1.5 若运行在U模式下
  • 2 STI中断处理
    • 2.1 触发中断
    • 2.2 查询mie.STIE与mip.STIE
    • 2.3 若运行在M模式下
    • 2.4 若运行在S模式下
    • 2.5 若运行在U模式下
  • 3 知识总结
    • 3.1 中断处理逻辑
    • 3.2 中断处理规则

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

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

在这里插入图片描述

支持的中断类型,主要有以下几种:

  • 外部中断:MEIP/SEIP/UEIP
  • 时钟中断:MTIP/STIP/UTIP
  • 软件中断:MSIP/SSIP/USIP

RISC-V 架构中,在机器模式、监督模式和用户模式下,均有对应的时钟中断,分别为MTIP、STIP、UTIP。

对于初学者来讲,涉及到的mie,mstatus,midelege等寄存器,是如何使用的,可能理解的比较模糊,希望经过本节的介绍,能够拨开迷雾。
本文主要,以时钟中断为例,对中断的触发、查询、委托、处理,整个流程进行介绍。

1 MTI中断处理

MTI(Machine Timer Interrupt),即机器模式时钟中断
时钟中断,是由本地中断控制器(‌CLINT)‌管理的,‌属于本地中断的一种。‌

1.1 触发中断

MTI中断的触发,是依靠一个计时器,以及一对寄存器来完成的,即mtime和mtimecmp。

  • mtime 用于反映当前计时器的计数值
  • mtimecmp 用于设置计时器的比较值

当mtime 中的计数值,大于或者等于mtimecmp 中设置的比较值时,计时器便会产生时钟中断。产生中断后,需要固件/软件,重新写mtimecmp 寄存器的值,使其大于mtime 中的值,从而将计时器中断清除。

RISC-V 架构,并没有将这一对寄存器,定义为CSR寄存器。而是定义为存储器地址映射(Memory Address Mapped)的系统寄存器,具体的存储器映射(Memory Mapped)地址RISC-V 架构并没有规定,而是交由SoC系统集成者实现。

以上描述的是单核时的情形,若为多核,原理是相同的。CLINT的时钟中断,亦可以发送给每个核,如下图所示:

在这里插入图片描述

CLINT中,定义了与核数相同的mtimecmp寄存器,如下图所示:

在这里插入图片描述

一个mtimecmp 对应一个核,计数值使用同一个mtime寄存器,mtime与所有mtimecmp比较,可以分别对每个核,触发时钟中断。
时钟中断触发后,硬件会自动将mip.MTIP=1。

MTI中断触发、查询、处理,完整流程图,如下所示:

在这里插入图片描述

1.2 查询mie.MTIE与mip.MTIE

  • mie.MTIE == 1:表示使能MTI中断
  • mip.MTIE == 1:表示MTI中断处于等待响应状态

要让某中断被处理,则该中断对应的mie.XXIE和mip.XXIP必须为1,只有满足这个条件,才会进入处理逻辑。

此外,下面,还需要根据,当前运行的模式,来查询全局中断使能状态,以及委托。

1.3 若运行在M模式下

在这里插入图片描述

  • mstatus.mie == 0:表示禁用M模式下中断;故不处理任何中断,异常可以正常处理,不受影响。
  • mstatus.mie == 1:表示使能M模式下中断,故可以继续处理。

由于mideleg.MTIP始终为0,因此MTI中断,永远无法被委托给S模式。
即无论运行在何种模式下,M模式时钟中断(mip.MTIP),只能在M模式下处理。

所以,通常,会在MTIP的中断处理函数中,通过注入的方式将mip.STIP置1,以及midelege.STIP置1,以便下一次进入S模式时,以委托方式在S模式下处理mip.STIP中断。

不能忘记,每次时钟中断处理都要更新 mtimecmp 寄存器,否则时钟中断信号,就不会被清除。

1.4 若运行在S模式下

在这里插入图片描述

  • mstatus.sie == 0:表示禁用S模式下中断;由于mideleg.MTIP为0,无法委托至S,故陷入M处理中断。
  • mstatus.sie == 1:表示使能S模式下中断,由于mideleg.MTIP为0,无法委托至S,故陷入M处理中断。

若运行在M模式下,只有在全局中断使能位mstatus.mie置位时,才会处理中断。
如果在S模式下,触发了M模式的中断(MTIP),此时无视mstatus.mie直接响应,即:
运行在低权限模式下,高权限模式的全局中断使能位一直是enable状态。

1.5 若运行在U模式下

在这里插入图片描述

由于mideleg.MTIP为0,无法委托至S,故只能陷入M处理中断。

此处,就像是上面S模式介绍的一样,亦不关心mstatus.mie全局中断使能状态。

2 STI中断处理

STI(Supervisor Timer Interrupt),即监管模式时钟中断
时钟中断,是由本地中断控制器(‌CLINT)‌管理的,‌属于本地中断的一种。‌

2.1 触发中断

在早期的RISC-V规范中,仅有mtime和mtimecmp寄存器,因此时钟中断触发时,默认写入mip.MTIP=1,而非mip.STIP=1。
我们知道mip.MTIP,只能在M下处理,这就导致想要在S下处理时钟中断,变得比较麻烦。

所以,这里就有2个方法:

  • 软件注入mip.STIP

    通常,会在mip.MTIP的中断处理函数中,通过注入的方式将mip.STIP置1,以及midelege.STIP置1,以便下一次进入S模式时,以委托方式在S模式下处理mip.STIP中断。

  • 通过stimecmp,触发mip.STIP

    由于 mtimecmp 只能在 M 模式下访问,对于 S/HS 模式下的内核需要通过 SBI 才能访问,会造成较大的中断延迟和性能开销。为了解决这一问题,RISC-V 新增了 Sstc 拓展支持,S模式扩展为HS模式,新增了 stimecmp 。当 time>=stimecmp (HS)时会产生 timer 中断,不再需要通过 SBI 陷入其他模式。

STI中断触发、查询、处理,完整流程图,如下所示:

在这里插入图片描述

2.2 查询mie.STIE与mip.STIE

  • mie.STIE == 1:表示使能STI中断
  • mip.STIE == 1:表示STI中断处于等待响应状态

要让某中断被处理,则该中断对应的mie.XXIE和mip.XXIP必须为1,只有满足这个条件,才会进入处理逻辑。

此外,下面,还需要根据,当前运行的模式,来查询全局中断使能状态,以及委托。

2.3 若运行在M模式下

在这里插入图片描述

  • mstatus.mie == 0:表示禁用M模式下中断;故不处理任何中断,异常可以正常处理,不受影响。
  • mstatus.mie == 1:表示使能M模式下中断,故可以继续处理。
    • 如果mideleg.STIP == 0,表示不委托给S处理,故陷入M进行处理。
    • 如果mideleg.STIP == 1,表示委托给S处理,故不在M处理,下次进入S时,尝试在S下处理。

2.4 若运行在S模式下

在这里插入图片描述

  • mstatus.sie == 0:表示禁用S模式下中断。
    • 如果mideleg.STIP == 0,表示不委托给S处理,故陷入M进行处理。
    • 如果mideleg.STIP == 1,表示委托给S处理,但是这里,由于S模式全局中断被禁用,因此即便委托,也不会处理任何中断。
  • mstatus.sie == 1:表示使能S模式下中断。
    • 如果mideleg.STIP == 0,表示不委托给S处理,故陷入M进行处理。
    • 如果mideleg.STIP == 1,表示委托给S处理,这里S模式全局中断使能,因此,可以陷入S处理中断。

2.5 若运行在U模式下

在这里插入图片描述

  • 如果mideleg.STIP == 0,表示不委托给S处理,故陷入M进行处理。
  • 如果mideleg.STIP == 1,表示委托给S处理,这里,由于运行在低优先级U下,要切换到高优先级S处理中断,因此不关心mstatus.sie全局中断开关状态,默认为enable。所以,这里可以陷入S处理中断。

3 知识总结

3.1 中断处理逻辑

经过对MTI和STI中断的处理分析,发现两者的查询处理逻辑,其实是一样的。

对于RISC-V支持的,主要中断类型:

  • 外部中断:MEIP/SEIP/UEIP
  • 时钟中断:MTIP/STIP/UTIP
  • 软件中断:MSIP/SSIP/USIP

其处理流程,总结为以下几个步骤(以XXI中断为例):

  • mie.XXIE == 1 && mip.XXIP == 1:检查确保XXI中断使能,且该中断被触发
  • 根据运行模式,检查全局中断开关
    • M模式: 检查mstatus.mie
      • mstatus.mie == 0:禁用M全局中断,不处理
      • mstatus.mie == 1:使能M全局中断,继续检查委托
        • mideleg.XXIP == 0:不委托,陷入M
        • mideleg.XXIP == 1:委托到S,陷入S
    • S模式: 检查mstatus.sie
      • mstatus.sie == 0:禁用S全局中断,继续检查委托
        • mideleg.XXIP == 0:不委托,陷入M
        • mideleg.XXIP == 1:委托到S,不处理
      • mstatus.sie == 1:使能S全局中断,继续检查委托
        • mideleg.XXIP == 0:不委托,陷入M
        • mideleg.XXIP == 1:委托到S,陷入S
    • U模式: 无需检查全局中断,只检查委托
      • mideleg.XXIP == 0:不委托,陷入M
      • mideleg.XXIP == 1:委托到S,陷入S

比如,换成机器模式外部中断MEI,也是一样的处理过程。

3.2 中断处理规则

  1. RISC-V架构所有模式的异常,在默认情况下,都跳转到M模式处理。
  2. 中断/异常委托的目的地,只能是S模式。也就是说,将mideleg中某中断置为1后,表示将该中断委托到S模式进行处理,且只能是S模式。
  3. 事实上,即使在mideleg中设置了,将S模式产生的时钟中断,委托给S模式,委托仍无法完成。因为,硬件产生的时钟中断,仍会发到M模式(mtime寄存器,是M模式的设备),所以,我们需要手动触发S模式下的时钟中断(注入mip.STIP)。
  4. 由于mideleg中MEIP、MTIP、MSIP这三类M模式中断,属于保留位域,默认值为0,也不可更改,因此对于这些中断均不能委托。
    在这里插入图片描述
    MEIP、MTIP、MSIP这3类中断,仅能在M模式下处理。
  5. 当运行在低权限模式下时,若需要陷入高权限模式处理中断,则高权限模式的全局中断使能位,默认一直是enable状态(即忽略mstatus.mie或sie的实际值)。
  6. 当处理中断时,mie、mip、mideleg三个寄存器中,判断的位域应该是相同的。比如:处理MTI中断时,应检查mie.MTIE && mip.MTIP && mideleg.MTIP,因mideleg.MTIP==0,故无法委托;而不能去检查mideleg.STIP,它是表示将STI中断,委托到S的位域。
    在这里插入图片描述 7. 在常见模拟器中,对于影子寄存器,通常只使用mie、mip、mstatus寄存器,而不使用uie/sie、uip/sip、sstatus。
  • uie、sie均为mie的子集,为影子寄存器,对应位域偏移与值,均相同;读取 uie/sie 的任何字段或写入其任何可写字段,都会导致 mie 中同名字段的读写。
  • uip、sip均为mip的子集,为影子寄存器,对应位域偏移与值,均相同;读写与上述特性相同。
  • sstatus为mstatus的子集,为影子寄存器,对应位域偏移与值,均相同;读写与上述特性相同。

更多关于中断处理的文档,可参考:

  • 《MIT 6.S081 教材第五章内容 – 中断与设备驱动–下》
  • 《RISC-V timer 在 Linux 中的实现》
  • 《详解RISC v中断》

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

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

相关文章

Transformer架构的演进之路探究

1 引言 在2017年的开创性论文《Attention is All You Need(注意力就是你所需要的一切)》中,Vaswani等人提出了Transformer架构,这不仅在语音识别领域引起了一场革命,也对其他多个领域产生了深远的影响。本文将探讨Tra…

【早鸟优惠券】PostgreSQL 16 专栏优惠券

PostgreSQL 从入门到熟悉,本专栏只能做到从入门到熟悉。本专栏以 Markdown 格式书写,格式精美。有需要的朋友可以看下,使用的版本是 16。本专栏大约 20 万字左右,目前已完成了 18 万多字了。还有两篇(事务、性能调优&a…

搭建内网开发环境(一)|基于docker快速部署开发环境

引言 最近因需要搭建一套简易版的纯内网的开发环境,服务器采用 centos8.0,容器化技术采用 docker 使用 docker-compose 进行容器编排。 该系列教程分为两大类: 软件安装和使用,这类是开发环境常用的软件部署和使用,涉…

Vue框架学习笔记-8

Vue中的跨域问题 在Vue项目中遇到跨域问题,通常是因为前端(Vue)和后端(如Node.js, Django, Spring Boot等)部署在不同的域名或端口上,浏览器出于安全考虑,会阻止跨域请求。解决Vue中的跨域问题…

获取专项练习

文章目录 1.sun-club-practice-api1.vo构建1.SpecialPracticeVO.java2.SpecialPracticeCategoryVO.java3.SpecialPracticeLabelVO.java 2.SubjectInfoTypeEnum.java 2.sun-club-practice-server1.PracticeSetController.java2.service1.PracticeSetService.java2.PracticeSetSe…

基于SpringBoot的秒杀系统设计与实现

TOC springboot193基于SpringBoot的秒杀系统设计与实现 第1章 绪论 1.1 研究背景 互联网时代不仅仅是通过各种各样的电脑进行网络连接的时代,也包含了移动终端连接互联网进行复杂处理的一些事情。传统的互联网时代一般泛指就是PC端,也就是电脑互联网…

开放式耳机怎么样好用吗?六个专业好招教你选!

传统入耳式耳机容易滑落,而且戴久了耳朵疼,近段时间,耳机圈开始流行开放式耳机。开放式耳机的出现就避免了这个问题的出现,本文就为大家推荐几款使用感较好的开放式耳机,一起来看看吧~现在开放式耳机太多了&#xff0c…

IO进程(学习)2024.8.15

目录 重定向打开文件 文件IO 概念 特点 函数 1.打开文件 2.关闭文件 3.读写文件 read write 4.文件定位操作 重定向打开文件 FILE * freopen(const char *pathname, const char *mode, FILE* fp) 功能:将指定的文件流重定向到打开的文件中 参数&#…

离散数学概论

目录 一、引言 二、离散数学的主要内容 1. 集合论 1.1 集合的基本概念 1.2 集合的运算 集合运算总结表格 2. 数理逻辑 2.1 命题逻辑 2.2 逻辑推理 2.3 逻辑等价 逻辑联结词与逻辑等价总结表格 3. 组合数学 3.1 计数原理 3.2 排列与组合 3.3 容斥原理 组合数学总…

15.基于session实现登录 前端项目部署

前端项目nginx部署 nginx配置文件 worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/json;sendfile on;keepalive_timeout 65;server {listen 8080;server_name localhost;# 指定前端项目所…

手把手教你CNVD漏洞挖掘 + 资产收集

0x1 前言 挖掘CNVD漏洞有时候其实比一般的edusrc还好挖,但是一般要挖证书的话,还是需要花时间的,其中信息收集,公司资产确定等操作需要花费一定时间的。下面就记录下我之前跟一个师傅学习的一个垂直越权成功的CNVD漏洞通杀&#…

【案例42】“”引发的“血案”--建表带双引号

问题现象 数据抽取工具报错。 研发排查后发现,这条语句不执行导致。转来让解决此问题。 问题分析 与研发沟通发现。是因为在user_segments 中一直有FIP_OPERATINGLOG_copy1 造成的。 询问可以直接drop掉相关表, drop table FIP_OPERATINGLOG_copy1 ; …

十一、实现逻辑层

系列文章目录:C asio网络编程-CSDN博客 1、服务器架构设计 2、单例模板类 我们的LogicSystem类为单例类,可以只把这个类写为单例,也可以写一个单例模板类,让其它类继承它就可以形成单例。这里选择第二种,因为后面可能…

Python利用openpyxl复制Excel文件且保留样式—另存为副本(附完整代码)

目录 专栏导读库的介绍库的安装前言结果预览目录结构完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

配电房动环监控系统 温湿度环境、供配电、UPS集中管控@卓振思众

在现代电力网络中,配电房作为供电系统的核心节点,承担着至关重要的角色。为了保障电力供应的稳定性与可靠性,配电房的管理与监控显得尤为重要。随着技术的不断进步,【卓振思众】智能的配电房动环监控系统应运而生,成为…

# Spring Cloud Alibaba Nacos_配置中心与服务发现(四)

Spring Cloud Alibaba Nacos_配置中心与服务发现(四) 一、Nacos 配置管理-集群部署 1、 把 nacos 应用程序包,复制3份,分别命名为 nacos1, nacos2, nacos3 分别在 conf 目录下,修改 application.properties 配置文件…

【大模型LLMs】LLMs-based Summarization研究进展梳理

【大模型LLMs】LLMs-based Summarization方法梳理 Survey1 Knowledge Distillation from LLMsRefereeInheritSumm 2 Prompt Engineering2.1 Template EngineeringOdSum 2.2 CoTSumCoTCoDSuReSliSumRefiner 梳理基于大模型的摘要总结方案,持续汇总中(更关…

数据埋点系列 9|数据伦理与隐私-在合规与创新间寻找平衡

在数据驱动决策的时代,数据伦理和隐私保护已成为至关重要的议题。组织必须在利用数据创新和保护用户隐私之间找到平衡。本文将探讨数据伦理的核心原则、隐私保护的技术实现,以及如何在合规和创新之间取得平衡。 目录 1. 数据伦理的核心原则1.1 透明度1…

【机器学习】卷积神经网络简介

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 卷积神经网络简介1. 引言2. CNN的基本概念2.1 什么是卷积神经网络2.2 CNN与传统…

uniprot数据库转换ID功能

1.登入uniprot数据库 uniprot 2. 选择ID mapping,输入P31946和P62258等uniprot数据库中的蛋白质ID 然后在To database选项中选择:sequence databases---RefSeq Protein---map 显示已完成,点击ID MAPPING 下方的网址,则可以看到uni…