[virtio](八):vhost-user 与独立用户态数据面
第七篇讨论了 virtio-net 和 vhost-net。本篇继续看 vhost-user如果 virtio 数据面不在 QEMU也不在 host kernel而是在另一个用户态进程里QEMU 如何把 guest memory、virtqueue 和 eventfd 交给它1. vhost-user 解决什么问题vhost-kernel 把数据面下沉到 host kernel。vhost-user 则把数据面交给一个独立的用户态 backend process。典型场景是高性能网络例如 DPDK 相关后端。模型如下QEMU process | | vhost-user protocol over Unix socket v vhost-user backend process | v high-performance packet processing它的目标是让数据面独立演进让 backend 使用 DPDK/SPDK 等用户态高性能框架避免 QEMU 主循环处理高频数据包在 QEMU 之外部署专门的 I/O backend代价是系统结构更复杂。2. vhost-user 与 vhost-kernel 的区别vhost-kernelQEMU | | ioctl to kernel vhost device v host kernel vhost backendvhost-userQEMU | | Unix socket messages v user-space backend process二者都接管 virtqueue 数据面。区别在于 backend 运行位置不同。vhost-kernel 适合利用内核网络栈和 tap。vhost-user 适合独立用户态包处理、DPDK、用户态存储后端或定制数据面。3. QEMU 仍然是控制面即使使用 vhost-userQEMU 仍然负责 virtio 设备控制面。包括创建设备暴露 transportfeature negotiationdevice statusqueue setupresetmigration coordination管理接口与 backend 建立连接vhost-user backend 处理的是数据面。结构是QEMU control plane | | vhost-user protocol v backend data plane这和 vhost-net 的思想一致只是 backend 从 kernel 变成了另一个用户态进程。4. vhost-user 协议传什么QEMU 和 vhost-user backend 通过 Unix socket 交换控制消息。常见信息包括feature bitsprotocol feature bitsguest memory regionsvring addressesvring sizekick eventfdcall eventfdqueue enable statebackend configurationmigration/inflight state其中 guest memory region 和 vring 信息最关键。backend 要直接处理 guest virtqueue就必须知道guest physical address 如何映射到 backend 可访问的 host virtual address descriptor table 在哪里 avail ring 在哪里 used ring 在哪里 kick/call eventfd 是哪些5. guest memory 如何共享给 backendvhost-user backend 是独立进程。它不能天然访问 QEMU 进程中的 guest RAM。因此 QEMU 需要通过协议把 guest memory region 描述和文件描述符传给 backend。常见方式是基于共享内存 fd。抽象模型QEMU owns guest RAM mappings | | send memory region metadata fd v vhost-user backend maps same memory | v backend can access virtqueue and packet buffers这一步非常敏感。如果 memory table 错误backend 解析 descriptor 时就无法正确访问 guest buffer。6. vring 如何交给 backendGuest 配置 virtqueue 后QEMU 知道 vring 的地址和大小。QEMU 会通过 vhost-user 协议告诉 backendqueue index queue size descriptor table address avail ring address used ring addressbackend 拿到这些信息后就可以像 QEMU 或 vhost-kernel 一样解析 descriptor chain。路径是Guest writes descriptors | v virtqueue in guest RAM | v vhost-user backend maps memory and reads vring | v backend processes I/OQEMU 不再逐个解析高频 descriptor。7. kick 和 call eventfdvhost-user backend 还需要通知机制。QEMU 会把 eventfd 传给 backend。kick fd: guest - backend有新 descriptor call fd: backend - guest有 completion完整路径Guest updates avail ring | | kick eventfd v vhost-user backend wakes | v backend processes descriptors | | call eventfd v KVM injects interrupt / QEMU handles notify | v Guest sees completion如果配置了 irqfdcompletion 可以更快进入 guest interrupt injection 路径。8. vhost-user-net 的典型场景vhost-user-net 常见于 DPDK 场景。结构类似Guest virtio-net driver | v virtqueue in guest RAM | v vhost-user socket | v DPDK backend process | v physical NIC / userspace switch数据包可以在用户态网络栈中高速处理减少传统内核网络栈和 QEMU 主循环开销。常见后端可以是OVS-DPDKVPP自定义 DPDK 程序用户态虚拟交换机9. vhost-user 的复杂度vhost-user 的灵活性来自进程解耦。但复杂度也来自进程解耦。需要处理的问题包括backend 进程生命周期socket 重连feature 兼容memory region 更新queue 启停顺序migration 协调backend 崩溃恢复安全隔离NUMA 和 hugepage placement如果 backend 崩溃QEMU 需要决定 VM 如何表现。如果 memory mapping 不一致backend 可能读错 guest buffer。如果 migration 时 backend 状态没保存target 恢复后可能丢包或 queue 卡住。10. vhost-user 与迁移vhost-user 迁移比基础 QEMU device model 更复杂。因为设备状态分散在 QEMU 和 backend 中。迁移时需要pause or quiesce backend data plane | v collect virtqueue state and inflight descriptors | v serialize QEMU virtio state | v coordinate backend state | v restore on target | v reconnect or start target backend | v resume queues如果存在 in-flight packet 或 request需要确保它不会丢失或重复完成。这也是 vhost-user protocol feature 和 backend migration 能力重要的原因。11. vhost-user 的安全边界vhost-user backend 能访问 guest memory 中的 virtqueue 和 data buffer。这意味着它处在敏感边界上。安全设计需要考虑backend 进程权限shared memory 范围fd 传递sandboxingbackend 输入验证descriptor 合法性检查guest 和 backend 之间的隔离vhost-user 并不因为在用户态就天然安全。它获得了高性能访问能力也承担了正确解析 guest 提供数据结构的责任。12. 源码阅读入口本篇可以看hw/virtio/vhost-user.chw/virtio/vhost.cinclude/hw/virtio/vhost.hinclude/hw/virtio/vhost-user.hhw/net/vhost_net.cnet/vhost-user.cdocs/interop/vhost-user.rst阅读问题QEMU 如何连接 vhost-user socketmemory region 如何发送给 backendvring address 如何设置kick/call eventfd 如何传递backend feature 如何协商backend 启停和 reset 如何处理migration 相关状态如何协调13. 本篇小结vhost-user 把 virtio 数据面交给独立用户态 backend。QEMU 通过 Unix socket 把 guest memory、vring、eventfd、feature 和 queue 状态传递给 backend。backend 直接处理 guest virtqueueQEMU 保留控制面和迁移编排。可以把本篇压缩成一句话vhost-user 用进程边界换取数据面灵活性让 virtio backend 可以独立优化但也把 memory sharing、queue state、迁移和故障恢复变成必须认真处理的系统问题。14. 下一篇预告virtio 设备迁移状态下一篇讨论 migration。会回答virtio 迁移为什么不只是复制 guest RAMqueue index、feature、config 和 pending interrupt 如何保存in-flight request 如何处理vhost backend 如何配合迁移下一篇的问题可以写成一台 VM 迁移到 target host 后guest driver 为什么还能相信 virtio 设备只是暂停了一下

相关新闻

Everspin异步MRAM存储芯片嵌入式系统应用

Everspin异步MRAM存储芯片嵌入式系统应用

在嵌入式系统高速迭代的当下,传统存储芯片难以兼顾高速读写、低功耗与宽温稳定运行等多重需求。MRAM存储芯片凭借独特的自旋电子存储原理,突破了SRAM、Flash等传统存储器件的技术瓶颈,成为工业控制、车载电子、智能物联网等领域的优选非易失性…

2026/10/22 2:24:00 阅读更多 →
Laravel-api-generator高级配置:自定义Model路径、命名空间与软删除实现

Laravel-api-generator高级配置:自定义Model路径、命名空间与软删除实现

Laravel-api-generator高级配置:自定义Model路径、命名空间与软删除实现 【免费下载链接】laravel-api-generator Laravel API/Scaffold/CRUD Generator including Controller, Repository, Model, Migrations, routes.php update. 项目地址: https://gitcode.com…

2026/10/22 18:01:17 阅读更多 →
Mixamo动画导入UE4全攻略:解决骨骼匹配与FBX参数设置

Mixamo动画导入UE4全攻略:解决骨骼匹配与FBX参数设置

1. 项目概述:从Mixamo到UE4的动画流水线搭建 在游戏开发,尤其是独立游戏或中小团队项目中,角色动画的制作往往是成本与效率的瓶颈。自己手K动画对美术功底要求高,而购买动捕设备或高质量动作库又是一笔不小的开销。这时&#xff0…

2026/10/22 19:07:43 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/22 11:01:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/22 21:33:42 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 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/22 22:56:44 阅读更多 →
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/22 22:56:12 阅读更多 →
黑夜航拍船只数据集训练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/22 19:06:46 阅读更多 →