用户态中断 #
基本介绍 #
现代应用处理器通常采用多特权级的设计,限制低特权级的程序访问一些特殊寄存器、内存区域或执行特权指令, 以提高系统的安全性与隔离性。在通用的处理器硬件上,一般有两种方式会导致特权级的切换,同步的异常(系统调用和指令异常)和异步的中断。而特权级的切换往往会导致相当大的开销,主要包含了两部分:
- 直接开销:特权级切换需要执行额外的指令用来切换上下文。
- 间接开销:特权级切换在双页表系统中需要切换页表,同时刷新快表和CPU缓存,造成缓存失效,降低CPU执行效率。
中断和异常一般都由内核态捕获后进行初步的处理,对于微内核而言,可能会将捕获的中断包装成信号,然后转发给用户态程序进行处理。用户态程序通过轮询或阻塞等待的方式接受异步信号。整个流程需要内核的进行转发。
用户态中断是一种新兴的硬件方案,它在CPU中新增中断代理机制和用户态中断的状态寄存器来实现无需内核参与的中断传递机制。当中断代理机制检测到状态寄存器发生变化时,会将中断以硬件转发的形式传递给用户态程序,从而绕过内核。该硬件方案已经在Sapphire Rapids x86处理器上和RISCV的N扩展中有了一定的支持,适用范围相对广泛。
RISC-V用户态中断的软硬件接口 #
硬件接口 #
- 控制寄存器
- suist(User Interrupt Sender Table)
- 用于保存发送方的状态表(主要保存了状态项的物理叶帧号)
- 每个状态项包含了发送向量(发送方标识),接收方标识
- suirs(User Interrupt Receiver Status)
- 主要包含了一个接收方状态表下标。
- 接收方状态项包含了绑定当前接收方的hart id以及已经触发的中断号。
- suist(User Interrupt Sender Table)
- 新增指令uipi
- R型指令
- 为发送端和接收端提供send和recv的操作。
- 用户态中断控制器
- 维护接收方状态:判断接收方是否在该核心上运行
- 向目标核发送中断:uip.USIP
- 读写端口映射
软件接口 #
接收方
- 注册中断处理函数。
- 注册中断向量。 发送方:
- 根据接收方的recv id注册发送表项。
- 根据注册结果执行 uipi.send发送中断。