Skip to content

深入 DULI ​

DULI 是一种处理器扩展,而不是调度器技巧。它改变的是中断被应答的那一刻: 不再进入内核,而是由硬件把目标处理程序连同它被允许运行的各个保护域一起激活。

隔离与确定性的矛盾 ​

微内核把每个组件隔离为非特权进程,这是现代安全嵌入式软件的基础。但组件的 中断处理程序恰恰卡在边界的两侧:

  • 放在内核里,处理程序获得内核级速度,但组件的不可信代码进入了特权代码 库——与隔离背道而驰。
  • 放在进程里,处理程序受到约束,但每次激活都要一次内核往返。转发开销是 内核级中断的十倍以上。

现有的用户级中断机制只在目标进程已经运行时才有帮助。Intel UINTR 与 RISC-V N 扩展在目标被调度时走短路径;目标休眠时,内核必须切换过去,延迟进入慢路径。 结果是双峰分布:平均吞吐变好,最坏情况没有改善。SBI 只在每个核上为一个受信任 进程解决了确定性问题。

方案空间隔离时间隔离多进程中断延迟确定性
TockOS(内核处理程序)有有有高中
Hopter———中中
CV32RT———低高
RTOSUnit———低高
UINTR / RISC-V-N有—有低(仅快路径)低
SBI(TrustZone-M)有有单进程低高
DULI有有有低高

一个中断,两个域 ​

每个用户级中断都由一条**中断标识数据(IID)**表项描述。中断到来时,这条表项 回答三个问题:

  1. 这个中断源属于用户级还是内核级?
  2. 它的处理程序运行在哪个空间域——指向 PMP 表项的一个指针,表项里是完整 的 PMP 配置;
  3. 它运行在哪个时间域——指向一个 32 位执行预算的指针,预算被装入硬件 倒计时器。

多个中断可以共享同一个空间域、同一个预算,或两者都共享。映射只存在于 IID 中, 内核更新它时不需要改动中断向量表。

交付路径 ​

识别中断控制器查询 IID 单元。CAM 查表(V5)或 RAM 表读取(V1/V2)判断该中断源是否用户级,以及它指向哪些保护域。
关键路径
激活保护域PMP 配置从 PMP 表装入;执行预算从预算表装入倒计时器。两者都是普通内存读取,可以并行进行。
并行
上下文隔离被中断的寄存器组——连同 mepc、mcause、mtval 和内部中断状态共 160 字节——保存到寄存器组或溢出到 TCM,并在处理程序看到之前清零。
V5 用寄存器组
执行处理程序用户级向量在非特权模式下开始执行。处理程序运行到完成,以一条自定义的 uiret 结束。
延迟到此结束
返回剩余预算写回预算表,上下文与被中断的 PMP 配置恢复,被抢占的执行继续。
无内核代码

在 V5 变体中,IID 查询折叠进中断应答周期,上下文使用寄存器组,因此建模的入口 延迟为 11 个周期——在 50 MHz FPGA 上端到端实测为 15 个周期。

隔离是被执行的,而不是被承诺的 ​

处理程序默认不可信。两种硬件条件会终止它:

  • 空间违规——PMP 拒绝了域外访问。处理程序被立即强制返回,不经过内核。
  • 时间违规——预算计数到零。处理程序被强制返回,剩余预算记为零。

同步异常遵循同样的规则:出错指令不会同步陷入内核(那会造成不安全的内核重入)。 错误原因记录在一个可选 CSR 中,处理程序立即返回,内核可以在所有嵌套用户级中断 退出之后再异步检查这条记录。

因为用户级中断可能抢占内核本身,内核管理的 PMP 寄存器组会被影子备份,内核自己 的定时器在处理程序执行期间暂停。内核随后从原处继续,仿佛什么都没发生。

有界嵌套 ​

用户级处理程序之间可以互相抢占。硬件为嵌套上下文保留额外的寄存器组;寄存器组 用尽时,确定性地溢出到紧耦合内存。因此 V5 有一条有界的快路径和一个优雅的降级 路径:寄存器组耗尽时退化为 V2 的延迟,而不是失败。

抢占优先级在注册处理程序时配置。这个扩展刻意不是调度器——处理程序运行到 完成,内核按照可延迟服务器(deferrable server)策略补充预算。

软件视角 ​

内核只暴露一个很小的 API,其余全部由硬件完成:

C
/* 注册用户级中断:向量、处理程序、调度策略 */
int_reg(INT_UART0, uart_handler, POLICY_DEFERRABLE);

/* 设置硬件抢占优先级并使能 */
int_prio(INT_UART0, 2);
int_ena(INT_UART0);
C
void uart_handler(void)
{
    /* 在注册的 PMP 域内以非特权模式运行 */
    UART0->DATA = UART0->DATA;
    uiret();            /* 返回被抢占的上下文 */
}

内核的进程管理模块分配 IID 表项与 PMP 域;预算管理模块写入预算表项,并按服务器 周期补充。中断路径上不需要增加任何内核代码。

兼容性 ​

DULI 增加少量 CSR:duictl(全局使能与 IID 基址)、duistk(溢出栈)、 duiepc(被中断的 PC)以及 iid* CAM/表寄存器。清零 duictl 的第 0 位即可 关闭整个扩展,此时核心表现为标准 RISC-V 处理器。传统中断仍使用原向量表与原入口 路径,现有固件和 RTOS 不需要修改。

当前原型面向单核 RISC-V;多核路由与仲裁明确属于未来工作。

面向确定性用户级中断的硬件研究扩展。

DULI·确定性用户级中断硬件扩展·www.runyupan.com·rypan@rtospro.com·开源工件