RISC-V AIA学习3---APLIC 第二部分(APLIC 中断域的内存映射控制区域)
每个中断域都有一个专用的内存映射控制区域,用来处理该中断域的中断。
控制区域的大小是 4KB 的倍数,对齐到 4KB 边界。最小的有效控制区域是 16KB。
1. 控制区域的基本结构:部门文件柜
每个中断域就像公司的一个部门,有自己的 "文件柜"(内存映射控制区域):
- 大小:至少 16KB(4 个文件柜),必须是 4KB 的整数倍
- 对齐:文件柜的起始位置必须在 4KB 的边界(如第 0KB、4KB、8KB 等)
- 文件分类:前 16KB 是通用文件,后面可能有专用任务分配表(IDC 结构)
一个中断域的控制区域,由一组32bit位宽的寄存器组成
2. 通用文件区(前 16KB)
存放所有部门共享的控制文件,例如:
- 中断使能开关:控制中断域的中断是否启用
- 优先级阈值:设置可处理的最低优先级任务
- 全局状态监控:显示当前最高优先级中断等
3. 任务分配表(IDC 结构)
IDC 结构,只有在直接向 harts 传递 interrupt 时使用,而由 MSI 转发interrupt时不会使用。
每个 IDC 结构为 32 字节,并定义如下:
- 起始位置: 0x4000 (第 16KB 开始)
- 结构大小:每个hart对应 32 字节的文件袋(包含 5 个寄存器)
寄存器功能:
- idelivery:任务分配开关(允许 / 禁止分配任务给该员工)
- iforce:强制触发任务(测试用)
- ithreshold:员工的任务优先级门槛(仅处理高于该优先级的任务)
- topi:显示该员工当前最高优先级任务(中断 ID)
- claimi:确认任务完成(清除待处理标记)
总结比喻
APLIC 的中断域内存控制区域就像:
- 部门文件柜:前 16KB 是部门共用的文件(如部门规章制度)
- 任务分配表:后续区域是每个员工的任务处理文件袋(仅直接分配任务的部门需要)
- 文件访问规则:只能用 32 位的方式打开文件,否则会被拒绝
- 预留机制:即使没有对应的员工,文件袋依然存在但为空
这种设计确保部门可以灵活管理中断,同时节省内存资源,适用于不同复杂度的中断处理场景。
根据本小节描述,中断域的内存映射空间,其寄存器分布情况,可整理为如下图所示:
2.1 Domain configuration(domaincfg)
domaincfg 就像部门的总控开关,控制整个中断域的行为。它的 32 位布局如下:
IE(Interrupt Eable)位
指示所在中断域的所有有效中断源的全局使能标志。
只有IE=1时,pending和enable同时置位的中断,才会投递到目标hart。
- 0 → 所有中断被禁用(即使设备触发,部门也不处理)
- 1 → 允许处理符合条件的中断
DM(Delivery Mode)位
选择中断的投递方式,其定义如下:
- 0 → 直接传递模式(APLIC 直接发送中断给 Hart)
- 1 → MSI 转发模式(APLIC 将中断转为电子消息发送给 IMSIC)
如果 Hart 有 IMSIC,且其 eidelivery 寄存器不支持特定值(0x40000000),直接传递模式会被禁用(相当于 IE=0)。也就是说,如果eidelivery不支持0x4000_0000,即便将DM置0,欲使用直接投递,也无法实际投递到Hart。
BE (big-Endian)位
它确定 interrupt domain 的寄存器byte的顺序。(在现今主流的 CPU 中,最常见的字节顺序有两种,分别是 Big-Endian 与 Little-Endian。Big-Endian 是指数据放进内存中的时候,最高位的字节会放在最低的内存地址上;而 Little-Endian 则是刚好相反,它会把最高位的字节放在最高的内存地址上。)
如果BE = 0,表示byte顺序为little-endian
如果 BE = 1,表示为big-endian。
在系统重置时,domaincfg 中的所有可写位,都被初始化为零,包括 IE。
2.2 Source configurations(sourcecfg[1]-sourcecfg[1023])
对于每一个可能的中断源 i,寄存器 sourcecfg [i] 控制着该中断源 i 在这个中断域中的源模式,以及该中断源对子域的任何委托情况。
当中断源 i 未被实现,或者在这个域中看起来未被实现时,sourcecfg [i] 为只读的零值。
如果中断源 i 之前没有被委托到这个域,而后(在父域中)被更改成委托到这个域,那么 sourcecfg [i] 会一直保持为零,直到成功写入一个非零值为止。
sourcecfg [i] 就像每个设备(中断源 i)的配置开关,控制设备在当前部门(中断域)的工作模式。它有两种工作模式:
模式 1:委托给子中断域(D=1)
- 子域索引:选择将中断源委托给哪个中断域
当中断源i,被委托给子域时,sourcecfg[i]有这样的格式:
具体委托到哪一个child domain,bit9:0指示委托到的child domain index(如果该parent domain包含C个child domain,则child domain index的范围为1-C)。
例如,当 D=1 时,假设某个中断源被委托给子域 3,那么当前域不再处理该中断,而是由子域 3 处理。这时候,sourcecfg [i] 的子域索引字段会被设置为 3。如果当前域是叶子域(无子域),设置 D=1 会导致寄存器被清零。
模式 2:当前中断域处理(D=0)
- SM 模式:设置设备的触发方式
当中断源i,不委托给子域时,sourcecfg[i]有这样的格式:
此时bit9:0的含义发生变化,仅使用bit2:0来指示SM (Source Mode),表示中断源i是否有效,以及其对应的中断类型。(所有其他的寄存器位,都被保留并读取为零)
SM 模式(Source Mode) 字段是WARL,它控制中断源在这个域中,是否处于活动状态。
如果是,那么入线(incoming wire)上的哪些值或转换,被解释为中断。
下表列出了SM允许的值及其含义:
字段SM始终支持Inactive(默认状态下)。
设备状态与寄存器行为
-
非激活状态(D=1 或 SM=Inactive):
- 中断待处理位(eip [i]):只读 0
- 中断使能位(eie [i]):只读 0
- 目标寄存器(target [i]):只读 0
-
激活状态(D=0 且 SM≠Inactive):
-
如果源i从非活动模式变为活动模式,中断源的pending和enable位保持为零,除非由于本节后面指定的原因自动设置,并且target[i]定义的子字段获得UNSPECIFIED值。
-
设备信号经过反向处理(rectified input):
- 如果设备是反向配置(如 Edge0/Level0),输入信号取反
- 写入 sourcecfg 可能自动设置待处理位:
- 当新配置的 rectified 输入为高电平时,自动触发中断
-
以下通过几个例子说明说明
示例 1:委托中断源给子域
场景:公司总部(根域)有一个打印机中断源(编号 5),现在需要将其委托给 IT 部门(子域 3)处理。
-
配置步骤:
- 写入
sourcecfg[5] = 0b100_0000_0011
(二进制)bit10 (D) = 1
:启用委托bits9:0 (Child Index) = 3
:指定子域 3
- 写入
-
效果:
- 根域不再处理打印机中断
- 子域 3 的
sourcecfg[5]
会显示为只读 0(需由子域主动配置)
示例 2:配置边沿触发的键盘中断
场景:部门需要将键盘中断(编号 2)配置为上升沿触发(正常模式)。
-
配置步骤:
- 写入
sourcecfg[2] = 0b0100
(二进制)bit10 (D) = 0
:本地处理bits2:0 (SM) = 4
:Edge1 模式
- 写入
-
效果:
- 键盘按下瞬间(物理信号从 0→1)触发中断
- 松开时(1→0)不会触发
示例 3:反向电平触发的鼠标中断
场景:部门需要将鼠标中断(编号 3)配置为松开按钮时触发(低电平触发)。
-
配置步骤:
- 写入
sourcecfg[3] = 0b0_111
(二进制)bit10 (D) = 0
:本地处理bits2:0 (SM) = 7
:Level0 模式
- 写入
-
效果:
- 鼠标按钮松开时(物理信号 0)触发中断
- 按下时(1)不触发
示例 4:Detached 模式的软件中断
场景:部门需要创建一个软件模拟的中断(编号 10),通过代码触发。
-
配置步骤:
- 写入
sourcecfg[10] = 0b0_001
(二进制)bit10 (D) = 0
:本地处理bits2:0 (SM) = 1
:Detached 模式
- 写入
-
效果:
- 忽略物理信号
- 可通过
setipnum = 10
手动触发中断
示例 5:叶子域的委托失败
场景:某个部门是叶子域(无子域),尝试将设备 7 委托给子域 0。
-
配置步骤:
- 写入
sourcecfg[7] = 0b1_00000000000
(二进制)
- 写入
-
效果:
- 硬件检测到无子域,自动将
sourcecfg[7]
清零 - 委托失败,设备 7 仍由当前域处理
- 硬件检测到无子域,自动将
总结
通过这些示例,可以看到 sourcecfg
寄存器通过 委托机制 和 触发模式配置,实现了中断源的灵活管理:
- 委托机制:将任务分配给子部门(子域)处理
- 触发模式:支持按钮、开关等不同类型的硬件设备
- 反向配置:允许设备使用相反的逻辑电平
- 软件触发:通过
setipnum
实现完全软件控制的中断
这种设计让中断控制器既能处理硬件设备的多样性,又能支持复杂的分层管理需求。
2.3 machine MSI address configuration(mmsiaddrcfg and mmsiaddrcfgh)
对于machine level的中断域,寄存器mmsiaddrcfg和mmsiaddrcfgh将提供传出的MSI地址参数。
如果APLIC的中断域,没有支持MSI投递模式,则此两个寄存器没有作用。
对于支持MSI投递模式的APLIC:
a. 在根中断域,需要实现这两个寄存器,且寄存器的属性是只写;
b. 对于其他的Machine level的中断域,可以选择性的支持,且寄存器的属性是只读;
c. 对于Supervisor level的中断域,不能实现这两个寄存器,且只读0。
mmisaddrcfg格式如下:
mmsiaddrcfgh格式如下:
mmsiaddrcfgh.High Base PPN与mmsiaddrcfg.Low Base PPN连接成一个44 bit的物理页基地址(PPN base)。
这个值(PPN base)和字段HHXs (High Hart Index Shift)、LHXS (Low Hart Index Shift)、HHXW (High Hart Index Width)和LHXW (Low Hart Index Width),用于确定msi的目标地址的使用(将在后续章节描述)。
示例 1:公司总部配置 MSI 地址(根域)
场景:公司总部(根域)需要为所有部门(Hart)配置 MSI(电子消息)的目标地址。
-
寄存器配置:
- mmsiaddrcfg =
0x12345678
(低 32 位 PPN) - mmsiaddrcfgh =
0x80000000
(高 12 位 PPN=0,L=1)
- mmsiaddrcfg =
-
生成的 44 位 Base PPN:
- 高 12 位(来自 mmsiaddrcfgh):
0x000
- 低 32 位(来自 mmsiaddrcfg):
0x12345678
- 完整 Base PPN:
0x00012345678
- 高 12 位(来自 mmsiaddrcfgh):
-
地址生成逻辑:
- 每个 Hart 的地址 = Base PPN + Hart 索引偏移
- 例如,Hart 5 的地址 =
0x00012345678 + 5*4 = 0x00012345690
示例 2:锁定寄存器配置(L 位 = 1)
场景:总部配置完成后,希望防止后续修改。
-
操作步骤:
- 写入
mmsiaddrcfgh.L = 1
- 寄存器被锁定,无法再写入,只可读
- 写入
-
效果:
- 其他域(如分公司)只能读取锁定的配置
- 即使根域尝试修改,写入会被忽略
- 之前的配置值(如 Base PPN)被保留,但无法通过寄存器读取
示例 3:分公司域的只读权限
场景:分公司域(非根域)需要使用总部配置的 MSI 地址。
-
寄存器状态:
- mmsiaddrcfg:只读,值与根域相同
- mmsiaddrcfgh:只读,L=1,其他字段与根域相同
-
地址生成:
- 分公司域使用总部的 Base PPN 生成自己的 MSI 地址
- 无法修改配置,确保所有域的地址一致
示例 4:硬件固定地址的简化实现
场景:某些 APLIC 硬件直接固定 MSI 地址,无需软件配置。
-
寄存器配置:
- mmsiaddrcfg =
0x00000000
- mmsiaddrcfgh =
0x80000000
(L=1)
- mmsiaddrcfg =
-
地址生成:
- Base PPN =
0x00000000000
- Hart 地址直接使用固定公式(如
0x40000000 + Hart索引*4
) - 寄存器配置不影响实际地址,仅用于兼容
- Base PPN =
关键注意事项
-
权限控制:
- 只有根域可以写入这些寄存器
- 其他域只能读取,确保配置一致性
-
锁定机制:
- L 位 = 1 时,寄存器变为只读
- 防止未授权修改,提高系统安全性
-
地址生成:
- Base PPN 由高低 PPN 拼接而成
- HHXS/LHXS 调整 Hart 索引的偏移
- HHXW/LHXW 确定 Hart 索引的有效范围
-
硬件兼容性:
- 硬件可固定地址,寄存器配置为默认值
- 复杂地址生成可通过自定义机制实现
总结
通过这些示例,可以看到 mmsiaddrcfg
和 mmsiaddrcfgh
寄存器通过 物理页号配置 和 Hart 索引调整,实现了 MSI 地址的灵活生成:
- 根域权限:只有总部(根域)可以设置和锁定地址
- 地址生成:根据 Base PPN 和 Hart 索引生成目标地址
- 锁定机制:防止配置被篡改,确保系统稳定性
- 硬件适配:支持固定地址或复杂地址生成方式
这种设计让 APLIC 能够兼容不同硬件架构,同时提供安全的中断消息路由功能。
2.4 supervisor MSI address configuration(smsiaddrcfg and smsiaddrcfgh)
核心概念
- MSI:消息信号中断(Message Signaled Interrupt),通过写入特定内存地址触发中断。
- smsiaddrcfg/smsiaddrcfgh:寄存器,用于配置超级用户级(Supervisor)域发送 MSI 时的目标地址。
1. 寄存器的存在条件
- 只有机器级(Machine)域实现了
mmsiaddrcfg/mmsiaddrcfgh
寄存器,且APLIC存在至少一个超级用户级中断域。否则这两个寄存器的地址位置是只读的零(像其他保留位一样)。
2. 可写性规则
- 根域(Root Domain):可以写入这两个寄存器(但受
mmsiaddrcfgh.L
位限制)。 - 其他机器级域:寄存器是只读的,且内容与根域的相同。
3. 寄存器结构
- smsiaddrcfg(32 位):
- 低 32 位:低基物理页号(Low Base PPN)
- smsiaddrcfgh(32 位):
- 高 12 位:高基物理页号(High Base PPN)。
- LHXS 字段(位 22-20):用于调整目标地址的低 hart 索引偏移
- 其他位:保留,读为零。
4. 地址组合方式
- 44 位基物理页号:由
High Base PPN
(12 位)和Low Base PPN
(32 位)拼接而成。 - LHXS 的作用:可能用于调整 hart 索引的偏移量,从而生成不同的目标地址
5. 锁定机制(mmsiaddrcfgh.L 位)
- 当 L 位 = 1 时:
mmsiaddrcfg/mmsiaddrcfgh
和smsiaddrcfg/smsiaddrcfgh
均被锁定为只读。- 如果
mmsiaddrcfg
和mmsiaddrcfgh
的可见值为0
和0x80000000
,则smsiaddrcfg/smsiaddrcfgh
也会被隐藏,读为零。 - 例外:根域在 L 位设置前写入的值会被保留,但无法再通过寄存器读取。
6. 系统复位的特殊情况
- 如果复位时根域的
mmsiaddrcfgh.L=1
,且所有 MSI 地址配置字段始终为零:- APLIC 可能使用非标准方法确定 MSI 地址
7. 非根域的行为
- 非根域的
smsiaddrcfg/smsiaddrcfgh
是根域寄存器的只读副本。 - 它们的值无法修改,完全由根域控制。
示例 1:根域配置 Supervisor MSI 地址
场景:公司总部(根域)需要为所有 Supervisor 级部门配置 MSI(电子消息)的目标地址。
-
寄存器配置:
- smsiaddrcfg =
0x9ABCDEF0
(低 32 位 PPN) - smsiaddrcfgh =
0x001
(高 12 位 PPN=1,LHXS=0)
- smsiaddrcfg =
-
生成的 44 位 Base PPN:
- 高 12 位(来自 smsiaddrcfgh):
0x001
- 低 32 位(来自 smsiaddrcfg):
0x9ABCDEF0
- 完整 Base PPN:
0x0019ABCDEF0
- 高 12 位(来自 smsiaddrcfgh):
-
地址生成逻辑:
- 每个 Hart 的地址 = Base PPN + Hart 索引 * 4
- 例如,Hart 3 的地址 =
0x0019ABCDEF0 + 3*4 = 0x0019ABCDEF0 + 0xC = 0x0019ABCDEF0C
示例 2:锁定寄存器配置(L 位 = 1)
场景:总部配置完成后,希望防止后续修改。
-
操作步骤:
- 写入
mmsiaddrcfgh.L = 1
(machine 级寄存器) - 同时锁定
smsiaddrcfg
和smsiaddrcfgh
- 写入
-
效果:
- 根域无法再写入这些寄存器
- 其他域(如分公司)只能读取锁定的配置
- 之前的配置值(如 Base PPN)被保留,但无法通过寄存器读取
示例 3:分公司域的只读权限
场景:分公司域(非根域)需要使用总部配置的 Supervisor MSI 地址。
-
寄存器状态:
- smsiaddrcfg:只读,值与根域相同(
0x9ABCDEF0
) - smsiaddrcfgh:只读,值与根域相同(
0x001
)
- smsiaddrcfg:只读,值与根域相同(
-
地址生成:
- 分公司域使用总部的 Base PPN 生成自己的 MSI 地址
- 无法修改配置,确保所有域的地址一致
示例 4:硬件固定地址的简化实现
场景:某些 APLIC 硬件直接固定 Supervisor MSI 地址,无需软件配置。
-
寄存器配置:
- smsiaddrcfg =
0x00000000
- smsiaddrcfgh =
0x000
(LHXS=0)
- smsiaddrcfg =
-
地址生成:
- Base PPN =
0x00000000000
- Hart 地址直接使用固定公式(如
0x80000000 + Hart索引*4
) - 寄存器配置不影响实际地址,仅用于兼容
- Base PPN =
2.6 set interrupt-pending bits(setip[0]-setip[31])
设置中断挂起位。
a. 在写入setip寄存器时,对于写入的32位值中为1的每一位,如果该位位置是有效的中断源(active interrupt source),则该源的pending位将设置为1
b. 读取setip,会返回相对应的中断源的pending位,假设该中断源并未实现,则读取setip相对应的位,其值为 0。
写入setip[k],可以修改中断源k * 32 到 k * 32 + 31的pending位。
想象一个公司有很多部门,每个部门有 32 个员工。setip[k]
就像是一个记录板,k
代表部门编号。每个员工对应记录板上的一个位置(位),用来表示该员工是否有紧急任务(中断待处理)。
-
读取操作:当你读取
setip[k]
时,就相当于查看第k
个部门哪些员工有紧急任务。如果某个员工对应的位是 1,说明他有紧急任务;如果是 0,则没有。对于没有员工的位置(未实现的中断源),就显示为 0。
例如,读取setip[0]
时,如果返回0x00000003
(二进制0000 0000 0000 0000 0000 0000 0000 0011
),表示第 0 个部门的第 0 号和第 1 号员工有紧急任务。 -
写入操作:当你向
setip[k]
写入一个 32 位的值时,就相当于给第k
个部门的员工分配紧急任务。如果写入的值中某一位是 1,且对应的员工是活跃状态(有工作能力,即对应活跃的中断源),就会把该员工的紧急任务标志(中断待处理位)设为 1。
比如,向setip[0]
写入0x00000004
(二进制0000 0000 0000 0000 0000 0000 0000 0100
),如果第 0 个部门的第 2 号员工是活跃的,那么他的紧急任务标志就会被设为 1。
2.6 set interrupt - pending bit by number (setipnum)
使用中断源ID,设置中断挂起位。
- 如果i是一个中断域中的有效中断源ID,则将i写到setipnum会让对应pending位置1。如果i不是该中断域中的有效中断源ID,则忽略 setipnum 的写入。
- 对该寄存器的读请求都会返回0。
这就像是公司的老板可以直接指定某个员工有紧急任务。setipnum
就像是老板的指令单,你把员工编号(32 位值 i
)写在上面,如果这个员工是活跃的,就会把他的紧急任务标志设为 1。
例如,你向 setipnum
写入 5
,如果第 5 号员工是活跃的,他的紧急任务标志就会被设为 1。如果写入的编号对应的员工不活跃,这个指令就会被忽略。
2.7 Rectified inputs, clear interrupt-pending bits (in clrip[0]–in clrip[31])
清除中断挂起位
a. 读取寄存器in_clrip,会返回相对应的中断源的校正输入值(Rectified inputs)。假设该中断源并未实现(超出了中断编号的范围),则读取in_clrip相对应的位置为 0。
b. 写入setip寄存器时,对于写入的32位值中为1的每一位,如果该位位置是有效的中断源(active interrupt source),则该源的pending位将被清零。
把in clrip[k]
看成一个记录板,不过它有两个功能。
- 读取操作:读取
in clrip[k]
时,返回的是第k
个部门员工经过处理后的工作状态(整流输入值)。对于没有员工的位置,显示为 0。 - 写入操作:当你向
in clrip[k]
写入一个 32 位的值时,如果某一位是 1,且对应的员工是活跃的,就会尝试清除该员工的紧急任务标志。
比如,向in clrip[0]
写入0x00000002
(二进制0000 0000 0000 0000 0000 0000 0000 0010
),如果第 0 个部门的第 1 号员工是活跃的,就会清除他的紧急任务标志。
2.8 Clear interrupt-pending bit by number (clripnum)
使用中断源ID,清除中断挂起位
- 如果i是一个中断域中的有效中断源标识,则将i写到clripnum会让该源的pending位被清零。如果i不是该中断域中的有效中断源标识,则忽略 clripnum 的写入。
- 对该寄存器的读请求都会返回0。
这就像是老板直接指定清除某个员工的紧急任务。你把员工编号(32 位值 i
)写入 clripnum
,如果这个员工是活跃的,就会清除他的紧急任务标志。如果写入的编号对应的员工不活跃,这个操作就会被忽略。读取 clripnum
总是返回 0。
2.9 Set interrupt-enable bits (setie[0]–setie[31])
-
寄存器功能:
- 读操作:返回中断源 k×32 到 k×32+31 的使能位状态
- 写操作:设置这些中断源的使能位
- 未实现的中断源位读时返回 0
例如,向 setie[0]
写入 0x00000001
(二进制 0000 0000 0000 0000 0000 0000 0000 0001
),如果第 0 个部门的第 0 号员工是活跃的,他就会被允许接收紧急任务。
2.10 Set interrupt-enable bit by number (setienum)
使用中断源ID,设置中断使能位。
- 如果i是一个中断域中的有效中断源ID,则将i写到setienum会让对应enable位置1。如果i不是该中断域中的有效中断源ID,则忽略 setienum的写入。
- 对该寄存器的读请求都会返回0。
这就像是老板直接指定某个员工被允许接收紧急任务。你把员工编号(32 位值 i
)写入 setienum
,如果这个员工是活跃的,就会把他的接收紧急任务权限设为 1。如果写入的编号对应的员工不活跃,这个操作就会被忽略。读取 setienum
总是返回 0。
2.11 Clear interrupt-enable bits
清除中断使能位(clrie [0]-clrie [31])
- 作用:专门用于批量清除中断使能位
- 原理:
- 每个 clrie [k] 控制 32 个中断源(编号 k×32 到 k×32+31)
- 写入 1 的位会清除对应中断源的使能状态
- 例如:
- clrie [0] 控制中断源 0-31
- clrie [1] 控制中断源 32-63
- 只读零特性:读取这些寄存器永远返回 0,只能写操作
clrie[k]
用于清除第 k
个部门员工的接收紧急任务权限。当你向 clrie[k]
写入一个 32 位的值时,如果某一位是 1,就会清除对应员工的接收紧急任务权限。读取 clrie[k]
总是返回 0。
例如,向 clrie[0]
写入 0x00000003
(二进制 0000 0000 0000 0000 0000 0000 0000 0011
),会清除第 0 个部门第 0 号和第 1 号员工的接收紧急任务权限。
2.12 clear interrupt-enable bit by number
按编号清除中断使能位(clrienum)
- 作用:精准清除单个中断源的使能位
- 操作方法:
- 写入中断源编号 i(32 位值)
- 仅对有效中断源(active)有效
- 无效写入(非 active 编号)会被忽略
- 读取永远返回 0
这就像是老板直接指定清除某个员工的接收紧急任务权限。你把员工编号(32 位值 i
)写入 clrienum
,如果这个员工是活跃的,就会清除他的接收紧急任务权限。如果写入的编号对应的员工不活跃,这个操作就会被忽略。读取 clrienum
总是返回 0。
2.13 set interrupt-pending bit by bumber,little-endian
小端模式按编号设置中断挂起位(setipnum le)
- 特点:
- 功能与 setipnum 完全相同
- 强制使用小端字节序
- 系统设计:
- 大端系统(BE=1)中可省略实现
- 存在时用于支持小端设备的 MSI 写入
- 读写行为与 setipnum 一致
2.14 set interrupt-pending bit by bumber,big-endian
- 特点:
- 功能与 setipnum 完全相同
- 强制使用大端字节序
- 系统设计:
- 小端系统(BE=0)中可省略实现
- 存在时用于支持大端设备的 MSI 写入
- 读写行为与 setipnum 一致
2.15 Generate MSI(genmsi)
genmsi
就像部门里的 "紧急快递员",专门用于在 MSI 模式下发送即时中断(类似 "闪送" 服务)。
使用场景
示例:老板需要立即通知程序员小明(hart 5)处理紧急 bug:
- 写入
genmsi
:- Hart Index = 5
- EIID = 0x123(表示 "紧急 bug 修复")
- Busy 位自动变为 1,表示快递员正在路上
- APLIC 立即发送 MSI 到小明的电脑(IMSIC)
- Busy 位自动变回 0,表示快递已送达
关键特性
- 无视 IE 位:即使部门总开关(IE)关闭,也能强制发送 MSI(类似 "总统特令")
- 顺序保证:确保之前发送给同一 hart 的所有 MSI 已送达,再发送当前 MSI
- 模式限制:仅在 MSI 模式(DM=1)可用,直接模式(DM=0)时为只读 0
操作流程
步骤 1:检查 Busy 位
- 读取
genmsi
,确认 Busy=0(快递员空闲)
步骤 2:写入参数
- Hart Index:目标 hart 编号(如 5)
- EIID:中断标识(如 0x123)
步骤 3:等待发送
- Busy 自动变为 1(快递员出发)
- APLIC 立即发送 MSI(快递送达)
- Busy 自动变回 0(快递员返回)
注意事项
- 性能瓶颈:频繁使用可能导致延迟,建议直接写入 IMSIC(类似 "自己送文件")
- 地址验证:Hart Index 必须是有效编号,否则 MSI 可能丢失
- 中断标识:EIID 值需与目标 hart 的 IMSIC 配置匹配
2.16 Interrupt targets(target[1]-target[1023])
target[i]
就像每个设备(中断源 i)的 "任务分配表",决定该设备的中断会被发送到哪个员工(hart),以及相关参数。
2. 直接传递模式(DM=0)
场景:部门直接分配任务给员工
示例 1:打印机中断分配给员工 5
-
配置:
target[3] = 0b00000000000000000000000000000101
(二进制)- Hart Index = 5
- IPRIO = 1(最低有效位)
-
效果:
- 打印机中断(源 3)会直接发送给员工 5
- 优先级为 1(最高)
示例 2:键盘中断设置优先级为 3
-
配置:
target[2] = 0b00000000000000000000000000000011
(二进制)- Hart Index = 0
- IPRIO = 3
-
效果:
- 键盘中断(源 2)发送给员工 0
- 优先级为 3(比优先级 1 低)
3. MSI 模式(DM=1)
场景:部门将任务转为电子消息发送给 IMSIC
示例 3:发送软件中断给员工 5
-
配置:
target[10] = 0b00000000000000000000000000000101
(二进制)- Hart Index = 5
- EIID = 1(任务编号)
-
效果:
- APLIC 生成 MSI 消息:地址 = 员工 5 的 IMSIC 地址,数据 = 0x1
- IMSIC 收到后触发中断
示例 4:超级用户级域的客户中断
-
配置:
target[7] = 0b00000000000000000000000000000011
(二进制)- Hart Index = 2
- Guest Index = 1(客户文件柜 1)
- EIID = 3
-
效果:
- MSI 发送到员工 2 的客户文件柜 1,数据 = 0x3
- IMSIC 将中断传递给对应的客户系统
4. 关键规则
优先级规则
- 数值越小优先级越高:优先级 1 > 优先级 3
- 相同优先级:中断源编号较小的优先级更高(源 2 > 源 3)
IPRIO 写入限制
- 不允许写入 0,会自动转为 1
- 实际有效位数由 APLIC 参数 IPRIOLEN 决定(1-8 位)
MSI 地址生成
- 地址 = Hart 地址 + Guest Index 偏移(如果有的话)
- 数据 = EIID(任务编号)
5. 模式切换影响
场景:部门从直接模式切换到 MSI 模式
-
操作:
- 设置
domaincfg.DM = 1
- 设置
-
效果:
- 所有激活中断源的 target 寄存器会被清空
- 需要重新配置 Hart Index、Guest Index、EIID
6. 实际应用示例
场景:系统初始化时配置中断路由
-
直接传递模式:
- 键盘(源 2)→ 员工 0,优先级 1
- 鼠标(源 3)→ 员工 1,优先级 2
-
MSI 模式:
- 软件中断(源 10)→ 员工 5,任务编号 0x123
- 网络中断(源 15)→ 员工 3,客户文件柜 0,任务编号 0x456
总结比喻
target
寄存器就像部门的 "任务派遣系统":
- 直接传递模式:
- Hart Index:指定具体员工
- IPRIO:任务紧急程度(数字越小越紧急)
- MSI 模式:
- Hart Index:目标员工编号
- Guest Index:客户文件柜编号(高级功能)
- EIID:任务编号(用于生成电子消息内容)
- 模式切换:部门调整工作方式时,所有任务分配表会被重置
这种设计让部门可以灵活选择中断处理方式,同时确保任务按优先级和目标精准分配。
相关文章:
RISC-V AIA学习3---APLIC 第二部分(APLIC 中断域的内存映射控制区域)
每个中断域都有一个专用的内存映射控制区域,用来处理该中断域的中断。 控制区域的大小是 4KB 的倍数,对齐到 4KB 边界。最小的有效控制区域是 16KB。 1. 控制区域的基本结构:部门文件柜 每个中断域就像公司的一个部门,有自己的 …...
顶刊【遥感目标检测】【TGRS】FFCA-YOLO遥感图像小目标检测
FFCA-YOLO for Small Object Detection in Remote Sensing Images FFCA-YOLO遥感图像小目标检测 0.论文摘要 摘要——特征表征不足、背景干扰等问题使得遥感图像中的小目标检测任务极具挑战性。尤其在算法需部署于星载设备进行实时处理时,需在有限计算资源下对精度…...
【人工智能】从 Llama 到 DeepSeek:开源大模型的演进与技术对比
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能的迅猛发展,开源大语言模型(LLM)在自然语言处理领域扮演着越来越重要的角色。本文从 Meta 的 Llama 系列开始,追溯开源大模…...
【PCB工艺】时序图(Timing Diagram)
时序图(Timing Diagram)是描述数字电路信号随时间变化的图示,广泛用于分析和设计时序逻辑电路,如锁存器(Latch)、触发器(Flip-Flop)、计数器、状态机等。这篇文章从时序图的原理、构…...
MATLAB 中,并行池(Parallel Pool)自动关闭的情况
在 MATLAB 中,并行池(Parallel Pool)的行为可以通过设置进行控制,但默认情况下,并行池不会自动关闭,除非满足某些条件或显式调用关闭命令。以下是关于并行池自动关闭机制的详细说明: 自动关闭的…...
[网安工具] SQL 注入自动探测工具 —— SQLMAP 使用手册
🌟想了解其它网安工具?看看这个:[网安工具] 网安工具库 —— 工具管理手册 https://github.com/sqlmapproject/sqlmaphttps://github.com/sqlmapproject/sqlmap用法 | sqlmap 用户手册https://sqlmap.highlight.ink/usage 0x01:S…...
Python数据结构与算法-基础预热篇
目录 语言基础 1.内置函数 1.1math库 1.2collections 1.2.1Counter:计数器 1.2.2deque双端对列 1.2.3defaultdict有默认值的字典 1.3heapq堆(完全二叉树) 1.4functool 1.5itertools 1.5.1无限迭代器 1.5.2有限迭代器 1.5.3排列组合迭代器 2.序…...
构建可扩展、可靠的网络抓取、监控和自动化应用程序的终极指南
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 无论您是企业主、营销人员还是软件开发人员,您都很有可能在某个时候使用过 Web 自动化工具。每个人都希望更聪明地工作…...
【蓝桥杯】重点冲刺
【最高优先级】必考核心算法(占分60%以上) 动态规划(DP) 🌟🌟🌟 背包问题:01背包、完全背包(必须掌握空间优化的一维写法) 线性DP:最长上升子序列(LIS)、最长公共子序列(LCS) 路径问题:网格路径计数(含障碍物)、最小路径和 经典模型:打家劫舍、股票买卖问…...
质量工程师的2025:从“找bug“到“造质量“的职业进化
想象一下,2025年的某天:阅读原文 早晨,AI测试助手已经自动运行了夜间回归测试,并将可疑问题标记出来 你喝着咖啡,通过质量数据看板分析系统健康度 下午的会议上,你正用业务语言向产品经理解释:…...
2025年CNG 汽车加气站操作工题目分享
CNG 汽车加气站操作工题目分享: 单选题 1、CNG 加气站中,加气机的加气软管应( )进行检查。 A. 每天 B. 每周 C. 每月 D. 每季度 答案:A 解析:加气软管是加气操作中频繁使用的部件,每天检…...
【QT5 多线程示例】线程池
线程池 【C并发编程】(九)线程池 QThreadPool 和 QRunnable 是 Qt 提供的线程池管理机制。QRunnable 是一个任务抽象类;定义任务逻辑需要继承QRunnable 并实现 run() 方法。QThreadPool 负责管理线程,并将 QRunnable 任务分配到…...
飞致云荣获“Alibaba Cloud Linux最佳AI镜像服务商”称号
2025年3月24日,阿里云云市场联合龙蜥社区发布“2024年度Alibaba Cloud Linux最佳AI镜像服务商”评选结果。 经过主办方的严格考量,飞致云(即杭州飞致云信息科技有限公司)凭借旗下MaxKB开源知识库问答系统、1Panel开源面板、Halo开…...
FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读
FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读 论文下载论文翻译FAST-LIVO2: 快速、直接的LiDAR-惯性-视觉里程计摘要I 引言II 相关工作_直接方法__LiDAR-视觉(-惯性)SLAM_ III 系统概述IV 具有顺序状态更新的误差状态迭代卡尔曼滤波…...
kubesphere 终端shell连不上的问题
使用nginx代理kubesphere控制台会出现容器的终端shell连不上的问题 下面是一个样例配置可以解决这个问题: 注意修改为你的ip地址: upstream k8s { ip_hash; server masterip1:30880; server masterip2:30880; server masterip3:30880; } nginx.conf #…...
无人机,雷达定点飞行时,位置发散,位置很飘,原因分析
参考: 无人车传感器 IMU与GPS数据融合进行定位机制_gps imu 组合定位原始数-CSDN博客 我的无人机使用雷达定位,位置模式很飘 雷达的更新频率也是10HZ, 而px飞控的频率是100HZ,没有对两者之间的频率差异做出处理 所以才导致无人…...
外星人入侵(python设计小游戏)
这个游戏简而言之就是操作一个飞机对前方的飞船进行射击,和一款很久之前的游戏很像,这里是超级低配版那个游戏,先来看看效果图: 由于设计的是全屏的,所以电脑不能截图。。。。 下面的就是你操控的飞船,上面…...
Stereolabs ZED Box Mini:NVIDIA Orin™驱动,双GMSL2输入,智能机器视觉AI新选择”
Stereolabs近日推出了ZED Box Mini,这是一款专为视觉AI设计的紧凑型迷你电脑(ECU)。该产品搭载了NVIDIA Orin™系列处理器,具备强大的AI视觉处理能力,适用于机器人、智能基础设施和工业应用等多种场景。ZED Box Mini以…...
IP协议的介绍
网络层的主要功能是在复杂的网络环境中确定一个合适的路径.网络层的协议主要是IP协议.IP协议头格式如下: 1.4位版本号:指定IP协议的版本,常用的是IPV4,对于IPV4来说,这里的值就是4. 2.4位头部长度,单位也是4个字节,4bit表示的最大数字是15,因此IP头部的最大长度就是60字节 3.…...
【入门初级篇】布局类组件的使用(2)
【入门初级篇】布局类组件的使用(2) 视频要点 (1)2分栏场景介绍与实操演示 (2)3分栏场景介绍与实操演示 点击访问myBuilder产品运营平台 CSDN站内资源下载myBuilder 交流请加微信:MyBuilder8…...
高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系
一句话总结 在高并发金融系统中,审计方案设计需平衡"观测粒度"与"系统损耗",通过双AOP实现非侵入式采集,三表机制保障操作原子性,最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…...
(九)Spring Webflux
底层基于Netty实现的Web容器与请求/响应处理机制 参照:Spring WebFlux :: Spring Frameworkhttps://docs.spring.io/spring-framework/reference/6.0/web/webflux.html 一、组件对比 API功能 Servlet-阻塞式Web WebFlux-响应式Web 前端控制器 DispatcherServl…...
如何在Webpack中配置别名路径?
如何在Webpack中配置别名路径? 文章目录 如何在Webpack中配置别名路径?1. 引言2. 配置别名路径的基本原理3. 如何配置别名路径3.1 基本配置3.2 结合Babel与TypeScript3.2.1 Babel配置3.2.2 TypeScript配置 3.3 适用场景与最佳实践 4. 调试与常见问题4.1 …...
office_word中使用宏以及DeepSeek
前言 Word中可以利用DeepSeek来生成各种宏,从而生成我们需要各种数据和图表,这样可以大大减少我们手工的操作。 1、Office的版本 采用的是微软的office2016,如下图: 2、新建一个Word文档 3、开启开发工具 这样菜单中的“开发工具…...
利用GitHub Pages快速部署前端框架静态网页
文章目录 前言GitHub Pages 来部署前端框架(Vue 3 Vite)项目1、配置 GitHub Pages 部署2、将项目推送到 GitHub3、部署到 GitHub Pages4、访问部署页面5、修改代码后的更新部署顺序 前言 可以先参考: 使用 GitHub Pages 快速部署静态网页: …...
前端性能优化思路_场景题
20 万人同时在直播间打赏,前端优化需要考虑高并发、性能优化、流畅体验等问题,涉及 WebSocket 处理、消息去抖、虚拟列表优化、动画优化、CDN 加速 等多个方面。 WebSocket 高并发优化 (1)使用 WebSocket 替代轮询 轮询…...
45 55跳跃游戏解题记录
先是55跳跃游戏,暴力解法会怎样?会超出时间限制,而且有很多细节要注意: func canJump(nums []int) bool {// 处理空数组情况,当nums只剩一个元素时,nums[i:]导致越界。if len(nums) 0 {return false}// 如…...
一个简单的用C#实现的分布式雪花ID算法
雪花ID是一个依赖时间戳根据算法生成的一个Int64的数字ID,一般用来做主键或者订单号等。以下是一个用C#写的雪花ID的简单实现方法 using System; using System.Collections.Concurrent; using System.Diagnostics;public class SnowflakeIdGenerator {// 配置常量p…...
16个气象数据可视化网站整理分享
好的!以下是关于“16个气象数据可视化网站整理分享”的软文: 16个气象数据可视化网站整理分享 气象数据可视化已成为现代气象研究、决策支持以及公众天气服务的重要组成部分。从天气预报到气候变化监测,全球许多气象数据可视化平台为专业人士…...
一周学会Flask3 Python Web开发-SQLAlchemy数据迁移migrate
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 模型类(表)不是一成不变的,当你添加了新的模型类,或是在模型类中添加了新的字段,甚至是修改…...
[原创](Modern C++)现代C++的关键性概念: 如何利用多维数组的指针安全地遍历所有元素
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …...
本地化智能运维助手:基于 LangChain 数据增强 和 DeepSeek-R1 的K8s运维文档检索与问答系统 Demo
写在前面 博文内容为基于 LangChain 数据增强 和 Ollams 本地部署 DeepSeek-R1实现 K8s运维文档检索与问答系统 Demo通过 Demo 对 LEDVR 工作流, 语义检索有基本认知理解不足小伙伴帮忙指正 😃,生活加油 我看远山,远山悲悯 持续分享技术干货…...
中间件框架漏洞攻略
中间件(英语:Middleware)是提供系统软件和应⽤软件之间连接的软件,以便于软件各部件之间的沟通。 中间件处在操作系统和更⾼⼀级应⽤程序之间。他充当的功能是:将应⽤程序运⾏环境与操作系统隔离,从⽽实…...
在 Ubuntu 上安装 Docker 的完整指南
1. 卸载旧版本(如有) 在安装新版本前,建议先卸载旧版本: sudo apt remove docker docker-engine docker.io containerd runc 2. 安装依赖包 更新软件包索引并安装必要的依赖: sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release 3. 添加 Do…...
Another Redis Desktop Manager下载安装使用
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Another Redis Desktop Manager下载安装使用…...
GitLab 中文版17.10正式发布,27项重点功能解读【一】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
mysql慢查询日志
在 MySQL 中,慢查询日志(Slow Query Log)用于记录执行时间超过指定阈值的 SQL 语句。通过分析慢查询日志,可以优化数据库性能。以下是查看和配置 MySQL 慢查询日志的详细步骤: 1. 检查慢查询日志是否已启用 登录 MySQ…...
unity 截图并且展现在UI中
using UnityEngine; using UnityEngine.UI; using System.IO; using System.Collections.Generic; using System; using System.Collections;public class ScreenshotManager : MonoBehaviour {[Header("UI 设置")]public RawImage latestScreenshotDisplay; // 显示…...
Linux上位机开发实践(MPP平台的核心构成)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 芯片行业是一个赢者通吃的行业。也就是说细分领域的前两名,相比较后来者而言,拥有很多无可比拟的优势。以安防市场的soc来说…...
Hosts文件与DNS的关系:原理、应用场景与安全风险
目录 引言 Hosts文件与DNS的基本概念 2.1 什么是Hosts文件? 2.2 什么是DNS? Hosts文件与DNS的关系 Hosts文件的应用场景 4.1 本地开发与测试 4.2 屏蔽广告与恶意网站 4.3 绕过DNS污染或劫持 Hosts文件的优势 5.1 解析速度快 5.2 不受DNS缓存影…...
Stable Diffusion vue本地api接口对接,模型切换, ai功能集成开源项目 ollama-chat-ui-vue
1.开启Stable Diffusion的api服务 编辑webui-user.bat 添加 –api 开启api服务,然后保存启动就可以了 2.api 文档地址 http://127.0.0.1:7860/docs3. 文生图 接口 地址 /sdapi/v1/txt2img //post 请求入参 {enable_hr: false, // 开启高清hrdenoising_stre…...
【含文档+源码】基于SpringBoot的过滤协同算法之网上服装商城设计与实现
项目介绍 本课程演示的是一款 基于SpringBoot的过滤协同算法之网上服装商城设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署…...
优化 Docker 构建之方法(Methods for Optimizing Docker Construction)
优化 Docker 构建之方法 优化 Docker 构建不仅是为了提高效率,它还是降低部署成本、确保安全性和保持跨环境一致性的有效方法。每个层、依赖项和配置选择都会影响镜像的大小、安全性和可维护性。大型镜像部署速度较慢且消耗更多资源,这会增加成本&#…...
谈谈空间复杂度考量,特别是递归调用栈空间消耗?
空间复杂度考量是算法设计的核心要素之一,递归调用栈的消耗问题在前端领域尤为突出。 以下结合真实开发场景进行深度解析: 一、递归调用栈的典型问题 1. 深层次DOM遍历的陷阱 // 危险操作:递归遍历未知层级的DOM树 function countDOMNode…...
四川省汽车加气站操作工备考题库及答案分享
1.按压力容器的设计压力分为( )个压力等级。 A. 三 B. 四 C. 五 D. 六 答案:B。解析:按压力容器的设计压力分为低压、中压、高压、超高压四个压力等级。 2.缓冲罐的安装位置在天然气压缩机( )。 A. 出口处 …...
《探秘SQL的BETWEEN:解锁数据范围查询的深度奥秘》
在数据的广袤宇宙中,结构化查询语言(SQL)宛如一座精密的导航系统,引导我们穿越数据的浩瀚星河,精准定位所需信息。其中,BETWEEN作为SQL的关键工具之一,以其独特的能力,在数据的海洋里…...
AppArmor 使用说明
目录 一:AppArmor 功能介绍二:AppArmor 配置介绍1、AppArmor 配置文件存放路径2、AppArmor 配置文件命名规则 三: AppArmor 工作模式1、AppArmor 两种工作模式2、查看当前进程的工作模式3、给指定进程切换工作模式4、重新加载配置文件生效 四…...
Linux的一些常见指令
一、ls指令 语法: ls (选项) 功能: ls可以查看当前目录下的所有文件和目录。 常用选项: -a:列出目录下的所有文件,包括以点(.)开头的隐含文件 。-d:将目录像文件一样显示,不显示其下的文件。…...
MATLAB中getfield函数用法
目录 语法 说明 示例 访问标量结构体的字段 嵌套结构体的字段 结构体数组元素的字段 嵌套结构体数组的索引 字段的元素 getfield函数的功能是结构体数组字段。 语法 value getfield(S,field) value getfield(S,field1,...,fieldN) value getfield(S,idx,field1,..…...
算法 | 河马优化算法原理,公式,应用,算法改进及研究综述,matlab代码
以下是关于河马优化算法(Hippopotamus Optimization Algorithm, HO)的完整综述,包含原理、公式、应用场景、改进方向及可直接运行的 Matlab 完整代码。一、算法原理 河马优化算法(HO)由Amiri等人于2024年提出,是受河马群体行为启发的元启发式算法,其核心基于以下三阶段行…...