5. Interrupt

微内核的中断处理可以被转发到用户态。这里我们讨论外部中断的管理。

1. 基于内核的用户态中断代理机制 #

seL4在内核中维护了一个外部中断号到IRQHandler的映射表,被用户态代理的中断需要通过系统调用在这个映射表中注册一个对应的notification内核对象。

当外部中断到来时,内核会首先捕获到该中断,然后根据中断号查询映射表,对于未被用户态代理的中断(如时钟中断、核间中断等),由内核进行处理。对于被用户态代理的中断,内核会根据映射表拿到对应的IRQHandler,并取出对应的Notification对象,通过往对象中发送通知的形式,通知用户态。

用户态线程注册映射表之后,会调用Wait或者Poll系统调用等待中断到来。当中断到来时,内核发送通知,用户态线程被唤醒并被重新调度,执行相应的中断处理程序。

2. 基于硬件的用户态中断代理机制 #

上面的流程可以看出,中断代理基于notification机制,需要接收方主动陷入内核询问,在中断到达之后还需要重新切换回用户态,这里存在两个问题:

  • 接收方需要主动陷入内核,时机难以掌握,并发性差。
  • 由两次特权级的切换。

因此我们使用U-notification来代替,用户态线程注册完成映射表之后,无需主动询问内核,只需要关注其他可执行的协程,当中断到来时,内核会通过U-notification发送核间中断将其打断并处理相应的中断。

Interface #

  • seL4_IRQControl_Get:获取IRQ控制器
  • seL4_IRQHandler_SetNotification:注册代理中断对应的Notification
  • seL4_IRQHandler_Ack:响应中断
  • seL4_IRQHandler_Clear:清除中断