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)
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提供
- trait InterruptManager:管理虚拟设备后端的中断源
- struct DeviceInterruptManager:[InterruptManager]的实现,管理设备的中断和中断模式
- trait InterruptSourceGroup:管理设备的一组中断源,提供控制中断的方法
- enum InterruptSourceType:中断源类型
- enum InterruptSourceConfig,struct LegacyIrqSourceConfig和struct MsiIrqSourceConfig:中断源配置数据
许可证
本项目采用Apache许可证,版本2.0。
依赖关系
~3MB
~63K SLoC