4个版本

0.2.2 2023年2月10日
0.2.1 2022年11月10日
0.2.0 2022年10月24日
0.1.0 2022年4月15日

#5 in #secure-sandbox


用于 2 个crate(通过 dbs-virtio-devices

Apache-2.0

350KB
7K SLoC

dbs-interrupt

中断用于硬件设备向处理器指示异步事件。`dbs-interrupt` crate为`Dragonball Sandbox`提供特性和数据结构,用于管理虚拟和物理设备的中断。

中断会通知处理器存在一个需要中断当前执行代码的高优先级条件。处理器通过暂停其当前活动、保存其状态并执行一个称为中断处理程序(或中断服务例程,ISR)的函数来响应。这种中断是临时的,并且在中断处理程序完成后,除非处理中断时产生了致命错误,否则处理器将恢复正常活动。

硬件中断用于设备通知操作系统需要关注,或者在没有操作系统的情况下,CPU上运行的裸机程序。启动硬件中断的行为称为中断请求(IRQ)。不同的设备通常与不同的中断相关联,使用与每个中断相关联的唯一值。这使得可以知道哪个硬件设备引起了哪个中断。这些中断值通常称为中断线,或简称中断。

如今,中断线不是向处理器传递设备中断的唯一机制。MSI(消息信号中断)是另一种常用的带内信号中断的方法,使用特殊的带内消息替换传统的带外声明专用中断线。虽然在设备上实现起来更复杂,但与基于引脚的带外中断信号相比,消息信号中断具有一些显著的优点。消息信号中断自PCI版本2.2以来就支持PCI总线,并在后来的PCI Express总线中可用。一些非PCI架构也使用消息信号中断。

虽然操作系统在处理硬件中断时常用IRQ术语,但操作系统管理的IRQ号与VMM管理的IRQ号是独立的。为了简单起见,使用“中断源”一词来代替IRQ,以表示基于引脚的中断和MSI中断。

设备可能支持多种类型的中断,每种类型的中断可能支持一个或多个中断源。例如,PCI设备可能支持

  • 传统Irq:恰好一个中断源。
  • PCI MSI Irq:1, 2, 4, 8, 16, 32个中断源。
  • PCI MSIx Irq:2^n (n=0-11)个中断源。

将为每个中断源分配一个独特的中断源标识符(ISID)。将使用ID分配器为设备分配和释放中断源标识符。为了将此crate从ID分配器解耦,这里我们不承担分配/释放中断源ID的责任,而只是使用已分配的ID。

处理中断的整体流程是

  • 虚拟机管理程序创建一个中断管理器
  • 虚拟机管理程序创建一个设备管理器,并将中断管理器的引用传递给它
  • 设备管理器将中断管理器的引用传递给所有已注册的设备
  • 虚拟机内核加载虚拟设备的驱动程序
  • 虚拟设备驱动程序确定所需的中断类型和数量,并更新设备配置
  • 虚拟设备后端请求中断管理器根据虚拟机配置信息创建一个中断组

dbs-device crate提供

许可证

本项目采用Apache许可证,版本2.0

依赖关系

~3MB
~63K SLoC