news 2026/5/27 5:59:10

PLIC机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PLIC机制

RISC-V 的 PLIC(Platform-Level Interrupt Controller,平台级中断控制器)负责收集各外设的全局中断请求,经优先级仲裁后分发到指定的 Hart Context(硬件线程上下文)。其核心特点是采用软件主动 Claim/Complete 握手协议(拉取模型),而非传统 x86 PIC 的推送模型。


一、PLIC 关键硬件组成

组件

说明

Interrupt Gateway(中断闸口)

每个中断源一个,将设备电平/边沿信号转为标准请求,同一时刻只允许一个未完成的请求进入 PLIC,直到收到 Complete 才放行下一个

Pending 寄存器 (IP)

标记哪些中断源已锁存请求(bitmap,ID 1~1023,ID 0 保留表示无中断)

Priority 寄存器

每中断源一个优先级值,0=禁用,值越大优先级越高

Enable 矩阵 (IE)

按 Hart Context 分别配置每个中断源是否对该核使能

Threshold 寄存器

每 Hart Context 一个阈值,只有 Priority > Threshold 的中断才发给该核

Claim/Complete 寄存器

每 Hart Context 一个 MMIO 寄存器,读→Claim(取中断ID),写→Complete(写回中断ID)


二、中断分发与仲裁流程(完整生命周期)

设备触发 → Gateway → PLIC 置 Pending → 仲裁筛选 → 置 MEIP/SEIP → Hart陷入 → Claim读ID → 调ISR → Complete写ID → Gateway放行新请求

① 中断到达与锁存

外设拉中断信号 → 对应 Gateway 向 PLIC Core 发请求 → PLIC 将该中断源Pending 位(IP)置 1,Gateway 锁定该源(阻止同源重复进入)。

② 仲裁与分发(硬件过滤)

PLIC 对每个 Hart Context 独立评估所有 Pending 中断:

  • 中断在该 Context 的IE 位 = 1(已使能)

  • 中断Priority > 该 Context 的 Threshold

  • 若有多个满足条件,选优先级最高者;优先级相同选ID 最小

通过筛选的最高优先级中断 → PLIC 对该 Hart 置位mip.MEIP(或 sip.SEIP),通知 Hart 有外部中断待处理。

⚠️ PLIC 本身不做中断嵌套,也不自动向多核广播选中——同一中断若多个 Context 都使能,可同时发给多个核(软件需通过 affinity 绑定避免多核争抢)。

③ Hart 陷入与 Claim(软件拉取)

Hart 检测到 MEIP=1 且 mie.MEIE=1 → 进入 Trap → 跳到中断入口。OS 必须读本 Context 的 Claim 寄存器

// 读 Claim 寄存器 → 返回最高优先级 Pending 中断 ID,无则返回 0 uint32_t irq_id = *(volatile uint32_t*)(PLIC_BASE + 0x200004 + ctx_id * 0x1000); // 副作用:PLIC 自动清除该 irq_id 对应的 Pending 位(从仲裁队列移除) if (irq_id != 0) { do_irq_handler(irq_id); // 根据 ID 调对应设备 ISR }
  • 这是原子操作,自动清 Pending

  • 返回 0 说明该 Context 无待处理中断(可能已被别的核 Claim 或未达到阈值)

④ 中断完成 Complete(握手)

ISR 处理完后,将获得的irq_id写回同一 Claim/Complete 地址

// 写回中断 ID → 通知 Gateway 该中断已服务完 *(volatile uint32_t*)(PLIC_BASE + 0x200004 + ctx_id * 0x1000) = irq_id; // Gateway 解除锁定,允许该设备再次向 PLIC 发新请求

PLIC 不校验 ID 是否匹配上次 Claim(但会忽略未使能源的 Complete)。Gateway 收到 Complete 后解除阻塞,同一设备的新中断可再次进入 PLIC。

⑤ 批量处理(可选优化)

高效的中断处理可在 ISR 中用循环不断 Claim 直到返回 0,一次性处理多个 Pending 中断再退出 Trap,减少陷入/退出的开销:

while ((irq_id = read_claim(ctx)) != 0) { handle_irq(irq_id); write_complete(ctx, irq_id); }

三、多核分发与注意事项

  • 中断亲和性(Affinity):通过配置各 Context 的 IE 矩阵决定某中断送给哪个/哪些 Hart。典型做法是一个设备中断只使能在一个 Hart 上(1:1 绑定),避免多核同时 Claim 竞争。

  • SMP 场景:若同一中断源在多个 Context 使能,多个 Hart 都会收到 MEIP,但只有第一个成功 Claim 的 Hart 拿到非零 ID,其余读回 0。

  • 电平触发注意:对于电平触发的设备,必须在 ISR 中清除设备端中断条件后再写 Complete,否则设备保持电平断言,Gateway 会立即重新请求 → 无限重入。

  • Threshold 用法:可动态调高阈值进入临界区屏蔽低优中断,不影响其他核。

如果你需要看具体 SoC(如 QEMU virt、SiFive FU540、K210 等)的 PLIC 寄存器基地址和初始化代码示例,也可以告诉我。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 5:58:35

从门店到全域,从赋能到增长:汇源集团如何搭建全域矩阵营销体系

汇源集团作为国民果汁头部品牌,线下经销商网络覆盖广泛,渠道资源丰富,终端基础与用户底盘十分扎实。在数智化浪潮推动下,集团线上营销能力也迎来了全面升级的重要契机。智行合一科技基于对汇源集团现状的深度诊断,量身…

作者头像 李华
网站建设 2026/5/27 5:58:27

想做游戏无从下手?选对专业开发游戏的外包团队,让创意高效落地

当下游戏行业赛道持续升温,无论是手握趣味玩法的个人开发者、寻求业务突破的初创团队,还是希望借助小游戏做品牌营销的传统企业,都萌生了开发游戏的想法。但组建完整技术团队成本高、周期长、管理难度大,专业开发游戏的外包团队&a…

作者头像 李华
网站建设 2026/5/27 5:56:01

并发、并行与异步:核心概念辨析与工程实践指南

1. 项目概述:从“并发”的迷雾中解放团队“Stop Confusing Workers with Concurrency”——这个标题精准地戳中了现代软件开发中的一个普遍痛点。作为一名在分布式系统和后端架构领域摸爬滚打多年的工程师,我见过太多团队因为对“并发”概念的混淆、滥用…

作者头像 李华
网站建设 2026/5/27 5:50:17

OPC中国是什么?

一文读懂AI智能体时代的一人公司开源社区随着 ChatGPT、DeepSeek、Claude、Gemini 等 AI 大模型的快速发展,越来越多人开始意识到,一个全新的时代正在到来。过去,人们讨论的是互联网、电商、自媒体,而现在,越来越多的人…

作者头像 李华
网站建设 2026/5/27 5:50:08

《重构:改善既有代码的设计》阅读笔记

重构:改善既有代码的设计序言原著作者和我——也就是写这篇阅读笔记的人的观点并不完全相同。比如作者认为只要函数名取得好就不需要注释,甚至以此认为只要是需要注释的代码就可以封装成一个函数哪怕只有一行代码,我却认为英文的函数名再好也…

作者头像 李华
网站建设 2026/5/27 5:48:31

git提交拆分问题以及分批推送

问题: 本地master有100个提交未推送到远程master上,一次推送100个提交到gitlab上会报错,所以只能分次提交,但是第60次提交数据大(可能),需要分成2个新提交解决方法 方法一: 将 Git 全局的 HTTP 推送数据缓冲区大小设置为 524288000 字节(即 500 MB) git …

作者头像 李华