[virtio](一):`hw/virtio/` 总览
这一组文章从 QEMUhw/virtio/入手拆解 virtio 设备模型、virtqueue、通知机制、transport、vhost、迁移和调试路径。本篇先建立全局地图hw/virtio/到底负责什么读源码时应该从哪里开始。1. 为什么从hw/virtio/开始virtio 是虚拟化 I/O 中最重要的协议之一。传统设备模拟会尽量伪装成真实硬件例如模拟一块网卡或磁盘控制器。这种方式兼容性好但设备语义复杂寄存器访问、中断和状态机都可能带来大量 VM exit 和用户态处理开销。virtio 的思路不同。它不假装自己是一块传统真实硬件而是定义一套 guest 和 host 都理解的虚拟化友好协议。Guest driver 通过共享内存队列提交请求host device model 或 vhost backend 处理请求再通过 used ring 和中断通知 guest 完成。在 QEMU 源码里hw/virtio/承担的是 virtio 设备模型的公共层。它不是某一个具体设备而是很多 virtio 设备共同依赖的骨架。它覆盖的内容包括virtio device 生命周期feature negotiationdevice statusconfig spacevirtqueue 管理notificationinterrupt deliveryvhost 接入migration state具体设备例如 virtio-blk、virtio-net、virtio-scsi、virtio-balloon会建立在这套公共机制之上。2. virtio 的三层结构读 QEMU virtio 源码时最容易混淆的是 device、transport 和 backend。可以先把 virtio 拆成三层virtio device type virtio-blk, virtio-net, virtio-scsi, virtio-balloon virtio transport virtio-mmio, virtio-pci, virtio-ccw virtqueue guest 和 device model 交换请求的共享队列device type 决定设备语义。例如 virtio-blk 处理块请求virtio-net 处理网络包virtio-balloon 处理内存气球。transport 决定 guest 如何发现和配置这个设备。例如 RISC-Vvirtmachine 上常见 virtio-mmio服务器虚拟化里常见 virtio-pci。virtqueue 则是请求传输机制。无论是 virtio-blk 还是 virtio-net最终都要通过 virtqueue 在 guest 和 host 之间交换 descriptor。3. QEMU 中的关键对象阅读hw/virtio/时可以先关注几个核心对象VirtIODeviceVirtQueueVRingVirtioDeviceClassVirtIOMMIOProxyVirtIOPCIProxyvhost_dev其中VirtIODevice是通用 virtio 设备对象。它保存 feature、status、config、queue、interrupt 等公共状态。具体设备通常会把VirtIODevice作为父对象或公共成员再扩展自己的设备状态。简化模型VirtIODevice | -- virtio-blk state -- virtio-net state -- virtio-scsi state -- virtio-balloon stateVirtQueue则表示一条 virtqueue。它不是把 guest 内存里的 vring 复制一份而是记录 guest 提供的 vring 地址、队列大小、索引状态和通知状态。QEMU device model 通过它读取 guest descriptor chain处理完成后写回 used ring。4.hw/virtio/与具体设备目录的关系hw/virtio/中既有公共 virtio 框架也有一部分具体设备实现。常见文件可以粗略分成几类。公共层virtio.cvirtio-mmio.cvirtio-pci.cvhost.cvhost-user.c具体设备virtio-blk.cvirtio-net.cvirtio-scsi.cvirtio-balloon.cvirtio-rng.c头文件和接口通常分布在include/hw/virtio/include/standard-headers/linux/virtio_*.h其中standard-headers里的内容来自 Linux UAPI 相关头文件用来保持 QEMU 和 guest driver 对 virtio 协议结构的理解一致。5. 不要一开始就硬读具体设备很多人第一次读 virtio 源码会直接打开virtio-blk.c或virtio-net.c。这当然可以但容易遇到两个问题。第一具体设备代码会大量调用 virtio 公共函数。如果不了解VirtIODevice和VirtQueue会看不出请求是如何从 guest 内存里被取出来的。第二virtio-net 这类设备本身就很复杂。它涉及多队列、offload、control queue、vhost、迁移和网络后端。直接从这里开始很容易把 virtio 框架问题和网络设备语义问题混在一起。更稳妥的路线是virtio common layer | v virtqueue data path | v transport layer | v simple device: virtio-blk | v complex device: virtio-net | v vhost and migration这条路线先建立协议骨架再进入具体设备。6. 一次 virtio I/O 的全局路径可以用一条 virtio-blk 读请求建立整体直觉Guest process reads file | v Guest VFS / block layer | v virtio-blk driver | | write descriptor chain v virtqueue in guest RAM | | kick v QEMU virtio-blk device model | v QEMU block layer | v host image file / block backend | | completion v used ring interrupt | v Guest virtio-blk driver completes request这条路径里hw/virtio/负责的不是某一个点而是一组机制guest 如何配置设备virtqueue 如何被设置descriptor 如何被取出used ring 如何被写回中断如何被触发vhost 如何接管数据面迁移时状态如何保存7. QEMU、KVM 和 vhost 的分工virtio 经常和 KVM、vhost 一起出现但它们不是同一层东西。KVM 负责 CPU 执行和内核态虚拟化能力。QEMU 负责虚拟整机和设备模型。vhost 负责把某些高频 virtqueue 数据面从 QEMU 下沉到 kernel 或独立用户态 backend。可以粗略理解为QEMU: control plane, device model, migration orchestration KVM: vCPU execution, memory slots, interrupt injection support vhost: fast data plane for selected virtio devices即使用了 vhostQEMU 也不会消失。它仍然负责设备创建、feature negotiation、queue setup、config space、reset、迁移和管理接口。8. 本系列阅读地图这一组文章建议按下面顺序读1. hw/virtio 总览 2. VirtIODevice 与设备生命周期 3. virtqueue 与 descriptor chain 4. notification、eventfd 与中断注入 5. virtio-mmio 与 virtio-pci transport 6. virtio-blk 请求路径 7. virtio-net 与 vhost-net 8. vhost-user 9. virtio 设备迁移状态 10. trace、调试与故障定位这条线覆盖从框架到数据面再到迁移和调试的完整路径。9. 源码阅读入口第一阶段可以先看hw/virtio/virtio.cinclude/hw/virtio/virtio.hhw/virtio/virtio-mmio.chw/virtio/virtio-pci.chw/virtio/vhost.cinclude/hw/virtio/vhost.h阅读时可以带着几个问题VirtIODevice保存了哪些公共状态virtqueue 在 QEMU 中如何表示guest 提交 descriptor 后QEMU 从哪里取request completion 如何写回notification 和 interrupt 如何连接vhost 如何拿到 virtqueue 和 guest memory 信息10. 本篇小结hw/virtio/不是某一个 virtio 设备的实现而是 QEMU virtio 体系的公共骨架。它向上支撑 virtio-blk、virtio-net 等具体设备向下连接 transport、guest memory、eventfd、irqfd、vhost backend 和 migration。读 QEMU virtio 源码最好先理解两个核心对象VirtIODevice设备公共状态和生命周期VirtQueueguest 和 host 交换请求的队列抽象可以把本篇压缩成一句话QEMUhw/virtio/是 virtio 设备模型的中枢它把设备语义、共享队列、通知机制、transport、vhost 和迁移状态连接成一条完整 I/O 路径。11. 下一篇预告VirtIODevice与设备生命周期下一篇进入VirtIODevice。会讨论virtio device statusfeature negotiationconfig spacequeue setupresetDRIVER_OK为什么重要

相关新闻

SuperRDP完全指南:3步解锁Windows远程桌面多用户并发连接

SuperRDP完全指南:3步解锁Windows远程桌面多用户并发连接

SuperRDP完全指南:3步解锁Windows远程桌面多用户并发连接 【免费下载链接】SuperRDP Super RDPWrap 项目地址: https://gitcode.com/gh_mirrors/su/SuperRDP 你是否曾经因为Windows远程桌面只能让一个人连接而烦恼?或者作为Windows家庭版用户&…

2026/10/15 4:55:18 阅读更多 →
深度学习模型可复现性终极指南:从随机种子到GPU计算的确定性训练

深度学习模型可复现性终极指南:从随机种子到GPU计算的确定性训练

1. 项目概述:为什么固定了随机种子,模型结果依然“薛定谔”? 如果你在训练深度学习模型,尤其是像Transformer这类复杂架构时,大概率遇到过这个让人抓狂的问题:明明在代码开头设置了 torch.manual_seed(42)…

2026/10/13 11:38:49 阅读更多 →
Adobe-GenP 3.0终极指南:3分钟免费激活Adobe全家桶软件

Adobe-GenP 3.0终极指南:3分钟免费激活Adobe全家桶软件

Adobe-GenP 3.0终极指南:3分钟免费激活Adobe全家桶软件 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud高昂的订阅费用而烦恼…

2026/10/1 0:29:11 阅读更多 →

最新新闻

基于Spring Boot的医考答题系统:题库管理、自动评分与错题本实战解析

基于Spring Boot的医考答题系统:题库管理、自动评分与错题本实战解析

做医考答题系统这个项目,前后折腾了大概一个多月。从最开始接到需求、梳理业务,到最终把整套Spring Boot系统跑起来并完成部署交付,中间踩了不少坑,也积累了一些实实在在的经验。今天就把这套医考答题练习系统的设计思路、核心实现…

2026/10/15 4:55:06 阅读更多 →
C++机器学习库选型与部署实践:dlib、mlpack与Tiny-DNN深度解析

C++机器学习库选型与部署实践:dlib、mlpack与Tiny-DNN深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 4:55:06 阅读更多 →
Word里一大段文字看得头疼?Copilot可以直接帮你“变成表格”!

Word里一大段文字看得头疼?Copilot可以直接帮你“变成表格”!

会议纪要一大段、项目进展一大段、客户需求又是一大段。 看着密密麻麻的文字,很多人的第一反应就是:先建个表格,再一条条手工复制整理。 但现在,Microsoft 365 Copilot 可以帮你把这些零散内容快速转换成结构化表格,让…

2026/10/15 4:55:06 阅读更多 →
包装智能化转型:定制化与个性化生产的落地路径

包装智能化转型:定制化与个性化生产的落地路径

1. 从一次峰会分享说起:定制化不是口号,是生存问题上个月我去参加了某包装行业峰会的下半场,台上是一家来自华北的包装科技企业(后面简称A企业),分享主题就是“以定制化创发展,以个性化赢未来”…

2026/10/15 4:55:06 阅读更多 →
科研文献检索平台全解析与高效使用指南

科研文献检索平台全解析与高效使用指南

1. 文献检索平台全景概览在科研工作和学术写作中,文献检索是每个研究者必须掌握的核心技能。根据2023年全球学术资源使用调查报告显示,科研人员平均每周花费6-8小时在文献检索和筛选上,而选择合适的检索平台能提升40%以上的工作效率。目前主流…

2026/10/15 4:55:06 阅读更多 →
以图找图:视频创作者的视觉资产调度系统

以图找图:视频创作者的视觉资产调度系统

1. 为什么“以图找图”不是搜索技巧,而是视频创作的底层逻辑很多人第一次听到“以图找图”,下意识觉得这是个图片搜索引擎的进阶用法——上传一张图,平台返回相似图。但我在连续三年、累计完成47个不同主题的视频项目后发现:真正决…

2026/10/15 4:54:05 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →