【开发进展】中断管理模块重构

简介

目前DragonOS的中断异常处理模块是使用C编写的,具有以下问题:

  • 不具备架构抽象层
  • 没有把IRQ 执行逻辑与底层中断控制芯片的逻辑实现进行解耦。
  • 中断向量号是静态分配的,没有“动态分配”机制
  • 没有Interrupt line的中断向量共享机制

在目前,上述问题会导致以下的衍生问题:

  • smp模块与x86_64强绑定
  • IPI功能与x86_64绑定较强。
  • 难以为riscv实现中断及异常处理功能
  • 设备驱动的中断号需要硬编码,维护困难。

初步设想

参照Linux 6.1.9的架构,实现新的中断异常管理模块。实现类似linux的irq-flow与irq-chip的分层设计,把“中断流”与“芯片细节”进行分离。实现三层的分层:

  • 高级驱动程序API
  • 高级IRQ流处理程序
  • 芯片级硬件抽象

具有全局中断描述符表,每个描述符都有自己的高级IRQ流处理程序,并且提供默认的实现(也就是说驱动程序或者其它组件能够重载部分控制流程)

在实现层面,设想:

  1. 设计一个IrqChip的trait,对所有的中断控制器进行抽象。
  2. 全局使用irq_desc数组来描述所有的硬件中断
  3. 在中断来临时,调用高阶中断流处理程序,根据irq_desc中的数据,来处理中断。
  4. 每个驱动程序需要实现一个叫做IrqAction的trait,这是驱动程序的中断处理程序。相当于,每个irq_desc下面有0到多个irqAction,从而实现中断共享。
  5. 支持threaded_irq,对于这类中断,为其创建一个实时内核线程,来完成它的中断下半部的工作。

重构方案

  1. 【已完成】使用rust重写已有的中断入口程序,以及内核异常处理程序,并把这块的代码转移到arch目录下。
  2. 【已完成】编写irqChip的抽象
  3. 为localapic和ioapic实现irqChip抽象。
  4. 实现generic chip相关代码
  5. 编写高阶中断描述符,以及相应的高阶api。
  6. 适配已有的驱动到新的框架上。

参考

1 个赞

2024年2月18日

情况

目前实现了irqchip和irqdesc相关的数据结构,并且在系统初始化的时候能创建irq_desc.

todo:

  1. 把irqdesc添加到sysfs

补充:已经把irqdesc添加到sysfs了。

x86_64下的新的中断处理模块已经完成,正在实现riscv的支持