一文解析RISC-V SiFive U54内核——中断和异常

中断

U54内核支持M模式和S模式中断。默认情况下,所有中断都在M模式下处理 。对于支持S模式的 hart,可以有选择地将中断委托给S模式。

U54中断架构如下:

U54内核还支持两种类型的 RISC-V 中断:本地 和全局 。

本地中断 :U54内核的本地中断只有2种,软件中断和定时器中断,这两个中断都由本地中断器(CLINT)生成 。本地中断通过专用中断异常代码和固定优先级直接发送给单个 hart。因此,本地中断没有仲裁,也不需要额外的内存访问来确定中断的原因。

全局中断 :通过平台级中断控制器 (PLIC ) 路由,该控制器可以通过外部中断将中断定向到系统中的任何 hart。所有的外设都属于全局中断。

 

中断优先级

全局中断的各个优先级由 PLIC 确定。

U54内核的优先级如下,按优先级降序排列:

  • 机器外部中断
  • 机器软件中断
  • 机器定时器中断
  • 主管外部中断
  • 主管软件中断
  • 主管定时器中断

异常

如果一个 hart 在S模式下运行并尝试访问一个仅M模式的控制和状态寄存器 (CSR),这会立即进入异常处理程序并确定下一步行动。mstatus 寄存器中的异常代码将保持值 0x2,表明发生了非法指令异常。根据系统的要求,监督模式应用程序可能会报告错误和/或完全终止程序。

没有特定的启用位来允许发生异常,因为默认情况下它们总是启用的。然而,在引导流程的早期,软件应该将 mtvec.BASE 设置为一个定义的值,其中包含默认异常处理程序的基地址。所有异常都会捕获 tomtvec.BASE。软件必须读取 mcause CSR 以确定异常的来源,并采取适当的措施。

在中断处理程序中发生的同步异常将立即导致程序执行中止中断处理程序并进入异常处理程序。中断处理程序中的异常通常是软件错误的结果,通常应该避免,因为 mepc 和 mcause CSR 将被原始中断上下文中捕获的值覆盖。

RISC-V 定义的同步异常具有优先级顺序,当单个指令同时发生多个异常时,可能需要考虑优先级顺序。下表描述了同步异常优先级顺序。

数据地址断点(watchpoints)、指令地址断点、环境断点异常(EBREAK)都具有相同的异常码(3),但优先级不同,如上表所示。

指令地址未对齐异常 (0x0) 的优先级低于其他指令地址异常,因为它们是目标未对齐的控制流指令的结果,而不是取指的结果。

下面描述了一些用于调试异常和中断的有用 CSR:

陷阱trap

术语陷阱描述了软件应用程序中的控制转移,其中陷阱处理通常在更特权的环境中执行。例如,一个特定的 hart 包含三种权限模式:机器、管理员和用户。每种特权模式都有自己的软件执行环境,包括专用的堆栈区域。此外,每种特权模式都包含用于陷阱处理的单独控制和状态寄存器 (CSR)。在用户模式下操作时,需要上下文切换来处理主管模式下的事件。软件为上下文切换设置系统,然后执行 ECALL 指令,将控制同步切换到 Environment call-from-User 模式异常处理程序。

复位后的默认模式是机器模式 。软件以最高权限级别开始执行,这允许在任何权限级别更改之前初始化所有 CSR 和系统资源。下面的步骤描述了将特权模式从机器模式更改为用户模式所需的步骤,在特定设计上也包括管理员模式。

  1. 应首先通过将 mstatus.MIE 写入 0(默认复位值)来全局禁用中断。
  2. 将机器模式异常处理程序的基地址写入 mtvec CSR。这是任何引导流程中的必需步骤。
  3. 将 mstatus.MPP 写入 0 以将之前的模式设置为 User,这允许我们返回到该模式。
  4. 设置物理内存保护 (PMP) 区域以将所需区域授予用户和主管模式,并可选择从机器模式撤消权限。
  5. 用主管模式异常处理程序的基地址写入 stvec CSR。
  6. 编写 medeleg 寄存器,将异常委托给主管模式。考虑 ECALL 和页面错误异常。
  7. 编写 mstatus.FS 以启用浮点(如果支持)。
  8. 将机器模式用户寄存器存储到堆栈或应用程序特定的帧指针。
  9. 用用户态软件的入口点编写mepc
  10. 执行mret指令进入用户模式。

Note:只有一组用户寄存器 (x1 - x31) 用于所有权限级别,因此应用软件负责在进入和退出不同级别时保存和恢复状态。

本地中断

软件中断(中断 ID #3) :通过写入特定 hart 的内存映射中断挂起寄存器 msip 来触发。

定时器中断 :当寄存器 mtime 大于或等于寄存器 mtimecmp 并且两个寄存器都是 CLINT 内存映射的一部分时,会触发定时器中断(中断 ID #7)。mtime 和 mtimecmp 寄存器通常仅在机器模式下可用,除非 PMP 授予用户或管理员模式访问它们所在的内存映射区域的权限。

全局中断通常首先路由到 PLIC,然后使用外部中断进入 hart(中断 ID #11)

中断操作

在特权模式 m 内,如果相关的全局中断使能 {ie} 清零,则在该特权模式下不会产生任何中断,但更高特权模式下的待决启用中断将抢占当前执行。如果设置了 {ie},则在相同特权模式下处于更高中断级别的挂起启用中断将抢占当前执行并运行更高中断级别的中断处理程序。

当发生中断或同步异常时,会修改特权模式以反映新的特权模式。处理程序特权模式的全局中断使能位被清除

中断进入和退出

当中断发生时:

• mstatus.MIE 的值被复制到mcause.MPIE 中,然后mstatus.MIE 被清除,有效地禁用了中断。

• 中断前的特权模式在mstatus.MPP 中编码。

• 当前 pc 被复制到 mepc 寄存器中,然后将 pc 设置为 mtvec 指定的值

此时,控制权移交给中断处理程序中的软件,并禁用中断。执行 mret 指令时,会发生以下情况:

• 特权模式设置为在 mstatus.MPP 中编码的值。

• 全局中断使能 mstatus.MIE 设置为 mcause.MPIE 的值。

• pc 设置为mepc 的值。

此时,控制权交给软件。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

中断控制和状态寄存器

Machine Status Register (mstatus)

mstatus 寄存器跟踪并控制 hart 的当前操作状态,包括是否启用中断。

通过设置 mstatus 中的 MIE 位来启用中断。在写入 mstatus.MIE=1 之前,建议先在 mie 中开启中断。

Machine Trap Vector (mtvec)

mtvec 寄存器有两个主要功能:定义陷阱向量的基地址,以及设置 U54内核处理中断的模式。对于 Direct 和 Vectored 模式,中断处理模式在 mtvec 寄存器的 MODE 字段中定义。mtvec 寄存器在表 86 中描述,mtvec.MODE 字段在表 87 中描述。

Mode Direct

在直接模式下操作时,所有中断和异常都会捕获到 mtvec.BASE 地址。在陷阱处理程序内部,软件必须读取 mcause 寄存器以确定触发陷阱的原因。

在直接模式下操作时,BASE 必须是 4 字节对齐的。

Mode Vectored

在向量模式下运行时,中断将 pc 设置为 mtvec.BASE + 4 × 异常代码(mcause.EXCCODE)。例如,如果发生机器定时器中断,则将 pc 设置为 mtvec.BASE + 0x1C。通常,陷阱向量表填充有跳转指令,以将控制转移到特定于中断的陷阱处理程序。

在向量中断模式下,BASE 必须是 256 字节对齐的。

所有机器外部中断(全局中断)都映射到异常代码 11。因此,当启用中断向量时,pc 设置为任何全局中断的地址 mtvec.BASE + 0x2C。

Machine Interrupt Enable (mie)

通过设置 mie 寄存器中的相应位来启用各个中断。

Machine Interrupt Pending (mip)

机器中断挂起 (mip) 寄存器指示当前哪些中断处于挂起状态。

特权模式中断

U54内核支持有选择地将中断和异常定向到S模式。

该功能由中断和异常委托CSR处理:mideleg和medeleg。S模式中断和异常可以通过stvec、sip、sie 和 scause 管理。

在M模式下,软件还可以直接写入SIP寄存器,从而有效地向S模式发送中断。这对于定时器和软件中断特别有用,因为可能需要在M模式和S模式下处理这些中断。

Delegation Registers (mideleg and medeleg)

默认情况下,所有的trap都在M模式下处理。M模式下软件可以通过CSR 有选择地将中断和异常委托给S模式。具体的映射如表 92 和表 93 。

注意,本地中断可以委托给M模式。

Supervisor Status Register (sstatus)

与M模式类似,S模式有一个寄存器,专门用于跟踪 hart 的当前状态,称为 sstatus。sstatus 实际上是 mstatus 的受限视图,因为对 sstatus 所做的更改反映在 mstatus 中。

通过在 sstatus 中设置 SIE 位并在 sie 寄存器中启用所需的单个中断来启用中断。

Supervisor Interrupt Enable Register (sie)

通过在 sie 寄存器中设置适当的位来启用管理员中断。

Supervisor Interrupt Pending (sip)

S模式中断挂起 (sip) 寄存器指示当前哪些中断挂起。

Supervisor Cause Register (scause)

当S模式下捕获陷阱时,将导致陷阱的事件的代码写入 cause。当导致陷阱的事件是中断时,最高有效位 scause 设置为 1,最低有效位表示中断号,使用与 sip 中的位置相同的编码。例如,S模式定时器中断导致 cause 被设置为 0x8000_0000_0000_0005。

scause 也用于指示同步异常的原因,在这种情况下,scause 的最高有效位设置为 0。有关同步异常代码的列表,请参见表 98。

Supervisor Trap Vector (stvec)

默认情况下,所有中断都会捕获到 stvec 寄存器中定义的单个地址。由中断处理程序读取原因并做出相应的反应。RISC‑V 和 U54 内核还支持选择性地启用中断向量的能力。当启用向量时,在 sie 中定义的每个中断都会陷入到它自己的特定中断处理程序中。

当 stvec 寄存器的 MODE 字段设置为 1 时,向量中断被启用。

如果向量中断被禁用 (stvec.MODE=0),所有中断都会陷入 stvec.BASE 地址。如果启用矢量中断 (stvec.MODE=1),中断将 pc 设置为 stvec.BASE + 4 × 异常代码 (scause.EXCCODE)。例如,如果发生管理定时器中断,则 pc 设置为 stvec.BASE + 0x14。通常,陷阱向量表中填充有跳转指令,以将控制转移到特定于中断的陷阱处理程序。

在向量中断模式下,BASE 必须是 128 字节对齐的。

所有主管外部中断(全局中断)都映射到异常代码 9。因此,当启用中断向量时,pc 被设置为任何全局中断的地址 stvec.BASE + 0x24。

Delegated Interrupt Handling

接受委派陷阱后,会发生以下情况:

  • sstatus.SIE 的值被复制到 sstatus.SPIE,然后 sstatus.SIE 被清除,有效地禁用中断。
  • 当前pc被复制到sepc寄存器中,然后pc被设置为stvec的值。在启用矢量中断的情况下,pc 设置为 stvec.BASE + 4 × 异常代码 (scause.EXCCODE)。
  • 中断前的特权模式编码在 sstatus.SPP 中

此时,控制权移交给中断处理程序中的软件,中断被禁用。可以通过显式设置 sstatus.SIE 或执行 SRET 指令退出处理程序来重新启用中断。执行 SRET 指令时,会发生以下情况:

  • 特权模式设置为 sstatus.SPP 中编码的值
  • status.SPIE 的值被复制到 status.SIE
  • pc 设置为 sepc 的值

此时,控制权交给了软件

中断延迟

U54内核的中断延迟为四个 external_source_for_core_N_clock 周期 ,计算方式是从向 hart 发送中断信号到处理程序的第一个指令获取所需的周期数。

通过 PLIC 路由的全局中断会导致三个时钟周期的额外延迟,其中 PLIC 由时钟计时。这意味着全局中断的总延迟(以周期为单位)为:4 + 3 × (external_source_for_core_N_clock Hz ÷ clock Hz)。这是最佳情况下的循环计数,并假定处理程序已缓存。它没有考虑来自外围源的额外延迟

不可屏蔽中断

rnmi(可恢复不可屏蔽中断)中断信号是 hart 的电平敏感输入。不可屏蔽中断比 hart 上的任何其他中断或异常具有更高的优先级,并且不能被软件禁用。具体来说,它们不会通过清除 mstatus.mie 寄存器来禁用。

Handler Addresses

NMI 有一个关联的异常陷阱处理程序地址。该地址由外部输入信号设置。

RNMI CSRs

这些 M 模式 CSR 启用可恢复非屏蔽中断 (RNMI)。

  • mnscratch CSR 拥有一个 64 位读写寄存器,它使 NMI 陷阱处理程序能够保存和恢复被中断的上下文。
  • mnepc CSR 是一个 64 位读写寄存器,在进入 NMI 陷阱处理程序时,它保存接受中断的指令的 PC。mnepc 的最低位硬连线为零。
  • mncause CSR 包含 NMI 的原因,第 63 位设置为 1,并且 NMI 原因编码在最低有效位中,如果不支持 NMI 原因,则为零。mncause 的低位,定义为 exception_code,如下:

  • mnstatus CSR 包含一个两位字段,在进入陷阱处理程序时,它包含以与 mstatus.mpp 相同的方式编码的中断上下文的特权模式

MNRET Instruction

此仅 M 模式指令使用 mnepc 和 mnstatus 中的值分别返回中断上下文的程序计数器和特权模式。该指令还设置内部 rnmie 状态位。

编码与 MRET 相同,除了第 30 位设置(即 funct7=0111000)。例如:

.word 0x70200073 // opcode for MNRET (return from RNMI)

RNMI Operation

当检测到RNMI中断时,将中断的PC写入mnepc CSR,RNMI的类型写入mncause CSR,中断上下文的特权模式写入mnstatus CSR。内部微体系结构状态位 rnmie 被清除以指示处理器处于 RNMI 处理程序中并且不能接受新的 RNMI 中断。清除时,内部 rnmie 位还会禁用所有其他中断

这些中断被称为不可屏蔽的,因为软件无法屏蔽中断。但是,为了正确操作,必须推迟同一中断的其他实例,直到处理程序完成,因此内部状态位

RNMI 处理程序可以使用 MNRET 指令(在第 7.11.3 节中描述)恢复原始执行,该指令从 mnepc 恢复 PC,从 mnstatus 恢复特权模式,并设置内部 rnmie 状态位,重新启用其他中断。

如果hart在rnmie位清零时遇到异常,则将异常状态写入mepc和mcause,mstatus.mpp设置为M-mode,hart跳转到RNMI异常处理程序地址。

RNMI 处理程序中的陷阱只有在处理程序正在服务发生在机器模式之外的中断时发生时才能恢复。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标检测算法之Fast R-CNN和Faster R-CNN原理

一、Fast R-CNN原理 在SPPNet中,实际上特征提取和区域分类两个步骤还是分离的。只是使用ROI池化层提取了每个区域的特征,在对这些区域分类时,还是使用传统的SVM作为分类器。Fast R-CNN相比SPPNet更进一步,不再使用SVM作为分类器&a…

议程更新 | Occlum Meetup 北京站--一起来聊机密计算 TEE

首届 Occlum Meetup 还有 3 天就要和大家见面啦!北京的小伙伴们,我们来喽!为了能和大家有更充足的时间交流沟通,我们小小的调整了一下议程~最新议程请见下方。本次 Meetup 是 Occlum 开源社区首次在北京线下开展&#…

yolo车牌识别、车辆识别、行人识别、车距识别源码(包含单目双目)

视频效果 车牌识别视频车辆识别视频yolov5车辆识别视频yolov5 yoloR对比行人车辆识别视频yolo车距1完整源码http://www.hedaoapp.com/goods/goodsDetails?pid4132 系统设计 车牌自动识别是以计算机视觉处理、数字图像处理、模式识别等技术为基础,对摄像机所拍摄的…

从零开始,简单几步教会你shopify店铺设计

在弄完shopify的基础配置之后,我们就开始可以设计一下我们的店铺。人都是视觉动物,很难不被好看的东西吸引,所以把店面弄得漂漂亮亮的就是我们赢得顾客信赖的第一步。接下来龙哥会详细地解析一下,shopify的店铺设计与配置要怎么展…

Elasticsearch 核心技术(八):常用 DSL 查询(全文搜索、精确匹配、布尔查询)

❤️ 博客主页:水滴技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 🌸 订阅专栏:大数据核心技术从入门到精通 文章目录一、全文搜索1.1 查询所有(match_all)1.2 全文检索&…

CS-Stdio Display Builder

Display Builder 1) 操作界面编辑器和Runtime 2)在EPICS edd/dm, medm, edm, ...想法上构建 3)与CS-Studio BOY兼容性非常好 4)大约2015年在CS-Stdio/Eclipse中开始,现在在CS-Studio/Phoebus中 5) 从209年以Web Runtime获取。…

logstash+elasticsearch+Kibana(ELK)日志收集

文章目录一.安装elasticsearch二. 安装kibana三.配置logstash四.springboot整合logstash五.spring整合Elastic Search不要一股脑执行以下语句,请观察修改要修改的地方 注意给logstash,elasticsearch,kibana释放端口,云服务器提供商和系统的端口 一.安装elasticsearch # 安装e…

【Linux】共享内存

1.共享内存的概念共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。通信的前提是让两个进程看到同一份资源,信息的…

Multisim14.3安装包下载及安装教程

[软件大小]: 888 MB [安装环境]: Win11/Win 10 [软件安装包下载]:https://pan.quark.cn/s/1c0217caf24a Multisim是美国国家仪器(NI)有限公司推出的以Windows为基础的仿真工具,适用于板级的模拟/数字电路板的设计工作 安装步骤 1.选中下载好…

自主AI能力加速企业智能化转型 | 爱分析报告

报告编委 黄勇 爱分析合伙人&首席分析师 孟晨静 爱分析分析师 外部专家(按姓氏拼音排序) 杜晨阳 力维智联 五维实验室主任 王哲 九章云极DataCanvas 雅图BU总经理 特别鸣谢(按拼音排序) 目录 1. 报告综述 2. 金融…

Java 3个常用工作流引擎

一:Java工作流框架是一种用于设计、执行和管理工作流程的技术。以下是几个常见的Java工作流框架: Activiti:Activiti是一款流行的开源Java工作流引擎,它基于BPMN 2.0标准,支持复杂的工作流程设计和管理。Activiti具有高…

Centos7 XFS(dm-0):Internal error XFS_WANT_CORRUPTED_GOTO

在k8s的道路上我们都是小白,每天启动虚机都会遇到各种各样的问题,这不 部署的k8s虚机启动发现操作系统启动异常,提示如下报错信息 XFS(dm-0):Internal error XFS_WANT_CORRUPTED_GOTO at line 1700 of file fs/xfs/l…

【周末闲谈】文心一言,模仿还是超越?

个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 周末闲谈 ✨第一周 二进制VS三进制 文章目录周末闲谈前言一、背景环境二、文心一言?(_)?三、文心一言的优势?😗😗😗四、文心一…

ADC选型关注的参数

目前,用来量化ADC动态性能的六个技术指标分别为SINAD(信号与噪声失真比),ENOB(有效位数),SNR(信噪比),THD(总谐波失真),TH…

ChatGPT原理解析

文章目录Transformer模型结构构成组件整体流程GPT预训练微调模型GPT2GPT3局限性GPT4相关论文Transformer Transformer,这是一种仅依赖于注意力机制而不使用循环或卷积的简单模型,它简单而有效,并且在性能方面表现出色。 在时序模型中&#…

GPT-4 介绍

1 简介 本文根据openAI的2023年3月的《GPT-4 Technical Report 》翻译总结的。 原文地址:https://arxiv.org/pdf/2303.08774.pdf 原文确实没有GPT-4 具体的模型结构,openAI向盈利组织、非公开方向发展了。也没透露硬件、训练成本、训练数据、训练方法等…

原生获取DOM节点

目录 一、通过document顶层方法获取 1、获取html标签 2、获取head标签 3、获取body标签 二、getElementBy系列获取 1、ID获取 2、类名获取 3、name属性获取 4、标签名获取 三、query系列获取 1、通过query选择器获取一个元素 2、通过querry选择器获取一组元素 四、通过…

特斯拉的操作系统是用什么语言编写的?

总目录链接>> AutoSAR入门和实战系列总目录 文章目录特斯拉车辆操作系统特斯拉GitHub中使用的语言Ruby和GoPythonSwift 和 Objective CQt我们知道操作系统至少需要一些非常低级的代码,这些代码在系统首次启动时运行,必须使用接近硬件的语言编写。…

如何使用python删除一个文件?好用到上头.....

人生苦短,我用python 若想利用python删除windows里的文件, 这里需要使用os模块 那接下来就看看利用os模块是如何删除文件的吧~ 具体实现方法如下! 更多学习资料:点击此处跳转文末名片获取 os.remove(path) 删除文件 path. 如果path是一…

硬件语言Verilog HDL牛客刷题day02 组合逻辑部分

1.VL11 4位数值比较器电路 1.题目: 某4位数值比较器的功能表如下。请用Verilog语言采用门级描述方式,实现此4位数值比较器。 2.解题代码: timescale 1ns/1nsmodule comparator_4(input [3:0] A ,input [3:0] B ,output …