Virtio I/O 虚拟化(一):Split Virtqueue

网络虚拟化——virtio 前言 在上一篇文章(网络虚拟化——QEMU虚拟网卡)中,讨论了经典的网络设备全虚拟化技术。这种技术不需要guest内核对虚拟网络设备有任何的感知和特殊处理,但性能较差,一次读写操作可能会产生多次需要Hypervisor模拟实现的行为。 为了改善虚拟网络设备的性能,各类Hypervisor都提供了自己的半虚拟化网络技术。在这种模式下,guest内核中使用的网络设备和驱动是为虚拟化场景特殊设计和实现的,驱动的实现特别适配了Hypervisor的一些特性,尽量减少了需要Hypervisor介入进行模拟实现的指 阅读详情

Virtio 是一个半虚拟化 I/O 抽象层,通过 host-guest 共享内存的方式实现了高效的数据交换。基于 virtio 技术的一系列设备在虚拟化中大放异彩:网卡虚拟化 virtio-net,共享文件系统 virtio-fs 等等。

Kata Containers 是一个基于虚拟机的容器运行时,也大量的使用了 virtio 技术。Dragonball 是一个为云原生场景优化的轻量虚拟机,也是 runtime-rs 的默认 VMM,为用户提供了开箱即用的体验。在这个系列的文章中,将会借助 Dragonball 的实现,深入探讨 virtio 的实现细节。

在开始前将会定义一些术语。不同的文章对 host 端和 guest 端有不同的描述,设备(device)和后端(backend)都表示 host 端,驱动(driver)和前端(frontend)都表示 guest 端。

Split virtqueue

顾名思义,split virtqueue 根据功能分出了几个独立的区域(area)。尽管 virtio spec 1.1 引入了更高效的 packed virtqueue,但是较为复杂且核心概念是一致的,因此 packed virtqueue 将在随后的文章中介绍。

Virtqueue 是一块由 guest 申请的内存区域,共享给 host 的 VMM 使用。换句话说,host 只有使用权。其内存空间属于 guest 内存空间,必须先翻译到 host 地址空间后才能被 device 使用,主要的翻译方式有三种:

•Emulated device(适用于 virtio-* 设备):guest 地址空间翻译为 hypervisor 的地址空间。

•其他 emulated device(适用于 vhost-* 和 vhost-user-* 设备):一般通过 POSIX 共享内存的方式将内存 offload 到内核空间或者其他用户进程,需要将 guest 地址空间翻译为内核内存空间或其他用户进程的地址空间。

•硬件翻译:一般通过 IOMMU 翻译地址。

915e54dce3d615981c1cd83ae9419709.jpeg

上图[1] 展示了 Linux 内核中 virtqueue 及其相关结构体的层次关系,它被分为了三个部分:

Avail vring 和 used vring 本质上是一个环形队列数据结构。

一个 virtqueue 已经具备了全双工通讯,但是处于性能的考虑一些 virtio 设备会使用至少一对 queues,每个 queue 负责一个单向的数据传递。比如 virtio-net 使用了至少一组 rx queue 和 tx queue 实现网络数据包的交换,前者用于 host 到 guest 的数据传输,后者则用于 guest 到 host 的数据传输。

Descriptor Table

介绍

Descriptor table 保存了一组 descriptors,descriptor 的结构体类型是 vring_desc,它的定义如下所示。

struct vring_desc {
    __virtio64 addr;
    __virtio32 len;
    __virtio16 flags;
    __virtio16 next;
};

Descriptor 可以被看作是一个指向实际数据 buffer 的指针,addr 和 len 分别确定了 buffer 的起始地址和长度,唯一确定了 buffer 的位置。

21ee1b5f17e16b8c58102929e8efc124.jpeg

Flags 字段有几个比较典型的标志位:

•VRING_DESC_F_NEXT (0x1): 表示当前 descriptor 是否链接了额外一个 descriptor(稍后详细介绍)。

•VRING_DESC_F_WRITE (0x2): 表示 buffer 是否可以被 device 写入。一个 buffer 只能被一端写入,比如当 VRING_DESC_F_WRITE 标志位置 1 时意味着 device 只写(driver 只读),反之没有该标志位则 device 只读(driver 只写)。

需要注意的是,VRING_DESC_F_WRITE 控制的是 buffer 的写入权限,但是 descriptor table 只能由 driver 更新!

e8c29f37816cc55864cc58ef2cd78646.jpeg

这张图对上面介绍的内容做了小结:

•Driver(绿色)对 descriptor table 有读取写权;如果 VRING_DESC_F_WRITE 存在,对 buffer 只读,否则只写。

•Device(红色)对 descriptor table 只读;如果 VRING_DESC_F_WRITE 存在,对 buffer 只写,否则只读。

Chained Descriptors

VRING_DESC_F_NEXT 标志位和 next 字段的作用是实现链式(chained)descriptors,也就是将多个 buffer 合并为一个大的逻辑 buffer,如下图所示。

b13e24675aedfb1563d70a8aaa0fee4c.jpeg

VRING_DESC_F_NEXT 标志位表示数据没有结束,需要读取 next 字段以获取下一个 descriptor 索引。一个链式descriptor 之间不共享 flags,也就说一个 buffer 的写权限是由 descriptor 的 VRING_DESC_F_WRITE 标志位决定。

链式 descriptor 被顺序划分为 driver 写和 device 写两组,因为一个请求大概率既有输入也有输出,这样一次完整的数据交换就可以在一个链式 descriptors 中完成了。

Indirect Descriptors

Indirect descriptors 对应的 flag 是 VIRTQ_DESC_F_INDIRECT (0x4)。该标志位表面一个 descriptor 包含了一个子 descriptor table。带来的好处是 descriptor table 承载的 descriptor 数量增加(类比多级页表)。

Avail Ring

Avail ring 存放的是等待 device 消费的 descriptor 索引,只能由 driver 更新。Descriptor table 是一个数组,通过 descriptor 索引就能定位到 descriptor,进而定位到 buffer。

struct vring_avail {
    __virtio16 flags;
    __virtio16 idx;
    __virtio16 ring[];
};

Avail ring 在 Linux 的定义如上所示,需要说明的是:

•__virtio16 表示小端 u16 的类型。

•flags 是标志位,比如 VIRTQ_AVAIL_F_NO_INTERRUPT 标志位标识当有新的索引被添加到 avail ring 之后是否立即通知 device(如果数据频繁到达,频繁通知可能导致性能低下)。

•idx 表示下一个 driver 写入的 ring 的位置。

•ring 是循环队列的数据存储部分(a.k.a. 数组),它的长度是 queue size。

8896fed6870210006bbeee4c500daf36.jpeg

Avail ring 与 descriptor table 的关系如上图所示(图片来源于 RedHat[2]),driver 在 ring[0] 中存储了 0,表示 avail ring 第一个等待 device 消费的 descriptor 索引是 0,即红色标识行。同时 idx 自增 1,意味着下一次 driver 需要将 descriptor 索引写到 ring[1]。

那么又有一个新问题:driver 使用的 buffer 是哪来的?有两个途径(1)driver 新申请一个 buffer,再填入到 descriptor table。(2)Driver 复用已申请过的空闲 buffer(当然不同的 driver 表现不一致)。

Avail ring 的长度与 descriptor table 的长度保持一致,且它们的长度必须是 2 的幂,比如 256、512 等等。

Driver 想要发送一个数据的流程是:

1.搞到一块可以用的 buffer 并填充数据(假设地址是 0x8000,长度是 2000)。

2.将 buffer 信息填充到 descritptor table 中。

3.将对应的 descriptor 索引写入到 avail ring 的 ring[idx] 后,idx 自增。此时 driver 不能对这个 buffer 以及这个 avail ring item 进行任何的操作了。

4.通过中断通知 device 有新数据到达。

5.等待 device 消费。

Used Ring

Used ring 的作用是归还 driver 已申请的 descriptor 和 buffer。Used ring 与 avail ring 在结构上基本一致,由 device 维护(对 driver 只读),其数据结构如下所示。

struct vring_used_elem {
    __virtio32 id;
    __virtio32 len;
};


typedef struct vring_used_elem __attribute__((aligned(VRING_USED_ALIGN_SIZE)))
    vring_used_elem_t;


struct vring_used {
    __virtio16 flags;
    __virtio16 idx;
    vring_used_elem_t ring[];
};

与 avail ring 相比,最大的区别是 ring 的类型从 __virtio16 数组变成了 vring_used_elem_t 数组,它不仅保存了索引还存了写入的长度。这样的原因是 driver 能够确定 buffer 长度并写入 descriptor table,但是 device 没有这个权力。因此 device 只能被迫在自己能掌控的 used queue 告知 driver 写入长度。

c77d3546576cbdf197688b308b3860f7.jpeg

这张图隐含了一个链式 descriptor(因为它已经超过了 buffer 0x8000 的长度了),它表明 device 写入链式 buffer 的长度为 0x3000。

之前提到过 virtio 设备出于性能的考虑都会单独设置一个 rx queue 用于 host 到 guest 的数据传递(guest 到 host 的数据传递是通过 tx queue)。那么 host 既没有申请 buffer 的权力,也没有更新 descriptor table 的权力,那一开始没有任何可用的 buffer 时如何向 guest 传递数据呢?

一般拥有 rx queue 的设备都会在每次 rx queue 被唤醒的时候检查 rx buffer 的数量。以 virtio-vsock 为例,当 buffer 数量低于最大数量的一半时,virtio-vsock 的 driver 就会主动申请 buffer 放入到 avail ring 中供 device 使用。

Device 更新了 used vring 后,driver 是如何处理和回收 descriptor 和 buffer 呢?下面这张图展示了一个链式 descriptor 被回收的过程,蓝色的 descriptors 表示 driver 下一个消费的一个链式 descriptor,绿色表示空闲(free)descriptor。

e80f60209ee83bd4296d2bebbf8600fd.jpeg

Virtqueue 根据 used ring 的 id 字段找到下一个被消费的 desc,然后将它们(上图的 #0、#2 和 #3)的 addr 字段置空,同时将它们链接到空闲链式 desc 中,这实现了 descriptor 回收。

虽然 addr 被设置了空值(NULL),但是 buffer 并没有被从内存中清理,而是交给了上层 driver 处理,比如 virtio-net 设备就会处理网络包。在 driver 处理完毕之后,该 buffer 才会真正被系统回收。

致谢

「Virtqueues and virtio ring: How the data travels」是一篇由 RedHat 发布的介绍 virtio 的文章,是一篇完成度非常高的文章。本文也受到该文章的启发,它的原版文章非常值得一读。

References

[1] 「Introduction to VirtIO」: https://blogs.oracle.com/linux/post/introduction-to-virtio
[2] 「Virtqueues and virtio ring: How the data travels」: https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels

浅析virtio技术(2)virtio设备管理 virtio协议定义了virtio通信遵循的接口,包含设备状态、设备支持的特性以及前后端数据传输的通道(virtqueue)。目前在使用的virtio规范有三个版本0.95、1.0和1.1。0.95版本是目前广泛在使用的版本,称为传统模式;1.0版本中协议将设备的配置部分做了一些调整,被称为现代模式;1.1版本则主要是新增了packedvirtqueue的支持。本文重点关注于virtio设备相关的规范定义。... 阅读详情

相关推荐

Virtqueue共享内存解析:虚拟化I/O环形队列与vhost-user实践

共享内存是提升系统I/O性能的核心技术之一,在虚拟化场景中,Virtqueue以环形缓冲区形式为前后端提供无锁数据通路。理解其原理,需掌握描述符表、可用环与已用环的协作,以及GPA到HVA的地址转换。基于共享内存的virtio方案减少了VM-Exit与数据拷贝,成为虚拟化设备高性能的关键。vhost-user通过fd传递将共享内存扩展到用户态,适用于DPDK等场景。本文围绕Virtqueue共享内存的落地方式、调优与常见坑展开,为开发者提供工程参考。

weixin_29323493的博客 253

浅析virtio技术(1)基本原理

virtio是当前主流的IO半虚拟化解决方案,其主要目标是在虚拟机和Hypervisor虚拟设备之间提供一个统一的通信框架和编程接口。virtio使用前后端通信模型,在虚拟机中运行virtio设备的驱动程序,通过virtio设备和后端的Hypervisor或用于加速的vhost进行数据交互。....................................

Aspiresky的专栏 8555

深入Virtio队列机制:从Split Ring到Packed Ring的性能演进之路

本文深入解析Virtio规范中队列机制的技术演进,从Split Ring到Packed Ring的架构革新。通过对比分析缓存局部性优化、批处理通知机制等关键技术,揭示Packed Virtqueue如何显著提升虚拟化I/O性能,为开发者提供选型建议和优化方向。

weixin_29258297的博客 409

virtio机制简介

virtio机制简介

大吉 6069

IO虚拟化 - virtio介绍及代码分析

1. 概述 Virtio是linux平台下一种IO半虚拟化框架,virtio 由 Rusty Russell 开发,他当时的目的是支持自己的虚拟化解决方案 lguest。而在KVM中也广泛使用了virtio作为半虚拟化IO框架。本文主要介绍virtio的设计及在kvm中的实现。 Virtio的好处: virtio作为一种Linux内部的API,提供了多种前端驱动模块 框架通用,方便模拟各种设备 ...

硅基创想家的博客 1万+

VirtIO协议详解:前后端驱动与virtqueue机制

VirtIO协议的设计堪称虚拟化领域的典范工程。它通过三层解耦架构(设备类型/核心/传输层)实现了跨平台可移植性,通过virtqueue的共享内存环形缓冲区实现了零拷贝数据传输,通过特性协商机制实现了前向和后向兼容,通过eventfd/irqfd通知机制将VM Exit开销压缩到最低。从Split Ring到Packed Ring的演进,从Legacy PCI到Modern Capability List的升级,从单队列到多队列的扩展——VirtIO始终在不破坏兼容性的前提下持续进化。

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 27

深入解析 virtio 半虚拟化 I/O 协议:从通信原理到 StratoVirt 实现

在虚拟化技术中,I/O性能是核心挑战。传统全模拟方式通过模拟真实硬件寄存器实现I/O,但频繁的VM Exit和内存拷贝导致巨大开销。半虚拟化(Paravirtualization)通过修改Guest OS内核,使其与Hypervisor协同工作,从而大幅提升性能。virtio正是这一思想的典范,它定义了一套通用的半虚拟化I/O通信框架。其核心在于前后端驱动通过共享内存环(virtqueue)进行高效数据交换,并利用ioeventfd和irqfd机制减少VM Exit,实现接近物理设备的性能。这种架构为云计算

weixin_30562507的博客 463

Linux: network:virtio-net:vring

本文分析了virtio-net驱动在guest虚拟机中的数据发送流程。当使用virtqueue_add_split函数时,首先将skb消息放入virtqueue的ring buffer,然后通过notify机制判断是否需要触发host端的处理。当kick操作执行iowrite后,控制权转移到host端进行后续处理。性能分析显示,数据包在host端需要经过网络协议栈处理(如nft_do_chain、br_nf_forward_ip等),最终通过vhost线程(vhost_worker)完成传输。整个流程涉及g

mzhan017的博客 179

Virtio数据传输流程分析——Split Virtqueue

本文主要分析了 VirtIO split virtqueue 的前后端数据传输机制,并以 virtio‑input 为例说明当使用两个virtiqueue时,前端驱动如何填充数据,后端如何处理请求并返回数据,同时分析了前后端共用一个 virtqueue 时(请求‑响应模式)的数据填充机制,最后用图解的方式总结了virtio前后端数据传输流程

学习记录,交流学习 419

C++中为什么要引入引用变量?

C++引用机制的设计哲学在于平衡性能与安全性。它解决了指针的三个痛点:语法噪音、空指针风险和语义模糊,同时保持了指针的效率优势。引用必须绑定有效对象且不可重绑定的特性增强了安全性,其值语义语法更直观。尤其在运算符重载和const引用场景中,引用展现了不可替代的优势。本质上,引用是编译器优化的指针实现,体现了C++"零开销抽象"的核心思想——既保持底层性能,又提供高级抽象。这种设计允许开发者根据场景灵活选择指针或引用,反映了C++多范式共存的语言智慧。

教学 & 技术专栏 175

手把手教你解决Ubuntu 20.04虚拟机桥接模式下的网络问题:DHCP与静态IP配置全指南

本文详细解析了Ubuntu 20.04虚拟机在桥接模式下的网络配置问题,包括DHCP与静态IP的配置方法及常见故障排查技巧。通过深入讲解桥接模式原理和提供实战操作指南,帮助用户解决无法访问外网、ping不通等典型网络问题,实现虚拟机与物理网络的无缝连接。

weixin_29256771的博客 543

Virtio(一):框架概览

这是一篇框架概览。图中的中间列表示 virtio 规范定义的 driver-device interface;左右两侧分别表示 Linux guest 侧和 VMM/device 侧如何实现这个接口。图中的箭头用于说明主要交互方向,不等同于源码中的函数调用顺序。本文中的VMM指 Virtual Machine Monitor,即负责创建和运行虚拟机的软件层;在讨论 virtio 时,本文重点关注它实现 guest 可见设备和后端 I/O 的部分。

日常学习记录 198

张正友标定法_单目-线激光三维扫描系统中光刀平面的标定

单目-线激光三维扫描系统中光刀平面的标定线结构光有结构简单、精度高、测速快等特点,被广泛应用于三维重建领域。线结构光三维扫描系统由一个相机和一个线结构光投射器构成,线结构光投射器将线结构光投射到被测物体表面,相机采集带有线激光的被测物体图像,根据相机和线激光投射器间的相对位置关系,使用激光三角法计算出激光线上的点在相机坐标系下的坐标。激光三角法原理如下图所示,线激光投射的扇形区域可以看作是一个平面...

weixin_39616379的博客 1074

virtio split & ctrl virtqueue

注:queue size指每个virtqueue具备buffer的深度,queue size=descriptor table num,queue size大小会影响到virtqueue的性能,可以权衡资源和性能选择大小;不同于queue num,queue num表示virtqueue数量。ctrl mq配置总共5个字节,驱动分三次来操作,第一次传输class 和command 2个Byte,第二次传输data ,2个byte,就是mvp值,第三次传输ack,1个byte。可以看到对应:class=4;

lingshengxiyou的博客 707

从法律文档到知识图谱

这里我们定义了两个 Pydantic 模型:Location 用于捕捉结构化的地址信息,包含可选的国家、州和地址字段;Party 用于表示合同参与方,包含必填的名称和可选的位置详情。字段描述通过告知 LLM 每个字段具体需要查找哪些信息,来辅助提取过程。"""包含结构化地址组件的位置信息。"""country: Optional[str] = Field(None, description="国家")

Anspire的博客 3030

Unity Scriptable Build Pipeline (SBP) 详解

Unity 的可编程构建管线(Scriptable Build Pipeline, SBP)标志着引擎构建架构的一次关键转变,它从不透明的 C++ 实现转向了灵活、可扩展的 C# 框架。SBP 旨在满足现代游戏开发日益增长的需求,通过改进增量处理和高效缓存机制显著提升了构建性能。它赋予开发者对内容构建过程前所未有的控制力,从而能够针对特定项目需求进行深度定制。尽管 SBP 是 Unity 推荐的 Addressables 系统的重要基础层,但理解其核心组件、构建流程和高级功能对于优化大型项目、简化 CI/C

m0_57771536的博客 2209

virtio系列-从规范到实践:深入解析virtqueue设计与性能优化

本文深入解析virtio规范中的virtqueue设计,对比split virtqueue和packed virtqueue的性能差异,并提供实战优化指南。通过详细的三表协作机制、中断优化策略及硬件适配要点,帮助开发者提升虚拟化I/O性能,实现高达30%的CPU开销降低。

weixin_28704565的博客 284

5090D显卡安装LLaMA-Factory避坑指南:PyTorch与CUDA版本兼容性问题解决

本文是针对5090D显卡安装LLaMA-Factory时遇到的PyTorch与CUDA版本兼容性问题的详细解决指南。文章深入剖析了因GPU架构代际差异导致的“no kernel image”报错根源,并提供了从环境诊断、安装匹配的PyTorch Nightly版本,到最终集成验证的完整路径,帮助用户确保LLaMA-Factory在5090D上稳定运行。

Apple的专栏 868

深入解析Split Virtqueue:virtio数据传输流程与性能调优实战

虚拟化环境中的I/O性能问题常源于virtio队列机制。Split Virtqueue作为virtio设备与驱动间共享内存、通知机制的核心实现,通过描述符表、avail环和used环的分离设计,在保证高效同步的同时降低了锁竞争。理解其数据传输流程与内存屏障语义,是进行网络吞吐优化、存储延迟调优及软中断分析的关键。本文从工程实践角度,拆解Split Virtqueue的结构布局、描述符链运作、avail/used环同步机制及通知抑制策略,并结合实际调优案例,提供性能问题排查与优化着力点,助力开发和运维人员深入

weixin_27722377的博客 6

C盘在同一时间突然多出100g的文件,请问是什么原因,以及是否能删除?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1760

AutoSar实战营 - 总目录

欢迎大家来学习《AutoSar实战营》专栏,该篇为总目录,方便以后大家直接进入需要学习的文章。 ~正所谓独乐乐不如众乐乐 - - ~1, AutoSar之DaVinci开发环境2,BswM模块之Ecu State Handling1)读写DID功能 《AutoSar实战》读写DID之一:CDD准备 《AutoSar实战》读写DID之二:工具链配置 《AutoSar实战》读写DID之三:代码实现2)功能寻址 《AutoSar实战》禁止功能寻址

weixin_48498880的博客 3633

深入解析Virtio Split Virtqueue:数据传输流程与性能调优实战

虚拟化环境中的I/O性能优化常涉及Virtio框架,其中Split Virtqueue作为半虚拟化数据传输的核心机制,通过描述符表、Avail Ring和Used Ring实现高效通信。其原理基于单向读写契约和内存屏障,确保数据一致性与低开销。技术价值在于减少缓存争用和提升吞吐量,广泛应用于KVM/QEMU、vhost等场景。理解其流程有助于定位性能瓶颈,如通知抑制和描述符链优化,从而提升虚拟化网络与磁盘I/O效率。

weixin_33646989的博客 234

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

从Split到Packed:virtqueue演进与性能优化实践

本文深入探讨了virtqueue从Split到Packed的演进历程与性能优化实践。通过对比Split Virtqueue和Packed Virtqueue的设计差异,分析了Packed Virtqueue在缓存局部性、原子更新和批量处理等方面的优势,并提供了实际部署中的调优经验。测试数据显示,Packed Virtqueue在网络和存储虚拟化场景中性能提升显著,是高性能虚拟化环境的理想选择。

weixin_42533120的博客 217

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Virtqueue共享内存深度解析:从内存布局到vhost零拷贝实践

在虚拟化技术栈中,内存共享与高效I/O路径是性能优化的核心命题。virtio作为事实上的设备抽象标准,其底层通过Virtqueue环形队列与共享内存机制,实现虚拟机与宿主机之间的数据零拷贝交互。理解这一机制,需从描述符表、可用环与已用环的内存布局切入,进而掌握Guest物理地址到Host虚拟地址的映射原理。该技术广泛应用于KVM/QEMU、vhost-net及用户态vhost-user等场景,直接影响网络吞吐与CPU开销。本文结合工程实践,剖析Virtqueue共享内存的建立流程、数据链路以及常见坑点,为开

weixin_42594419的博客 166

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

DPDK系列之十二虚拟化virtio源码分析之数据管理层

DPDK的中间抽象层数据结构的源码分析

fpcc的专栏 856

【kubevirt】(virt-launcher Part 6)virt-launcher 设备/网络/存储/外设层

KubeVirt virt-launcher 设备/网络/存储/外设层 超深度分析

zhonglinzhang 139
上一篇: Kata Containers 助力 Amazon Web Services 增强 Kubernetes 工作负载隔离和安全性
下一篇: 恭喜 颜文 成为 Koupleless 社区优秀 Contributor!
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值