Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
虚拟设备管理设计方案
1. 概述
本文档描述 ArceOS axvisor 虚拟机管理器的虚拟设备管理子系统的设计方案。该系统旨在为虚拟机提供高效、可扩展的虚拟设备管理能力,支持多 vCPU 并发访问和无锁 MMIO 操作。
1.1 设计目标
2. 系统架构
2.1 核心组件
graph TB subgraph "VM CPU 层" VCPU0[vCPU 0] VMCP1[vCPU 1] VCPU2[vCPU N] end subgraph "设备管理层" VDEV_LIST[VDeviceList<br/>设备列表管理器<br/>Arc<RwLock>] VDEV1[VDevice 1<br/>Arc<Mutex>] VDEV2[VDevice 2<br/>Arc<Mutex>] VDEVN[VDevice N<br/>Arc<Mutex>] end subgraph "MMIO 共享层" MMIO[MMIO Regions<br/>UnsafeCell 无锁访问] MMIO1[Device 1 MMIO] MMIO2[Device 2 MMIO] MMION[Device N MMIO] end subgraph "中断管理层" IRQ_BUS[IrqLineBus<br/>中断线管理器] IRQ1[Irq 1<br/>Arc<AtomicBool>] IRQ2[Irq 2<br/>Arc<AtomicBool>] IRQN[Irq N<br/>Arc<AtomicBool>] VGIC[VGIC<br/>中断控制器] end subgraph "设备实现层" PLAT[VDevPlat<br/>平台接口] VIRTIO[VirtIO Device] SERIAL[Serial Device] OTHER[Other Devices] end VCPU0 -->|MMIO Read/Write| MMIO VMCP1 -->|MMIO Read/Write| MMIO VCPU2 -->|MMIO Read/Write| MMIO MMIO --> VDEV_LIST VDEV_LIST --> VDEV1 VDEV_LIST --> VDEV2 VDEV_LIST --> VDEVN VDEV1 -.try_lock.-> VDEV1 VDEV2 -.try_lock.-> VDEV2 VDEVN -.try_lock.-> VDEVN VDEV1 -->|invoke| VIRTIO VDEV2 -->|invoke| SERIAL VDEVN -->|invoke| OTHER VDEV1 -->|set true| IRQ1 VDEV2 -->|set true| IRQ2 VDEVN -->|set true| IRQN IRQ1 --> VGIC IRQ2 --> VGIC IRQN --> VGIC VGIC -->|Inject IRQ| VCPU0 VGIC -->|Inject IRQ| VMCP1 VGIC -->|Inject IRQ| VCPU22.2 数据结构
2.2.1 虚拟设备 (VDevice)
2.2.2 设备列表 (VDeviceList)
2.2.3 中断线 (IrqLine)
3. MMIO 处理流程
3.1 读操作流程
sequenceDiagram participant vCPU as vCPU 线程 participant MMIO as MMIO Regions participant List as VDeviceList participant Dev as VDevice participant Impl as DeviceImpl vCPU->>MMIO: handle_mmio_read(addr, width) MMIO->>MMIO: 查找地址匹配的 MMIO 区域 alt 找到匹配区域 MMIO->>List: 返回 (dev_id, offset, region) List->>Dev: device_try_invoke(dev_id) Dev->>Dev: try_lock() alt 获取锁成功 Dev->>Impl: invoke() Impl->>Impl: 处理设备逻辑 Impl-->>Dev: 完成 Dev-->>List: 释放锁 else 获取锁失败 Note over Dev: 其他 vCPU 正在处理<br/>跳过本次调用 end List->>MMIO: 直接读取内存 MMIO-->>vCPU: 返回数据 else 未找到区域 MMIO-->>vCPU: 返回 None end3.2 写操作流程
sequenceDiagram participant vCPU as vCPU 线程 participant MMIO as MMIO Regions participant List as VDeviceList participant Dev as VDevice participant Impl as DeviceImpl vCPU->>MMIO: handle_mmio_write(addr, width, data) MMIO->>MMIO: 查找地址匹配的 MMIO 区域 alt 找到匹配区域 MMIO->>List: 返回 (dev_id, offset, region) List->>MMIO: 直接写入内存 List->>Dev: device_try_invoke(dev_id) Dev->>Dev: try_lock() alt 获取锁成功 Dev->>Impl: invoke() Impl->>Impl: 处理设备逻辑<br/>可能需要发送中断 Impl->>Impl: irq_handle.set(true) Impl-->>Dev: 完成 Dev-->>List: 释放锁 else 获取锁失败 Note over Dev: 其他 vCPU 正在处理<br/>跳过本次调用 end MMIO-->>vCPU: 返回 Some(()) else 未找到区域 MMIO-->>vCPU: 返回 None end3.3 MMIO 并发控制设计
关键特性:
UnsafeCell存储,vCPU 可以直接读写,无需加锁Mutex,互不影响try_lock()而非lock(),避免 vCPU 互相阻塞4. 中断处理流程
4.1 中断线模型
graph LR subgraph "设备侧" DEV[虚拟设备] end subgraph "中断线" HANDLE[IrqLineHandle<br/>Arc<AtomicBool>] end subgraph "中断控制器" BUS[IrqLineBus] VGIC[VGIC Controller] end subgraph "vCPU 侧" VCPU[vCPU 线程] end DEV -->|1. set true| HANDLE HANDLE -.共享.-> BUS BUS -->|2. 轮询检测| VGIC VGIC -->|3. 注入中断| VCPU4.2 中断发送流程
sequenceDiagram participant Dev as 虚拟设备 participant Handle as IrqLineHandle participant Bus as IrqLineBus participant VGIC as VGIC participant vCPU as 客户机 vCPU Dev->>Handle: send_irq(irq_num) Handle->>Handle: signal.store(true, Ordering::Release) Note over Handle: 原子操作,无需锁 loop 中断控制器轮询 Bus->>Bus: poll_irq_lines() alt 检测到中断信号 Bus->>Handle: signal.load(Ordering::Acquire) Handle-->>Bus: true Bus->>Handle: signal.swap(false, Ordering::AcqRel) Bus->>VGIC: inject_irq(irq_num) VGIC->>vCPU: 注入虚拟中断 Note over vCPU: 客户机处理中断 end end4.3 中断线管理器实现
4.4 设备发送中断
5. 设备注册和管理
5.1 设备注册流程
sequenceDiagram participant User as 用户代码 participant List as VDeviceList participant Plat as VDevPlat participant Bus as IrqLineBus participant Space as VmAddrSpace User->>List: add_device(builder) List->>List: new_plat() List->>Plat: 创建平台对象 Plat->>Plat: 分配设备 ID User->>Plat: builder(&plat) Plat->>Bus: alloc_irq(irq_num) Bus-->>Plat: IrqLineHandle Plat->>Space: alloc_mmio_region(addr, size) Space-->>Plat: MmioRegion User->>Plat: 创建设备实例 Plat-->>List: 设备对象 List->>List: VDevice::new(id, device) List->>List: 存入设备列表 List-->>User: Ok(())5.2 平台接口实现
6. 并发控制和性能优化
6.1 锁策略
6.2 并发场景分析
场景 1: 多 vCPU 同时读取不同设备
场景 2: 多 vCPU 同时读取同一设备
场景 3: 多 vCPU 读写不同 MMIO 区域
6.3 性能优化要点
try_lock避免 vCPU 互相阻塞AtomicBool保证无锁中断通知RwLock7. 可行性分析
7.1 技术可行性
✅ 已验证组件:
UnsafeCellVDevice已使用Arc<Mutex>try_invoke()已实现try_lock()IrqLineBus中断线管理器IrqLineHandle中断线句柄VirtPlatformOp的中断方法7.2 性能预期
7.3 内存安全
Rust 类型系统保证:
Arc确保线程安全的引用计数Mutex确保设备状态的独占访问AtomicBool确保中断线的原子操作unsafe块封装在安全接口内需要额外注意:
UnsafeCell需要手动同步保证8. 潜在风险和缓解措施
8.1 并发风险
8.2 性能风险
8.3 正确性风险
9. 实施计划
9.1 实施阶段
Phase 1: 中断线基础设施
IrqLineHandleIrqLineBusPhase 2: 平台接口完善
VirtPlatformOp::alloc_irqVirtPlatformOp::send_irqVDevPlatPhase 3: 中断控制器集成
Phase 4: 优化和测试
9.2 测试策略
单元测试:
IrqLineBus并发测试IrqLineHandle原子性测试集成测试:
压力测试:
10. 附录
10.1 相关文件
10.2 参考资料