简介
目前DragonOS的中断异常处理模块是使用C编写的,具有以下问题:
- 不具备架构抽象层
- 没有把IRQ 执行逻辑与底层中断控制芯片的逻辑实现进行解耦。
- 中断向量号是静态分配的,没有“动态分配”机制
- 没有Interrupt line的中断向量共享机制
在目前,上述问题会导致以下的衍生问题:
- smp模块与x86_64强绑定
- IPI功能与x86_64绑定较强。
- 难以为riscv实现中断及异常处理功能
- 设备驱动的中断号需要硬编码,维护困难。
初步设想
参照Linux 6.1.9的架构,实现新的中断异常管理模块。实现类似linux的irq-flow与irq-chip的分层设计,把“中断流”与“芯片细节”进行分离。实现三层的分层:
- 高级驱动程序API
- 高级IRQ流处理程序
- 芯片级硬件抽象
具有全局中断描述符表,每个描述符都有自己的高级IRQ流处理程序,并且提供默认的实现(也就是说驱动程序或者其它组件能够重载部分控制流程)
在实现层面,设想:
- 设计一个IrqChip的trait,对所有的中断控制器进行抽象。
- 全局使用irq_desc数组来描述所有的硬件中断
- 在中断来临时,调用高阶中断流处理程序,根据irq_desc中的数据,来处理中断。
- 每个驱动程序需要实现一个叫做IrqAction的trait,这是驱动程序的中断处理程序。相当于,每个irq_desc下面有0到多个irqAction,从而实现中断共享。
- 支持threaded_irq,对于这类中断,为其创建一个实时内核线程,来完成它的中断下半部的工作。
重构方案
- 【已完成】使用rust重写已有的中断入口程序,以及内核异常处理程序,并把这块的代码转移到arch目录下。
- 【已完成】编写irqChip的抽象
- 为localapic和ioapic实现irqChip抽象。
- 实现generic chip相关代码
- 编写高阶中断描述符,以及相应的高阶api。
- 适配已有的驱动到新的框架上。