USB ISO 传输队列逻辑图
本文详细分析了QEMU中USB ISO传输的队列管理逻辑,包括USBHostIsoRing结构体的三个队列(unused、inflight、copy)的状态转换和生命周期管理。
概述
USB ISO传输是USB协议中用于实时数据传输的重要机制,在QEMU虚拟化环境中,通过libusb库实现与物理USB设备的通信。USBHostIsoRing结构体管理着三个关键队列,确保数据传输的连续性和实时性。
逻辑图
注意: 如果SVG图片无法正常显示,请确保您的浏览器支持SVG格式,或者查看下方的ASCII图表。
USBHostIsoRing 结构
1 | ┌─────────────────────────────────────────────────────────────┐ |
队列状态转换流程
1. ISO IN 传输流程
1 | Guest 请求数据 |
2. ISO OUT 传输流程
1 | Guest 发送数据 |
队列管理操作
主要操作函数
- QTAILQ_INSERT_TAIL(&ring->inflight, xfer, next) - 添加到 inflight
- QTAILQ_REMOVE(&ring->inflight, xfer, next) - 从 inflight 移除
- QTAILQ_EMPTY(&ring->inflight) - 检查 inflight 是否为空
状态转换条件
1 | // 检查是否有正在进行的传输 |
队列生命周期
1. 初始化阶段
1 | ┌─────────────────────────────────────────────────────────────┐ |
2. 运行阶段
1 | ┌─────────────────────────────────────────────────────────────┐ |
3. 清理阶段
1 | ┌─────────────────────────────────────────────────────────────┐ |
关键数据结构
1 | struct USBHostIsoRing { |
总结
这个逻辑图展示了 USB ISO 传输中三个队列的完整生命周期和状态转换关系。通过合理的队列管理,QEMU能够:
- 保证实时性: 通过inflight队列管理正在进行的传输
- 提高效率: 通过unused队列复用传输对象
- 确保数据完整性: 通过copy队列管理数据复制过程
- 优化性能: 通过条件检查避免不必要的传输
相关代码位置
- 主要文件:
hw/usb/host-libusb.c - 关键结构:
USBHostIsoRing - 核心函数:
usb_host_iso_data_copy()usb_host_iso_xfer_complete()usb_host_iso_submit()
参考资料
- 本文作者: crazyboy
- 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2024/01/15/it/linux/qemu/usb/host-libusb/usb_iso_queue_logic/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!