发布时间:2026/9/5 11:01:38
Virtio 系列(一):框架概览 Virtual I/O Device (VIRTIO) Version 1.1概述这是一篇框架概览。图中的中间列表示 virtio 规范定义的 driver-device interface左右两侧分别表示 Linux guest 侧和 VMM/device 侧如何实现这个接口。图中的箭头用于说明主要交互方向不等同于源码中的函数调用顺序。本文中的VMM指 Virtual Machine Monitor即负责创建和运行虚拟机的软件层在讨论 virtio 时本文重点关注它实现 guest 可见设备和后端 I/O 的部分。1. virtio 解决什么问题传统设备模拟让 guest 看到一块“真实硬件”例如 e1000 网卡、IDE 控制器或 UART。兼容性好但寄存器语义复杂虚拟化开销高。virtio 的目标是为虚拟化场景定义一套半虚拟化设备接口。guest 不再模拟操作复杂历史硬件而是通过统一的 virtio 协议与 VMM 侧设备交换控制信息和数据 buffer。它的关键优势在于降低虚拟 I/O 的陷入成本。传统设备模拟往往围绕寄存器级行为展开guest 的大量寄存器访问会触发 trap/VM-exit由 VMM 逐次解释设备语义。virtio 则把高频数据路径放到共享内存 virtqueue 中driver 批量提交 buffer 描述device 批量取走并完成处理VMM 通常只在配置访问、queue notify、interrupt 等事件点介入。换句话说virtio 不是消除 VM-exit而是显著减少“每次 I/O 都围绕寄存器模拟往返”的成本。因此virtio 的价值不仅是性能优化也包括接口标准化同一套控制面、virtqueue 和事件通知机制可以承载 net、blk、console 等多种虚拟设备并通过 feature bits 保持前后端兼容扩展。核心角色如下virtio driverguest OS 中的前端驱动。virtio deviceVMM、host 或其他后端提供的虚拟设备。transport设备暴露和访问方式例如 PCI、MMIO、CCW。virtqueuedriver 与 device 交换 buffer 的共享队列机制。注意virtio 规范中的 driver/device 是协议角色不完全等同于 Linux driver model 中的struct device_driver/struct device。2. Guest / Driver Sideguest 侧主要由三类组件组成。图中组件职责Linux 典型源码Virtio Frontend Driver实现具体设备语义例如 net、blk、consoledrivers/net/virtio_net.c、drivers/block/virtio_blk.c、drivers/char/virtio_console.cLinux Virtio Corevirtio bus、driver/device 匹配、通用 setup 流程drivers/virtio/virtio.c、include/linux/virtio_config.hTransport Driver把 virtio core 的通用操作转换为 PCI/MMIO/CCW 访问drivers/virtio/virtio_mmio.c、drivers/virtio/virtio_pci*图中的Linux Virtio Core: virtio bus virtio setup需要区分两层含义virtio bus是 Linux driver model 中的匹配机制用于绑定virtio_device和virtio_driver。virtio setup是 virtio 初始化流程包括 feature negotiation、status 更新、config access、virtqueue 初始化等。二者不是同一级概念但都属于 Linux virtio core 参与组织或封装的范围。3. Virtio Interface中间列是 virtio 协议接口本身。它不是某个.c文件的归属划分而是 driver 与 device 之间共同遵守的接口模型。3.1 Control Interface控制接口承载低频控制信息device statusfeature bitsdevice-specific config spacereset、config change 等控制语义feature negotiation 和 status state machine 是 virtio 初始化的核心。Linux 前端驱动声明支持的 featurevirtio core 组织协商transport driver 完成底层寄存器或配置空间访问。3.2 Virtqueue / vringvirtqueue 是 virtio 的数据通道。它通过 descriptor、available ring、used ring 等共享内存结构让 driver 和 device 交换 buffer 描述与完成信息。virtqueue 在 Linux 中不是单层独占frontend driver 提供业务 buffer/requestvirtio_ring.c维护 vring 结构并实现 virtqueue APItransport driver 负责 queue setup、notify、interrupt 等 transport-specific 细节VMM 侧 core/backend 负责取出 queue 中的请求并处理。具体的 descriptor table、avail ring、used ring、buffer ownership、notification suppression 等协议细节适合放在后续文章中单独展开。3.3 Event Signaling事件通道只负责通知不承载数据driver notify deviceguest 放入新 buffer 后通知 devicedevice interrupt driverdevice 完成处理后通知 guest。数据仍然通过 virtqueue 交换。notify 和 interrupt 只是提示对方“队列或配置状态可能发生变化”。4. Device Side / VMMVMM 侧不是 Linux 前端驱动的镜像而是虚拟设备的实现侧。图中组件含义QEMU 典型源码Transport Endpointguest-visible 的 PCI/MMIO/CCW 入口hw/virtio/virtio-mmio.c、hw/virtio/virtio-pci.cVMM Virtio Core通用 virtio 状态、feature、vqueue dispatchhw/virtio/virtio.c、include/hw/virtio/virtio.hVirtio Device Backend具体设备模型例如 net、blk、serialhw/net/virtio-net.c、hw/block/virtio-blk.c、hw/char/virtio-serial-bus.cHost I/O Backend具体 host 资源TAP、image file、chardev、ptyTransport Endpoint运行在 VMM/host 侧但它模拟的是 guest 可见的设备入口。guest 通过 PCI、MMIO 或 CCW 访问 virtio 设备VMM 侧再把这些访问转换为通用 virtio 状态、队列分发和具体后端行为。因此VMM 侧不能简单理解成“一个后端驱动”。它通常包含 guest 可见入口、通用 virtio core、具体设备模型以及最终连接 host 资源的 I/O backend。5. 小结virtio 不是某一个驱动而是一套面向虚拟化 I/O 的 driver-device interface。它用共享内存 virtqueue 承载高频数据路径用少量 notify/interrupt 事件同步状态从而避免传统设备模拟中大量寄存器级 trap/VM-exit。从框架图的视角看guest 侧由 frontend driver、Linux virtio core、transport driver 共同实现前端。中间的 control、virtqueue、event signaling 是 virtio 协议接口。VMM 侧由 transport endpoint、virtio core、device backend、host I/O backend 共同实现后端。这种分层视角有助于区分 transport、core、queue、frontend 和 backend 的职责边界也为后续阅读 Linux 与 VMM 侧源码建立统一坐标。。下一篇会继续深入 virtio 协议细节例如 status state machine、feature negotiation、device config space、split/packed virtqueue、notification/interrupt、transport 差异等。

相关新闻

2026/9/5 0:57:50

Nodejsporter 安全实践:确保 RPM 包安全性的完整检查清单

Nodejsporter 安全实践:确保 RPM 包安全性的完整检查清单 【免费下载链接】nodejsporter A rpm packager bot for nodejs modules from npmjs.com 项目地址: https://gitcode.com/openeuler/nodejsporter 前往项目官网免费下载:https://ar.openeu…

2026/8/29 12:55:31

kspack-java贡献指南:参与开源项目的详细步骤与最佳实践

kspack-java贡献指南:参与开源项目的详细步骤与最佳实践 【免费下载链接】kspack-java The components for structure data encode and decode with JAVA 项目地址: https://gitcode.com/openeuler/kspack-java 前往项目官网免费下载:https://ar.…

2026/9/5 11:25:39

VMware替代避坑指南:2026国产超融合选型与迁移实践

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

2026/9/5 11:25:39

Perplexity演示DGX Spark本地运行AI便携电脑,AI助手迈向本地部署

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

2026/9/5 11:25:39

STM8S103+MLX90614红外测温枪硬件设计与低功耗实现

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

2026/9/5 11:25:39

Codex回退对话不回退文件?用检查点快照方案轻松解围

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

2026/9/5 2:46:54

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/5 2:46:52

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/5 2:44:34

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/5 0:04:47

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流在大模型流式输出(Streaming)与智能体实时推流的架构中,生产环境中经常出现一种“上下游生产消费速率严重失衡”的极端情况: 生产端极速产出:大模型…

2026/9/5 2:45:13

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/5 2:46:50

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…