当前位置: 首页 > news >正文

RISC-V AIA学习2---IMSIC

我在学习文档这章时,对技术术语不太理解,所以用比较恰当的比喻来让自己更好的理解。

比较通俗的理解:

将 RISC-V 系统比作一个工厂:

  • hart 工厂的一条独立生产线
  • IMSIC 每条生产线配备的「订单接收员」
  • MSI 中断 客户通过电子邮件(内存写入)发送的加急订单

1. IMSIC 的角色定位

  • 专属服务:每条生产线(hart)都有自己的订单接收员(IMSIC),负责处理专属订单
  • 订单类型:只接收 MSI 订单(通过特定内存地址写入触发的中断)
  • 订单处理:
    1. 接收订单(内存写入操作)
    2. 记录订单状态(pending 位)
    3. 检查订单是否被允许接收(enable 位)
    4. 通知生产线处理订单(触发中断)

2. 硬件接口

  • 内存映射寄存器:相当于「订单信箱」
    • 客户(设备)通过写入特定内存地址发送订单
    • 每个 IMSIC 可能有多个信箱(地址)
  • CSR 寄存器:相当于「控制台界面」
    • 生产线操作员(软件)通过 CSR 配置接收规则
    • 例如:设置哪些订单可以接收(enable 位)、查看待处理订单(pending 位)

3. 典型工作流程

  1. 设备发送订单:
    • 向特定内存地址(如 0x1000)写入数据(如 0x05)
    • 这表示:给生产线 0 的 S 模式发送 ID=5 的中断
  2. IMSIC 处理:
    • 检查该内存地址是否属于自己的信箱
    • 在 S 模式的中断文件中找到 ID=5 的格子,标记为待处理(pending=1)
    • 检查该 ID 是否被允许接收(enable=1)
  3. 通知 hart:
    • 如果 pending 和 enable 都为 1,触发 S 模式中断
    • hart 暂停当前任务,跳转到中断处理程序

4. 为什么选择 IMSIC?

  • 精准控制:每个中断可以精确指定目标 hart 和特权级别
  • 高效处理:内存写入比物理线路更快,适合高并发场景
  • 灵活扩展:通过软件配置即可新增中断类型,无需硬件改动

一、 Interrupt files and interrupt identities

工厂里有不同级别的管理人员,对应 RISC - V 里的不同特权等级。

比如有最高管理层(M 模式)、普通管理层(S 模式),如果工厂还设有虚拟分厂(对应实现了 hypervisor extension),就还有虚拟分厂的管理层(VS 模式)。

每个任务接收员(IMSIC)都有不同的任务清单(interrupt file),分别对应不同级别的管理人员。

如果生产线只支持最高管理层(仅 M 模式),任务接收员就只有一份最高管理层的任务清单;

如果支持普通管理层(S 模式),就会有最高管理层和普通管理层两份任务清单;

要是还设立了虚拟分厂(H 模式),除了前面两份清单,还会有虚拟分厂的任务清单(guest interrupt file)。

每个任务清单(interrupt file)由两个数组组成。

一个是待处理任务记录数组(interrupt pending array),标记着已经收到但还没处理的任务;

另一个是允许接收任务数组(interrupt enable array),决定了生产线愿意接收哪些任务。

外部中断就像是从工厂外部来的任务,需要有明确的标识。

主要标识(major identity)就像是任务的大分类,比如最高管理层任务(M 模式下外部中断,major identity 为 11)、普通管理层任务(S 模式下外部中断,major identity 为 9)等;

次要标识(minor identity)就是任务编号(interrupt ID),主次标识结合起来,就能准确表示某一个具体的外部中断,就像知道是最高管理层收到的关于某个具体设备(如串口)的任务。

主次标识组合

  • 主标识(Major Identity):部门编号(M=11,S=9,VS=10)
  • 次标识(Minor Identity):订单编号(1-2047)
  • 示例:M级+订单5 表示最高管理层的第 5 类紧急订单

编号规则

  • 同一部门内,订单编号越小优先级越高(如订单 1 比订单 2 紧急)
  • 不同部门的订单编号独立(M 级订单 5 和 S 级订单 5 是不同类型)

中断文件的配置灵活性

1. 大小限制

  • 最小:63 个订单(1 个寄存器)
  • 最大:2047 个订单(64 个寄存器)
  • 示例:
    M 级账本可能支持 2047 个订单,S 级支持 1023 个,VS 级支持 511 个

2. 跨生产线差异

  • 不同生产线(hart)的账本大小可不同
    • 生产线 0 的 M 级账本支持 2047 个订单
    • 生产线 1 的 M 级账本可能只支持 1023 个

3. 虚拟分厂限制

  • 同一生产线的所有虚拟分厂(VS 级)账本大小必须相同
    • 生产线 0 的所有 VS 级账本均支持 511 个订单

配置建议

  • 权限控制:只有最高管理层(M 级)有权修改账本数量和大小
  • 避免冲突:软件可重复使用相同订单编号(如 M 级订单 5 和 S 级订单 5 独立)

二、MSI 编码规则

1. 标准化格式

  • 地址限制:只能发送到工厂的低区(低 4GB 内存)
    • 类似:国际邮件只能寄到某个国家的特定区域
  • 数据限制:订单编号用 16 位数字(高位补零)
    • 类似:快递单号只能用 16 位,多余位数自动忽略

2. 地址的作用

  • 目标 hart:工厂区号(如 0 号区代表生产线 0)
  • 特权级别:楼层编号(M 层 = 11 楼,S 层 = 9 楼)
  • 虚拟 hart:虚拟分厂编号(如分厂 A、分厂 B)

3. 数据的作用

  • 中断标识:订单编号(1-2047)
    • 编号越小优先级越高(如订单 1 比订单 2 紧急)
  • 次要 ID:与特权级别(主 ID)组合唯一标识中断
    • 示例:S 层 9 楼的订单 5 主 ID=9,次 ID=5

IMSIC 处理流程

  1. 设备发送订单:
    • 向地址0x1000写入数据0x05
    • 含义:给生产线 0 的 S 层 9 楼发送订单 5
  2. 订单中心分拣:
    • IMSIC 检查地址是否属于自己的管辖范围
    • 在 S 层的中断文件中找到订单 5 的格子,标记为 “待处理”
  3. 生产线响应:
    • 若订单 5 被允许接收(enable=1),触发 S 层中断
    • 生产线暂停当前任务,处理该订单

 

虚拟化场景

  • 客户地址:虚拟分厂使用自己的地址(如分厂 A 的地址0xA000
  • 地址翻译:IOMMU 像翻译员,将虚拟地址转换为物理地址
    • 示例:0xA000 实际地址0x1000(生产线 0 的 S 层)
  • 订单隔离:虚拟分厂的订单只能投递到自己的中断文件

三、Interrupt priorities

1. 核心规则

中断优先级由中断标识号直接决定:

  • 标识号越小 优先级越高
    (类似:快递单号越小,包裹越紧急)

2. 设计逻辑

a. 软件自由分配

  • 软件可以像给快递分配单号一样,为不同中断分配标识号:
    • 紧急中断(如电源故障)分配单号 1
    • 普通中断(如磁盘读写)分配单号 100

b. 为什么不动态调整?

  • 动态优先级需要额外硬件:
    (例如:每个中断单独存储优先级值)
  • 实际需求低:
    大多数系统中,中断优先级固定即可,动态调整不常用。

c.  低标识号的优势

  • 跨系统兼容性:
    所有系统至少支持 1-63 号中断(如 1 号始终是最高优先级)
    (类似:所有快递公司都保证 1 号包裹最紧急)
  • 简化管理:
    最高优先级中断的标识号固定,无需适配不同系统。

3. 实际场景举例

场景 1:服务器中断处理

  • 高优先级中断:网络流量处理 标识号 1
  • 中优先级中断:磁盘写入完成 标识号 50
  • 低优先级中断:风扇转速调整 标识号 200

优势:

1 号中断始终优先处理,即使其他系统的中断文件支持更多标识号。

场景 2:嵌入式设备

  • 仅支持 63 个中断:
    1 号
    传感器数据采集(最高优先级)
    63 号
    日志记录(最低优先级)

4. 常见疑问解答

  1. 为什么优先级与标识号顺序相反?
    因为低标识号在所有系统中必然存在,而高标识号可能因系统而异。例如:
    • 系统 A 支持 2047 个中断,最高优先级是 1 号
    • 系统 B 仅支持 63 个中断,最高优先级还是 1 号
  2. 软件如何调整优先级?
    通过重新分配标识号实现。例如:
    • 原 1 号(高优先级)改为 100 号
    • 原 100 号改为 1 号
  3. 动态优先级是否可能?
    硬件不直接支持,但软件可通过重新分配标识号间接实现。

5. 总结比喻

中断优先级就像学校的作业等级:

  • 标识号 1 红色紧急作业(必须优先完成)
  • 标识号 100 蓝色普通作业(有空再做)
  • 软件角色:老师分配作业等级
  • 硬件保证:所有班级都保证红色作业优先

这种设计确保了关键中断的及时响应,同时允许软件灵活管理,平衡了通用性和效率。

四、中断控制器重置和状态变化

1. 重置后的状态

a. 基本规则

  • 所有账本初始化:
    停电后重新启动,所有账本(中断文件)被清空,但账本结构保持有效(表格存在但无内容)。
    • 例外:M/S 级的 eidelivery 寄存器可能保留部分配置(类似工厂总控室的紧急预案)。

b. 软件影响

  • 不可依赖默认值:
    重启后账本中的订单(中断状态)是未指定的(可能为随机值或全 0),软件必须重新配置允许接收的订单(enable 位)。
    • 示例:
      重启后,S 级账本的 enable 位可能全部为 0,需手动设置允许接收订单。

2. 特权模式启用时的状态

a.  S 模式启用

  • 场景:工厂新增普通管理层(S 级),原关闭状态开启。
  • 状态变化:
    • S 级账本被初始化(表格存在但无内容)。
    • 原有 M 级账本状态不受影响。

b.  H 模式启用

  • 场景:工厂新增虚拟分厂(VS 级),原关闭状态开启。
  • 状态变化:
    • 所有虚拟分厂的账本(guest interrupt files)被初始化。
    • M/S 级账本状态不受影响。

IMSIC 重置与模式启用类似于工厂管理调整:

  1. 工厂停电重启 → 所有订单记录清空,但部门结构保留(需重新接收订单)。
  2. 新增普通管理层 → 该部门的账本重建,旧订单不保留。
  3. 新增虚拟分厂 → 虚拟分厂的账本全部重建,与物理工厂无关。

这种设计确保系统在模式切换或故障恢复时,状态清晰可控,避免历史配置引发的问题。

五、Memory region for an interrupt file

1.核心概念类比

  • IMSIC:快递处理中心
  • 中断文件:快递分类账本(按部门 / 虚拟分厂)
  • 内存区域:快递柜(每个中断文件一个柜子)

2. 快递柜结构

  • 地址范围:每个柜子占 4 层(4KB),每层 32 个格子(32 位)

  • 寄存器布局

    位置功能说明
    0 层小端模式写口(le)接收小端格式的快递单号(如 1→01 00 00 00)
    1 层大端模式写口(be)接收大端格式的快递单号(如 1→00 00 00 01)
    2-3 层保留区(只读 0)未使用,不能存放快递
  • 关键规则

    • 只能从每层的整格存取快递(自然对齐 32 位)
    • 其他操作(如存取半格、非对齐格)会被拒收或报错

3. 快递单号处理

a. 有效单号写入
  • 小端系统
    写单号 5 → 底层格子显示 05 00 00 00 → 对应中断 ID=5 标记为待处理
  • 大端系统
    写单号 5 → 底层格子显示 00 00 00 05 → 对应中断 ID=5 标记为待处理
b. 无效单号处理
  • 单号 0 或超过 2047 → 快递被拒收(忽略写入)
  • 格式错误(如大端系统写入小端格式)→ 快递被拒收

4. 读写行为

  • 读取操作
    无论从哪个格子读取,都返回空(0)
  • 写入延迟
    • 快递员(设备)放入柜子后,系统最终会处理,但可能有延迟
    • 若 hart 自己写入自己的柜子,可能观察到延迟(如写完单号后,pending 位过一会儿才生效)

5. 订单顺序保证

  • 全局顺序
    多个快递按写入顺序处理(如先写 ID=5,再写 ID=3 → 先处理 ID=5)
  • 内存序保证
    类似快递员必须按顺序发货,确保前一个订单完成后,后一个订单才被处理

6. 兼容性设计

  • 大小端支持
    不同地区的快递员可按自己的格式(大端 / 小端)写入,系统自动识别
  • 扩展预留
    4 层柜子为未来新增功能预留空间(如增加更多写口)

7. 常见疑问解答

  1. 为什么需要两个写口?
    支持不同地区的快递员(设备)按自己的格式发送订单(如小端设备用 le 口,大端设备用 be 口)。

  2. 保留区为什么不能用?
    防止软件误操作破坏系统,确保中断处理的稳定性。

  3. 写入后立即生效吗?
    不一定,但最终会生效。系统保证顺序,但可能因内存延迟导致时间差。

8. 总结比喻

中断文件内存区域就像智能快递柜

  1. 每个部门 / 虚拟分厂有专属柜子(中断文件)
  2. 快递员(设备)通过指定口写入单号(MSI 地址 + 数据)
  3. 系统按顺序处理快递(中断),确保先到先得
  4. 保留区和错误处理机制保证系统安全稳定

这种设计既满足硬件兼容性,又通过标准化结构简化了软件配置,适合现代多核系统的中断管理需求。

六、Arrangement of the memory regions of multiple interrupt files中断文件内存区域布局

1. 核心概念类比

  • 地址空间:整栋公寓楼(物理内存)
  • hart:每个公寓单元(独立处理器核心)
  • 中断文件:单元内的信箱(按楼层分类)
  • 组划分:不同单元楼(如不同芯片或模块)

2. 地址布局规则

a. 分层管理
  • 机器级信箱(M 层):位于公寓楼的特定区域(如 1-10 层)
    • 所有 hart 的 M 层信箱集中管理,方便最高权限(物业)统一维护。
  • 监督级信箱(S 层):位于另一区域(如 11-20 层)
    • 操作系统(住户)可通过一个权限设置(PMP 表项)访问所有 S 层信箱。
  • 来宾信箱(VS 层):与 S 层连续排列(如 S 层之后的楼层)
    • 每个虚拟住户(虚拟机)的信箱按编号顺序排列(如 S 层→VS1→VS2→…)。
b. 地址计算公式
  • 机器级地址
    地址 = A + hart编号 × 4KB
    • A:M 层起始地址(如公寓 1 层)
    • hart 编号:单元号(如单元 0→地址 0x1000,单元 1→地址 0x2000)
  • 监督级地址
    地址 = B + hart编号 × 4KB
    • B:S 层起始地址(如公寓 11 层)

3. 组划分场景
  • 跨楼单元
    不同单元楼(如 A 栋、B 栋)的地址空间独立:
    • 机器级地址:组号 × 大跨度 + A + hart编号 × 4KB
    • 监督级地址:组号 × 大跨度 + B + hart编号 × 4KB
    • 大跨度:楼间距(如 A 栋起始地址 0x100000,B 栋 0x200000)

4. 设计目的

a.  权限管理简化
  • PMP 表项
    操作系统只需设置一个权限规则,即可允许访问所有 S 层和 VS 层信箱(因为它们集中在连续区域)。
    • 类比:住户只需一把钥匙,即可打开所有 S 层邮箱。
b. 扩展性与兼容性
  • 地址对齐
    基地址(A/B)按大跨度对齐(如 4KB、更大的 2^C),确保未来扩展时地址不会冲突。
    • 类比:预留足够的楼层空间,方便未来增加新信箱。
c.  多组支持
  • 跨楼访问
    不同组(楼)的地址空间独立,避免干扰。
    • 类比:A 栋住户无法误操作 B 栋的信箱。

5. 示例说明

场景 1:单组 4 个 hart
  • M 层地址
    hart0 → 0x1000
    hart1 → 0x2000
    hart2 → 0x3000
    hart3 → 0x4000
  • S 层地址
    hart0 → 0x11000
    hart1 → 0x12000
    ...
场景 2:两组(楼)
  • 组 0(A 栋)
    M 层起始地址 0x100000
    S 层起始地址 0x200000
  • 组 1(B 栋)
    M 层起始地址 0x300000
    S 层起始地址 0x400000

地址空间布局就像智能公寓管理系统

  1. 分层管理:不同权限的信箱(M/S/VS)分布在不同楼层,便于权限控制。
  2. 地址公式:每个 hart 的信箱地址按单元号和楼层规则自动生成。
  3. 组划分:不同楼的地址空间独立,支持跨楼扩展而不冲突。

这种设计既简化了系统管理,又保证了安全性和扩展性,特别适合现代多核和虚拟化环境。

七、IMSIC 相关 CSR 

软件主要通过第 2 章中介绍的控制状态寄存器(CSR)来访问处理器核心(hart)的传入消息信号中断控制器(IMSIC)

1. 核心概念类比

  • IMSIC:电视台的信号接收中心
  • 特权级别:不同电视频道(M/S/VS)
  • CSR 寄存器:控制遥控器(*iselect)和当前频道显示(*ireg)

2. CSR 寄存器的作用

*a. 遥控器(iselect)
  • 功能:选择要操作的 “电视频道”(寄存器)
  • 取值范围
    • 0x70-0xFF:外部中断相关寄存器(如 eip/eie/eidelivery)
    • 0x30-0x3F:中断优先级设置
  • 特权级别对应
    • miselect:M 级遥控器
    • siselect:S 级遥控器
    • vsiselect:VS 级遥控器(需虚拟化支持)

*b. 当前频道显示(ireg)
  • 功能:显示或修改当前选中的寄存器内容
  • 示例
    • 遥控器选0x80 → 当前显示 eip0 寄存器(中断 ID 1-31 的 pending 位)

3. 关键寄存器说明

a. eip 数组(中断待处理位)
  • 寄存器范围eip0(0x80)到eip63(0xBF)
  • 作用:记录中断是否已到达但未处理(1 = 待处理,0 = 已处理)
  • 类比:电视节目录制状态(红点标记录制中)
b. eie 数组(中断使能位)
  • 寄存器范围eie0(0xC0)到eie63(0xFF)
  • 作用:控制是否接收特定中断(1 = 允许,0 = 禁止)
  • 类比:家长控制功能(允许 / 禁止特定频道)
c. eidelivery(中断传递配置)
  • 地址0x70
  • 作用:设置中断传递模式(如电平触发 / 边沿触发)
  • 类比:电视信号传输方式(高清 / 标清)
d. eithreshold(中断阈值)
  • 地址0x72
  • 作用:设置触发中断的最低优先级
  • 类比:音量阈值(低于阈值不播放)

4. 访问规则

a. 有效范围
  • eip/eie0x80-0xBF(eip0-63)和0xC0-0xFF(eie0-63)
  • 保留地址0x710x73-0x7F → 从对应的ireg(mireg sireg vsireg)读取返回 0,写入忽略
b. 特权级别隔离
  • M 级遥控器:只能操作 M 级寄存器(如miselect0x80 → 访问 M 级 eip0)
  • S 级遥控器:只能操作 S 级寄存器(如siselect0x80 → 访问 S 级 eip0)
c. 虚拟化支持
  • VS 级遥控器:通过hstatus.VGEIN选择目标虚拟分厂的中断文件
  • 示例VGEIN=2 → vsiselect0x80 → 访问虚拟分厂 2 的 eip0

5. 典型操作流程

  1. 设置中断使能
    • siselect=0xC0(eie0) → sireg写入0x00000001 → 允许 S 级中断 ID=1
  2. 触发中断
    • 设备向0x1000写入0x01 → S 级 eip0 的 bit1 置 1
  3. 处理中断
    • stopi查询最高优先级中断 → 发现 ID=1 → 执行中断服务程序

CSR 寄存器就像智能电视遥控器

  1. 遥控器(*iselect):选择要操作的频道(寄存器)
  2. 屏幕显示(*ireg):显示或修改当前频道内容(寄存器值)
  3. 频道分类
    • M 级频道:处理硬件紧急中断(如电源故障)
    • S 级频道:处理操作系统中断(如磁盘读写)
    • VS 级频道:处理虚拟机中断(如虚拟网卡请求)

这种设计让软件能够灵活管理中断,同时通过分层控制提高系统安全性和可扩展性。

八、间接访问中断文件寄存器

本节描述了中断文件的寄存器,这些寄存器是通过iselect 控制状态寄存器(miselect、siselect 或 vsiselect)及其对应的ireg 控制状态寄存器(mireg、sireg 或 vsireg)间接访问的。这些间接访问的宽度始终为当前的 XLEN,对于 RV32 代码来说是 32 位,对于 RV64 代码来说是 64 位。

1.关键寄存器功能

a. 中断传递开关(eidelivery)

eidelivery是一个写时即读锁定(WARL)寄存器。它的主要作用是控制从当前中断文件产生的中断是否会从传入消息信号中断控制器(IMSIC)传递到与之相连的处理器核心(hart),从而使这些中断在 hart 的机器中断挂起寄存器(mip)或虚拟机通用外部中断挂起寄存器(hgeip)中显示为待处理的外部中断。此外,该寄存器还可以选择性地支持将平台级中断控制器(PLIC)或高级平台级中断控制器(APLIC)产生的中断直接传递给相连的 hart。

  • 作用:控制中断是否从 IMSIC 传递到 hart
  • 档位说明
    • 0:关闭(无论中断文件里有什么中断产生,都不会传递到 hart)
    • 1:开启(中断文件产生的中断会正常传递到 hart,在miphgeip中显示为待处理状态)
    • 0x40000000:备用(当eidelivery支持这个值时,系统中的特定 PLIC 或 APLIC 可以作为与当前中断文件处于相同特权级别的备用外部中断控制器。当该寄存器的值为 0x40000000 时,中断文件的功能就如同eidelivery的值为 0 一样,不再起作用,而是由 PLIC 或 APLIC 来为 hart 提供该特权级别的待处理外部中断。guest中断文件不支持eidelivery的值为 0x40000000。这意味着在guest中断的场景下,不能使用 PLIC 或 APLIC 作为替代的外部中断控制器)
  • 复位默认:优先使用备用模式(若支持),否则随机开启 / 关闭

b. 中断阈值过滤器(eithreshold)

eithreshold 是一个WLRL(Write-Only Read-Latch)寄存器,用于设置中断触发的优先级阈值。它决定了只有中断标识号(Interrupt Identity Number)小于当前阈值的中断才会被传递到 hart(处理器核)。

  • 作用:设置最低优先级(最高中断 ID)的中断才会被传递
  • 示例
    • 阈值设为 100 → 仅 ID≤100 的中断会被传递(ID>100 的即使使能也无效)

应用场景

  • 简化中断管理:通过设置阈值,可快速屏蔽高编号的中断(如外设中断),无需逐个修改 eie 寄存器。
  • 实时系统:在需要优先处理低编号中断(如定时器、紧急故障)的场景中,通过阈值实现优先级过滤。

c. 中断待处理表(eip 数组)
  • 结构
    • 32 位系统:每个 eipk 管理 32 个中断(如 eip0 管 ID1-31,eip1 管 ID32-63)
    • 64 位系统:每个 eipk 管理 64 个中断(奇數寄存器不存在,eip0 管 ID1-63,eip2 管 ID64-127)
  • 读写规则
    • 未实现的中断位始终为 0(例如,若系统仅支持 0~63 号中断,则eip0的所有位有效,而eip2的所有位均为 0,除非中断扩展到 64~127 号)
       
    • 若通过*iselect CSR 选择奇数编号的寄存器(如0x810x83等),访问*ireg CSR 会触发非法指令异常

d. 中断使能表(eie 数组)
  • 结构:与 eip 数组对应,控制是否允许中断传递
  • 示例
    • eie0.bit1=1 → 允许 ID=1 的中断

典型操作流程

  1. 开启中断传递
    • miselect=0x70 → mireg=1(eidelivery=1)
  2. 设置阈值
    • miselect=0x72 → mireg=100(eithreshold=100)
  3. 使能中断
    • miselect=0xC0 → mireg=0x00000001(eie0.bit0=1)
  4. 触发中断
    • 设备写入0x1000(eip0.bit0=1) → hart 处理 ID=1 的中断

间接访问寄存器就像智能交通控制系统

  1. eidelivery:总开关,控制是否使用 IMSIC 或传统交通灯
  2. eithreshold:过滤器,只允许高优先级中断通行
  3. eip/eie 数组:实时监控和控制每个路口的交通状态
  4. 地址分组:不同区域的交通系统独立管理,提高效率和安全性

这种设计让中断管理更灵活高效,同时兼容传统系统,适合现代多核和虚拟化环境的需求。

九、Top external interrupt CSRs(mtopei stopei vstopei)

1. 中断处理的三个 "管家"(CSR 寄存器)

  • mtopei:专门管理机器级别的中断(最底层的硬件中断)
  • stopei:管理系统级中断(如果开启了系统模式)
  • vstopei:管理虚拟机级中断(如果开启了虚拟化功能,且当前处于某个虚拟机环境)

2. 它们的作用
这些寄存器就像中断的 "调度员",会告诉 CPU:

  • 当前哪个中断最紧急(优先级最高)
  • 这个中断是否已经被处理(是否挂起)
  • 是否允许处理这个中断(是否使能)

3. 如何判断中断是否存在?
当读取这些寄存器时:

  • 如果返回 0,说明两种情况:
    a. 没有正在等待处理的中断(挂起且使能)
    b. 或者设置了优先级阈值(eithreshold),但没有符合条件的中断
  • 如果返回非零,格式如下:
    高位(26-16 位):中断编号(越小优先级越高)
    低位(10-0 位):优先级(和编号相同,这里是冗余设计)

4. 如何处理中断?
正确的做法是:

  1. 读取寄存器(得到当前最高优先级中断编号)
  2. 立即清除该中断的挂起状态(防止重复触发)

5. 为什么必须同时读写?
如果分开操作(先读再写):

  • 可能在两次操作之间出现更高优先级的新中断
  • 导致第二次写操作会错误地清除新中断,而不是之前读到的那个
  • 结果就是原来的中断被漏掉,永远无法处理

6. 如何安全操作?
推荐使用原子指令:

  • csrrw:同时完成读和写(自动清除读到的中断)
  • 其他原子指令(csrrs/csrrc)也可以,但要注意操作方式

7. 如果必须分开操作怎么办?
使用另外两个寄存器:

  • *siselect:选择要操作的中断组
  • *sireg:直接清除对应的中断位
    这种方式可以避免中间出现新中断的问题

总结:
这些寄存器就像智能的中断调度员,会自动帮你找到当前最紧急的中断。但操作时必须注意:

  • 必须同时完成读取和清除操作(用原子指令)
  • 分开操作会导致中断丢失
  • 特殊情况需要分开操作时,要用专用寄存器处理

举个例子:
就像医院的分诊台,mtopei/stopei/vstopei 相当于护士站的叫号系统。护士会告诉你当前最紧急的病人(最高优先级中断),你必须立即处理这个病人并标记已处理。如果先问护士得到病人 A,然后去处理时,中间来了更紧急的病人 B,这时如果直接去标记已处理,可能错误地标记了 B,导致 A 永远没被处理。正确的做法是护士在告诉你 A 的同时,自动把 A 的状态标记为已处理。

十、Interrupt delivery and handling

1. 每个中断文件都有个总开关(eidelivery 寄存器):

  • 开关关闭(0):无论有没有中断请求,信号灯都不亮
  • 开关打开(1):只有满足以下条件时信号灯才会亮:
    a. 中断处于待处理状态(eip=1)
    b. 中断已被使能(eie=1)
    c. 中断优先级足够高(ID < eithreshold,如果设置了门槛)

2. 中断处理的标准流程
当 CPU 收到中断信号时,会按以下步骤处理:

中断标识(Interrupt identity)存放在读取值的第 26 位到第 16 位。当执行i = i >> 16时,就相当于把读取值整体向右移动 16 位,从而提取出了中断标识。

相关文章:

RISC-V AIA学习2---IMSIC

我在学习文档这章时&#xff0c;对技术术语不太理解&#xff0c;所以用比较恰当的比喻来让自己更好的理解。 比较通俗的理解&#xff1a; 将 RISC-V 系统比作一个工厂&#xff1a; hart → 工厂的一条独立生产线IMSIC → 每条生产线配备的「订单接收员」MSI 中断 → 客户通过…...

C#基础学习(五)函数中的ref和out

1. 引言&#xff1a;为什么需要ref和out&#xff1f; ​问题背景&#xff1a;函数参数默认按值传递&#xff0c;值类型在函数内修改不影响外部变量&#xff1b;引用类型重新赋值时外部对象不变。​核心作用&#xff1a;允许函数内部修改外部变量的值&#xff0c;实现“双向传参…...

【每日算法】Day 9-1:贪心算法精讲——区间调度与最优选择(C++实现)

掌握高效决策的核心思想&#xff01;今日深入解析贪心算法的底层逻辑&#xff0c;聚焦区间调度与最优选择两大高频场景&#xff0c;结合大厂真题与严谨证明&#xff0c;彻底掌握“局部最优即全局最优”的算法哲学。 一、贪心算法核心思想 贪心算法&#xff08;Greedy Algorit…...

Netty源码—8.编解码原理二

大纲 1.读数据入口 2.拆包原理 3.ByteToMessageDecoder解码步骤 4.解码器抽象的解码过程总结 5.Netty里常见的开箱即用的解码器 6.writeAndFlush()方法的大体步骤 7.MessageToByteEncoder的编码步骤 8.unsafe.write()写队列 9.unsafe.flush()刷新写队列 10.如何把对象…...

【踩坑系列】使用httpclient调用第三方接口返回javax.net.ssl.SSLHandshakeException异常

1. 踩坑经历 最近做了个需求&#xff0c;需要调用第三方接口获取数据&#xff0c;在联调时一直失败&#xff0c;代码抛出javax.net.ssl.SSLHandshakeException异常&#xff0c; 具体错误信息如下所示&#xff1a; javax.net.ssl.SSLHandshakeException: sun.security.validat…...

双目云台摄像头全方位监控方案

双目云台摄像头是一种具有两个镜头的摄像头设备&#xff0c;通常配备云台功能&#xff0c;能够实现水平和垂直方向的旋转&#xff0c;从而提供全方位的监控视角&#xff1a; 一、工作原理与特点 工作原理 &#xff1a;双目云台摄像头利用仿生学原理&#xff0c;通过两个标定后的…...

测谎仪策略思路

来源:【东吴金工 金工专题】“高频价量相关性拥抱CTA”系列研究&#xff08;四&#xff09;&#xff1a;CPV因子期货版3.0—CPV测谎机 原创 高子剑 量化邻距离 2024年09月20日 14:37 该报告主要介绍了“高频价量相关性拥抱CTA”系列研究中CPV因子期货版的相关内容&#xff0c;…...

2025年移动端开发性能优化实践与趋势分析

启动速度优化 本质&#xff1a;缩短首次可见帧渲染时间。 方法&#xff1a; iOS&#xff1a;利用Core ML本地模型轻量化部署&#xff0c;减少云端等待。Android&#xff1a;强制启用SplashScreen API&#xff0c;通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…...

VScode-i18n-ally-Vue

参考这篇文章&#xff0c;做Vue项目的国际化配置&#xff0c;本篇文章主要解释&#xff0c;下载了i18n之后&#xff0c;该如何对Vscode进行配置 https://juejin.cn/post/7271964525998309428 i18n Ally全局配置项 Vscode中安装i18n Ally插件&#xff0c;并设置其配置项&#…...

vue vue3 走马灯Carousel

背景&#xff1a; 在项目中需要展示多张图片&#xff0c;但在页面上只有一张图片的有限位置&#xff0c;此时考虑使用轮播图实现多张图片的展示。element组件官网有走马灯Carousel的组件详细介绍。 实现效果&#xff1a; 官网链接&#xff1a;点击跳转 核心代码&#xff1a; …...

Android设计模式之Builder模式

一、定义&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 二、核心思想&#xff1a; 分离构造与表示&#xff1a;将对象的构建过程&#xff08;如参数组合、校验逻辑&#xff09;与对象本身分离。 链式调用&#xff1a;通…...

【时时三省】(C语言基础)关系运算符和关系表达式

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 在if语句中对关系表达式disc > 0进行判断。其中的“>”是一个比较符&#xff0c;用来对两个数值进行比较。在C语言中&#xff0c;比较符&#xff08;或称比较运算符&#xff09;称为关…...

运算放大器(二)运算放大器的选型与应用

1.运算放大器的工艺决定Vos和Ib 2.TI放大器的命名规律 3.TI精密放大器家族 4.精密运放的选型指南 5.高共模抑制比放大器 6.TI其他的精密放大器 7.选型时需考虑的问题 8.TI精密运放选型实例 先确定供电电压 9.确定放大器的步骤 参考&#xff1a; 注&#xff1a;本文出自对b…...

vulhub靶场jangow-01-1.0.1

启动靶机时点shift停在这个界面 点e进入编辑页面&#xff0c;把ro改成rw signie init/bin/bash Ctrlx保存&#xff0c;ip a查看网卡信息 vim /etc/network/interfaces 把enp0s17改为ens33&#xff0c;保存退出 重启靶机&#xff0c;nmap扫ip ip为192.168.93.179 nmap扫端口 扫…...

android 一步完成 aab 安装到手机

家人们谁懂&#xff01;在 Android 系统安装 aab 应用超麻烦。满心期待快速体验&#xff0c;却发现 aab 无法直装&#xff0c;得先转为 apks 格式&#xff0c;这过程复杂易错。好不容易转好&#xff0c;还得安装 apks&#xff0c;一番折腾&#xff0c;时间与耐心全耗尽。别愁&a…...

mysqlworkbench导入.sql文件

1、MySQL Workbench 新建数据库 或者 在左侧导航栏的 ​Schemas 区域右键选择 ​Create Schema...输入数据库名称&#xff08;例如 mydatabase&#xff09;&#xff0c;点击 ​Apply确认创建&#xff0c;点击 ​Finish 2、选择目标数据库 在左侧导航栏的 ​Schemas 列表中&a…...

pyqt 信号与槽

PySide6 信号与槽机制详解 引言 PySide6 是 Qt for Python 的官方绑定库&#xff0c;为 Python 提供了强大的 GUI 开发能力。其中&#xff0c;信号与槽&#xff08;Signals and Slots&#xff09; 机制是 Qt 事件处理系统的核心&#xff0c;它允许对象之间进行松耦合的通信&a…...

深入探索C++:从基础到实践

目录 引言 一、C 基础语法与特性 &#xff08;一&#xff09;命名空间&#xff08;Namespace&#xff09; 单独使用 嵌套使用 调用形式 &#xff08;二&#xff09;输入输出流&#xff08;I/O Streams&#xff09; &#xff08;三&#xff09;变量作用域 二、C 的…...

从零开始完成冒泡排序(0基础)——C语言版

文章目录 前言一、冒泡排序的基本思想二、冒泡排序的执行过程&#xff08;一&#xff09;第一轮排序&#xff08;二&#xff09;第二轮排序&#xff08;三&#xff09;第三轮排序&#xff08;四&#xff09;第四轮排序 三、冒泡排序的代码实现&#xff08;C语言&#xff09;&am…...

Echars插入的柱状图条形图,鼠标放在图上显示坐标值

只需要将axiosPointer改为cross axisPointer.type支持类型及作用&#xff1a; line&#xff1a;默认直线型指向线shadow&#xff1a;显示坐标轴方向的阴影区域cross&#xff1a;交叉线&#xff08;横向纵向双线&#xff09;none&#xff1a;不显示指向器inside&#xff1a;结合…...

机械臂如何稳稳上桌?Mujoco场景修改实操

视频讲解&#xff1a; 机械臂如何稳稳上桌&#xff1f;Mujoco场景修改实操 前面《常见机械臂模型不用找&#xff01;Mujoco这儿都有&#xff01;》中介绍的mujoco-menagerie中机械臂大多都是base_link放在地上的&#xff0c;这些场景往往和真实的场景对应不上&#xff0c;比如机…...

金融级密码管理器——抗内存扫描的密钥保险箱

目录 金融级密码管理器 —— 抗内存扫描的密钥保险箱一、模块概述与设计背景二、技术原理与设计目标2.1 关键安全原理2.2 设计目标三、系统架构设计3.1 系统架构图(Mermaid示意图)四、关键技术与安全策略4.1 密钥分割与加密存储4.2 动态内存随机化技术4.3 内存扫描检测与自动…...

如何查看 SQL Server 的兼容性级别

在 SQL Server 中&#xff0c;兼容性级别是一个非常重要的设置&#xff0c;它决定了数据库在特定版本的 SQL Server 中运行时所使用的行为和功能。不同版本的 SQL Server 可能会在 SQL 查询优化、索引、语法、错误处理等方面有差异&#xff0c;因此&#xff0c;设置正确的兼容性…...

AI for CFD入门指南(传承版)

AI for CFD入门指南 前言适用对象核心目标基础准备传承机制 AI for CFDLibtorch的介绍与使用方法PytorchAutogluon MakefileVscodeOpenFOAMParaviewGambit 前言 适用对象 新加入课题组的硕士/博士研究生对AICFD交叉领域感兴趣的本科生实习生需要快速上手组内研究工具的合作研…...

人工智能与网络安全

目录 1、人工智能的安全和安全的人工智能各有什么含义&#xff0c;如何解决 2、当人工智能技术应用于某一安全领域&#xff0c;会对该领域的攻守双方带来哪些机遇与挑战 3、ChatGPT原理 、ChatGPT的缺陷 ChatGPT的缺陷 4、人工智能与算力&#xff0c;风险挑战 应对 5、人…...

GPIO输出实验,控制LED灯

1.实验工具&#xff1a;FSMP1A开发板 核心板&#xff1a; 拓展板&#xff1a; 2.实验要求&#xff1a;编写汇编程序&#xff0c;实现三盏灯流水 程序代码&#xff1a; .text .global _start _start: 将RCC_MP_AHB4ENSET寄存器第4位设置为1&#xff0c;使能GPIO外设时钟 …...

小区团购管理设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装小区团购管理软件来发挥其高效地信息处理的作用&#xff0…...

How to use pgbench to test performance for PostgreSQL?

pgbench 是一个用于测试 PostgreSQL 数据库性能的基准测试工具。通过模拟多个客户端并发执行 SQL 查询&#xff0c;它可以帮助你评估数据库的性能。以下是使用 pgbench 的基本步骤&#xff1a; 安装 pgbench pgbench 是 PostgreSQL 的一部分&#xff0c;因此在安装 PostgreSQ…...

dbeaver连接mongodb 插入日期变成了字符串

dbeaver插入mongodb数据 日期默认使用ISODate处理&#xff0c;但是插入数据以后实际上是ISODate(2025-03-03T03:25:19.640Z)字符串 INSERT INTO xxx.aaa (_id, chatId, buddyId, pId, lastChatId, inspiration, createTime, modelType, version, selectedInspiration, _class)…...

wgcloud怎么实现服务器或者主机的远程关机、重启操作吗

可以&#xff0c;WGCLOUD的指令下发模块可以实现远程关机和重启 使用指令下发模块&#xff0c;重启主机&#xff0c;远程关机&#xff0c;重启agent程序- WGCLOUD...

PrimeTime生成.lib竟暗藏PG添加Bug

在primeTime里生成lib&#xff0c;如何能带上相关的pg信息&#xff1f; 这是一位群友的发问&#xff0c;就这个问题总结了下可能的原因和解决步骤&#xff1a; 概念 PrimeTime是Synopsys的静态时序分析工具&#xff0c;通常用于在设计的各个阶段进行时序验证。 1&#xff09…...

电话号码的字母组合组合总和II 回溯注意事项(Java)

电话号码的字母组合 思路&#xff1a;多个循环可以考虑回溯。 首先明确&#xff1a; 循环的宽度是多少&#xff0c;即从哪些区间取数&#xff08;本题目中每个数字都是3个字母&#xff0c;都是从三个字母中取一个数&#xff0c;所以可以确定循环宽度就是每个数字对应的字符串…...

【软件工程】填空题

真题 2024-10 16.数据字典是用来定义_____中各个成分的具体含义的。 17.模块设计的基本原则是_____。 18.接口是操作的一个集合,其中每个操作描述了类、构件或子系统的一个_____。 19.耦合是指不同模块之间_____的度量。 20.RUP的突出特点是,它是一种以用况为驱动的、…...

回归——数学公式推导全过程

文章目录 一、案例引入 二、如何求出正确参数 1. 最速下降法 1&#xff09;多项式回归 2&#xff09;多重回归 2. 随机梯度下降法 一、案例引入 以Web广告和点击量的关系为例来学习回归&#xff0c;假设投入的广告费和点击量呈现下图对应关系。 思考&#xff1a;如果花了…...

线程池详解:在SpringBoot中的最佳实践

线程池详解&#xff1a;在SpringBoot中的最佳实践 引言 在Java并发编程中&#xff0c;线程池是一种非常重要的资源管理工具&#xff0c;它允许我们在应用程序中有效地管理和重用线程&#xff0c;从而提高性能并降低资源消耗。特别是在SpringBoot等企业级应用中&#xff0c;正…...

.NET开源的智能体相关项目推荐

一、AntSK 由AIDotNet团队开发的人工智能知识库与智能体框架&#xff0c;支持多模型集成和离线部署能力。 核心能力&#xff1a; • 支持OpenAI、Azure OpenAI、星火、阿里灵积等主流大模型&#xff0c;以及20余种国产数据库&#xff08;如达梦&#xff09; • 内置语义内核&a…...

spring-security原理与应用系列:ignoredRequests

目录 WebSecurityConfig 何时调用 configure(WebSecurity) AbstractConfiguredSecurityBuilder 如何赋值ignoredRequests 紧接上一篇文章&#xff0c;这一篇我们来看看核心过滤器FilterChainProxy的构造参数对象ignoredRequests是如何被赋值的&#xff1f; 点击WebSecurity…...

(windows)conda虚拟环境下open-webui安装与启动

一、创建conda环境 重点强调下&#xff0c;如果用python pip安装&#xff0c;一定要选择python3.11系列版本&#xff0c;我选的3.11.9。 如果你的版本不是这个系列&#xff0c;将会出现一些未知的问题。 conda create -n open-webui python3.11 -y如下就创建好了 二、安装o…...

CentOS系统下安装tesseract-ocr5.x版本

CentOS系统下安装tesseract-ocr5.x版本 安装依赖包&#xff1a; yum update -y yum install autoconf automake libtool libjpeg-devel libpng-devel libtiff-devel zlib-devel yum install automake libtool bzip2 -y手动编译安装GCC&#xff08;因系统默认安装的GCC版本比较…...

第五周日志-伪协议(3)

常见读取源码的file&#xff0c;php://filter和各种编码 还有执行php的 php://input和各种编码&#xff0c;data 在进行文件包含之前&#xff0c;先定位一下 Flag 文件的位置&#xff08;这里可以使用工具扫&#xff09; or直接访问 /flag.php 文件&#xff0c;结果返回为空&…...

飞牛NAS本地部署小雅Alist结合内网穿透实现跨地域远程在线访问观影

文章目录 前言1. VMware安装飞牛云&#xff08;fnOS&#xff09;1.1 打开VMware创建虚拟机1.3 初始化系统 2. 飞牛云搭建小雅Alist3. 公网远程访问小雅Alist3.1 安装Cpolar内网穿透3.2 创建远程连接公网地址 4. 固定Alist小雅公网地址 前言 嘿&#xff0c;小伙伴们&#xff0c…...

十七天-Numpy 学习笔记

Numpy 学习笔记 Numpy 作为 Python 中用于进行科学计算的核心库&#xff0c;提供了高性能的多维数组对象&#xff0c;以及大量用于数组操作的工具。下面围绕 “常量”“数据类型”“时间日期和时间增量” 三个方面&#xff0c;梳理 Numpy 中基本的数据概念和数组创建相关知识。…...

浅谈WebSocket-FLV

FLV是一种视频数据封装格式&#xff0c;这种封装被标准通信协议HTTP-FLV和RTMP协议应用。 而WebSocket-FLV是一种非标的FLV封装数据从后端发送到前端的一种方式。 在WebSocket的url请求中&#xff0c;包含了需要请求设备的视频相关信息&#xff0c;在视频数据到达时&#xff0c…...

milvus-use教程 python

简介 项目地址&#xff1a;milvus-use: milvus-use教程 python 需求描述 参考vanna项目&#xff0c;获取数据库元数据和问题sql对&#xff0c;存入Milvus向量数据库&#xff0c;之后进行检索&#xff0c;返回相似的数据库表和问题对。本项目采用的嵌入模型为m3e-large。该该…...

Python列表生成式

Python 的 列表生成式&#xff08;List Comprehension&#xff09; 是一种简洁高效的创建列表的方式&#xff0c;可以用一行代码替代多行循环逻辑。 传统的循环的写法 # 循环遍历列表中的每个元素&#xff0c;并将其平方后添加到新的列表中 original [0, 1, 2, 3, 4] squares…...

MATLAB绘图配色包说明

本栏目将分享MATLAB数据分析图表&#xff0c;该贴讲述配色包的使用 将配色包colormap_nclCM文件夹添加到路径close all&#xff08;尽量不要删&#xff09;&#xff0c;使用map colormap(nclCM(309))时会多出来一张空白图片。配色资源来自slandarer&#xff1b;找不到合适颜色…...

Cursor异常问题全解析-无限使用

title: Cursor异常问题全解析无限使用 tags: cursor categories:aiai编程 mathjax: true description: Cursor异常问题全解析与解决方案大全 abbrlink: 64908bd0 date: 2025-03-19 14:48:32 &#x1f916; Assistant &#x1f6a8; Cursor异常问题全解析与解决方案大全 &…...

Ubuntu系统保姆级Paperless-ngx部署指南:零基础实现文档云端化管理

文章目录 前言1.关于Paperless-ngx2.Docker部署3.简单使用paperless4.安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在当今快节奏的办公环境中&#xff0c;文档管理成为了一个不可忽视的问题。想象一下这样的场景&#xff1a;你需要一份重要的合同&#xf…...

资本运营:基于Python实现的资本运作模拟

基于Python实现的一个简单的资本运营框架&#xff1b; ​企业生命周期演示&#xff1a;观察初创→成长→上市→并购全流程 ​行业对比分析&#xff1a;不同行业的财务特征和估值差异 ​资本运作策略&#xff1a;体验IPO定价、投资决策、并购整合等操作 ​市场动态观察&#xff…...

每日总结3.27

蓝桥刷题 1. 团建 &#xff08;树dfs&#xff09; #include <bits/stdc.h> using namespace std; const int N200005; int a[N],b[N]; int ans; map<int,vector<int>>m1,m2; void dfs(int x,int y,int count) { if(a[x]!b[y]) {return;} ansmax(ans,c…...