0

0

RISC-V SiFive U54内核——中断和异常详解

嵌入式Linux充电站

嵌入式Linux充电站

发布时间:2023-08-01 15:36:13

|

1660人浏览过

|

来源于嵌入式Linux充电站

转载

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

拍我AI
拍我AI

AI视频生成平台PixVerse的国内版本

下载
  • 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 的值。此时,控制权交给软件。中断控制和状态寄存器 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)。

RISC-V SiFive U54内核——中断和异常详解
  • mnscratch CSR 拥有一个 64 位读写寄存器,它使 NMI 陷阱处理程序能够保存和恢复被中断的上下文。
  • mnepc CSR 是一个 64 位读写寄存器,在进入 NMI 陷阱处理程序时,它保存接受中断的指令的 PC。mnepc 的最低位硬连线为零。
  • mncause CSR 包含 NMI 的原因,第 63 位设置为 1,并且 NMI 原因编码在最低有效位中,如果不支持 NMI 原因,则为零。mncause 的低位,定义为 exception_code,如下:
RISC-V SiFive U54内核——中断和异常详解
  • 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 处理程序中的陷阱只有在处理程序正在服务发生在机器模式之外的中断时发生时才能恢复。

相关文章

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

16

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

23

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

75

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

95

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

218

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

420

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

168

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

222

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

33

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ReactJS中文基础视频教程
ReactJS中文基础视频教程

共14课时 | 3.1万人学习

React.JS中文基础视频教程
React.JS中文基础视频教程

共14课时 | 3.1万人学习

React 基础精讲视频教程
React 基础精讲视频教程

共14课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号