LWN: 把virtio变成真实设备!

virtio-net的前后端分析 注:MSI-X表放在一个单独一个BAR空间中,设置为non-prefetchable,因为里面的pending为是读清的操作,不可以设置为prefetchable(从目前的BSC卡的实现来看,由于virtio设备用不到msix的pending,因此可以设置为prefetchable)。其他的virtio配置寄存器放在另外一个BAR空间中,设置为prefetchable,在一些pcie的硬件架构下,可以提高访问的性能。驱动通过读写CommonCfg中的feature相关的字段来协商特性。 阅读详情

关注了就能看到更多这么棒的文章哦~

Virtio without the "virt"

November 22, 2019

This article was contributed by Stefan Hajnoczi and Michael Tsirkin


KVM Forum

原文链接:https://lwn.net/Articles/805235/

在virtio功能合入Linux v2.6.24的时候,它的作者Rusty Russel介绍目标是成为“一个能供大多数虚拟I/O机制所用的公共驱动”。目前virtio确实已经在这个方向取得了很多进展,有很多种hypervisor和多种操作系统里的guest驱动都支持virtio。不过这些virtio的应用都是完全用软件实现的,而Michael Tsirkin在KVM Forum 2019上名为“VirtIO without the Virt”的演讲则讲述了如何用硬件实现virtio。

Motivation

大家可能会想,为什么需要用硬件来实现virtio设备?virtio起初是针对hypervisor来设计的,设计中也是针对软件实现方式来做的优化,而不是针对硬件。现在virtio已经广泛传播开来,因此这个网络效应就引发了一些重用这个guest驱动和基础设施的硬件实现。在virtio 1.1 specification里面定义了10个设备类型,包括网络接口,SCSI host bus adapter适配器,以及console。如果能实现出符合这些标准的硬件,这样硬件供应商就能专注于构造最好的设备本身,而不用分心去设计一套新的设备接口、重写一套guest驱动程序。不仅如此,目前的guest系统还能直接用上这套新硬件,相应的应用程序(例如DPDK这样的packet处理工具包)也能跟user-space驱动配合好,而不需要跟新创建的驱动再适配一次了,尤其是在用了静态链接方式的情况格外有好处。

用硬件方式来实现virtio也有助于在硬件和软件方案中来回切换。软件实现的设备可以在不需要更改guest驱动的情况下就替换为硬件方案。类似地,如果驱动已经可用了,也可以把硬件替换成软件设备来帮助调试这个驱动。运行起来之后,我们可以对那些要求高性能的guest系统分配硬件设备,而针对其他guest系统则分配软件设备。相关的决策还可以随时更改来更好地平衡资源适用情况。最后,用硬件来实现virtio还能更容易地支持对虚拟机进行热迁移(live-migrate),目标host系统无论是有软件的还是硬件的virtio设备都可以支持迁移过来的guest系统了。

Implementing virtio PCI devices

virtio对硬件提供商来说有很多有用属性。许多设备类型都有一些可选功能,在实现这个设备的时候就可以只挑选一个子集来满足相应的使用场景即可。这些可选项会在设备初始化的时候协商确认出来,从而确保向后向前兼容。这也意味着硬件设备就可以在今后新版本的virtio规范广泛应用之后仍能跟geust驱动配合工作。老版本的guest驱动也同样能跟新版本的设备配合好。

virtio的历史决定了它是针对软件实现方式进行性能优化的。它会利用guest的物理地址而不是使用还要经过IOMMU翻译的PCI总线地址。内存一致性问题也未考虑过,DMA的memory-ordering原语就根本不需要。在准备做硬件实现virtio的时候,在virtio 1.1里增加了两个feature bit:VIRTIO_F_ORDER_PLATFORM和VIRTIO_F_ACCESS_PLATFORM。如果某个设备宣称自己具有这两个功能的话,驱动就需要使用总线地址和DMA memory ordering原语。

在硬件实现virtio PCI设备时至少有三种方法:full offloading,virtual data path acceleration (vDPA),还有vDPA partitioning。其中full offloading会把整个设备或者其中的一个PCI SR-IOV 虚拟功能(VF,就是PCI适配器上的一个方便虚拟化场景使用的子设备)传递给guest。所有的设备访问都是由硬件来处理了,包括设备初始化,还有数据通路设备操作。在这种方式下,所有软件都是跟vendor无关的,可以通用。

相应的,vDPA则是一个软硬件混合的方案,其中会有vendor提供的一个驱动程序来截获virtio驱动发起的针对控制通路(设备的发现、初始化)的访问,利用软件来处理这些请求。而数据通路则是由硬件按照virtio规范来实现的。性能也很好,因为数据通路是由硬件来直接处理的。

最后一类vDPA partition会在guest之间进行更细粒度的内存保护,例如PCI process address space ID (PASID)就会提供多个(而不是一个)虚拟地址空间供设备访问。这样就可以对资源进行弹性更好地分配管理,因为用户能随意配置host驱动来把资源传递给guest。PASID功能还没有怎么用起来,因此这个方向的探索比起其他两项要少很多。

Live migration

用户经常希望把一个正在运行的guest系统迁移到另外一个host上,并且暂停服务的时间要尽量少。在有硬件设备传递给guest的时候,这个工作就很难做了,因为多数硬件设备还不支持保存、恢复设备状态。virtio 1.1规范里面也没有详细规定这一部分,因此硬件提供商还只能自己来小心处理。

QEMU在做live-migration的时候会把virtio的feature bit中规定要由host来提供的功能,在新的host上也先分配、锁定相应的资源。这样一来热迁移的时候就能确保guest所依赖的功能已经具备好了。假如迁移目标host上的硬件设备并不支持这些需要用到的feature bit,那么就没法进行迁移了。

在热迁移进行过程中,需要记录对guest RAM的write操作,因为RAM的增量迁移进行的同时,原来的host上运行的这个guest仍然在运行中。如果有一些write操作被丢失了,目标host收到的guest RAM内容就是一个过期、不完备的一份备份。硬件设备需要能参与到这个记录write操作的工程中来。计划在今后的VFIO mediated device (mdev)驱动子系统中会增加相应的框架代码来进行支持。

在将来,随着IOMMU的广泛应用,无论是vendor无关的热迁移功能,还是消除memory pinning,应该都可能成为现实。Linux和相应的IOMMU硬件里面新增的shared virtual addressing (SVA,公共虚拟寻址)都可以允许设备在不使用专门的IOMMU page table的情况下访问到一个进程的地址空间。unpinned memory则更有吸引力一些,因为这样就能支持page swap以及memory overcommit了。此外,这样也能让热迁移过程中的write操作记录的工作更加简单,因为设备写入内存的时候就会触发fault从而就能不依赖vendor而记录下来。

PCI page request interface (PRI)就是允许IOMMU fault处理的一个机制,不过它要支持post-copy live migration还是不够的,这种情况下guest需要马上就在目标host上运行起来、而不先进行guest RAM的迁移。在post-copy live migration场景中,旧的host上的guest RAM进入fault之后不确定花多长时间才能处理完比,这种对PRI来说无法支持。virtio也许能够通过定义一种通用的方式来让一个设备request page,并且暂停、恢复这个request的处理。virito队列本身就不是顺序处理的,也就是说哪怕某个request被阻塞住一直在等page fault处理完毕,也不影响这个设备的其他处理工作。

Future optimizations

此外,还是需要对virtio工作方式进行一些改进来让硬件实现得更快一些。在队列中等待处理的工作数量需要让设备能从memory中取到。如果我们从驱动中去除掉对这个信息的依赖,而让设备自己处理,那么就可以减少设备对memory的访问数量。

目前已经有一种名为“event index”的中断消除机制,会把相应的状态存在guest RAM里面。对guest RAM的访问都需要硬件设备来进行DMA传输,这种操作开销比较大,也会浪费PCI总线带宽,尤其是如果RAM里面内容根本没有改变过的情况下。这里还是需要一个对硬件实现方式更加友好的方案。类似地,我们经常使用中断合并方式来减少在中断频繁触发情况下的CPU开销。用硬件实现的话,也可以很容易的利用这个方式。

大家可以很容易地参与到virtio Technical Committee指定标准的过程中,任何人都可以。也非常欢迎硬件供应商参与进来一起改进硬件设计。

Conclusion

virtio规范起初完全是针对用软件来实现设备的,不过现在也开始有相应的硬件设备了。Tsirkin的演讲介绍了virtio 1.1对硬件设备支持有什么改善,同时也列出了不少工作需要继续进行,例如热迁移等。尽管硬件virtio设备还不是很常见,硬件供应商和云服务商认为这些虚拟设备变成硬件设备的一天已经不会太远了。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

【重识云原生】第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现 vDPA(vhost Data Path Acceleration)即是让virtio数据平面不需主机干预的解决方案。该框架由Redhat提出,实现了virtio数据平面的硬件卸载。控制平面仍然采用原来的控制平面协议,当控制信息被传递到硬件中,硬件完成数据平面的配置之后,数据通信过程由硬件设备(智能网卡)完成,虚拟机与网卡之间直通。中断信息也由网卡直接发送至虚拟机不需要主机的干预。...... 阅读详情

相关推荐

使用libx265对YUV进行h265编码

使用libx265对YUV进行h265编码

Embedded engineer 3078

linux快速用户空间互斥锁:futex浅析

Futex,Fast Userspace muTEXes,作为linux下的一种快速同步(互斥)机制,已经存在了很长一段时间了(since linux 2.5.7)。它有什么优势?又提供了怎样一些功能,本文就简单探讨一下。

flynetcn的专栏 840

银河麒麟桌面版V10搭建Qt4.8.6开发环境

银河麒麟桌面版V10搭建Qt4.8.6开发环境

qq_34932364的博客 2399

那些年你误会的Linux DMA(关于Linux DMA ZONE和API最透彻的一篇)

本文转载自微信公众号[Linux阅码场],原创:宋宝华 创作目的 互联网、Linux内核书籍上充满了各种关于Linux DMA ZONE和dma_alloc_coherent、dma_map_single等的各种讲解,由于很多童鞋缺乏自身独立的思考,人云亦云,对这些概念形成了很多错误的理解。本文的目的在于彻底澄清这些误解。当你发现本文内容与baidu到的内容不一致的时候,以本文内容为准 1....

z1026544682的专栏 2493

SCAN和JTAG分别是什么?它们之间有什么联系与区别?

SCAN(扫描)技术是集成电路测试领域的一种方法,主要用于边界扫描测试(Boundary Scan)。它是在集成电路设计中引入的一种测试结构,允许测试人员通过在芯片的输入/输出引脚上设置和读取特殊寄存器(边界扫描寄存器,BSR)的内容,来间接测试电路板上的互联和芯片内部功能块。这种方式可以在不接触其他内部节点的情况下测试整个电路板的连接性,极大地提高了测试覆盖率和可诊断性。JTAG(Joint Test Action Group,联合测试行动小组)则是开发并推广边界扫描测试标准的一个组织。

初心不忘产学研的博客 2542

海康工业相机LabVIEW二次开发实战——参数配置优化与图像高效存储

本文详细介绍了海康工业相机在LabVIEW平台上的二次开发实战,重点解析了相机参数配置的优化方法与图像高效存储策略。通过剖析曝光、增益、触发模式等核心参数的设置逻辑,并结合生产者-消费者设计模式,指导开发者构建稳定、高效的图像采集与异步存储流程,有效提升工业视觉项目的开发效率与系统稳定性。

weixin_29306317的博客 221

Linux阅码场 - Linux内核月报(2020年06月)

关于Linux内核月报Linux阅码场Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。限于篇幅,只会对...

宋宝华 1752

告别代码移植烦恼:STM32CubeMX 6.4.0 + STM32F407ZGT6 + YT8512C PHY芯片的LWIP网络配置全攻略

本文详细介绍了如何使用STM32CubeMX 6.4.0配置STM32F407ZGT6与YT8512C PHY芯片的LWIP网络适配,包括硬件特性解析、STM32CubeMX基础配置、专用驱动适配和LWIP协议栈定制化配置,帮助开发者解决PHY芯片差异导致的网络问题。

weixin_28718793的博客 290

宋宝华:评Linux 5.13内核

目录 Misc cgroup Landlock安全模块 系统调用的堆栈随机化 printk无锁ringbuffer的进一步优化 BPF可调用内核函数 公共的IO PAGE Fault支持 Linux 5.14于14小时之前发布了,而我5.13的总结还没有写出,我早觉得有写一点东西的必要了,这虽然于搬砖的码农毫不相干,但在追求进步的工程师那里,却大抵只能如此而已。为了不忘却的纪念,我们列出5.13内核的数个激动人心的新特性: Apple M1的初始 Misc cg...

RToax 1509

第五章 TTM 后备管理:5.6系统内存域

系统内存域由 TTM 内置资源管理器管理,通过 ttm_tt 承载页信息,依赖 ttm_pool 提供物理页。ttm_tt 管理页数组、缓存属性与状态标志,支持外部页与换出机制。初始化分 ttm_tt_init 与 ttm_sg_tt_init,生命周期包括创建、填充、释放与销毁。页池针对 write-combined、uncached 及一致性 DMA 分配的页进行缓存,提升性能并减少 TLB 刷新。分配时高阶优先、批量设置缓存属性,回收时清零后归还池中,确保高效复用。

图形/计算GPU的驱动与虚拟化技术分享园地 2560

第11.4节 混合储能系统能量管理

混合储能系统(HESS)的能量管理策略采用分层架构实现多时间尺度优化:调度层(小时级)进行经济优化,协调层(秒级)基于频率分解分配功率,执行层(毫秒级)实现快速跟踪。深度强化学习(DRL)方法通过定义状态空间、动作空间和多目标奖励函数,能有效处理系统不确定性和多目标优化问题。HESS性能评估需综合技术指标(如调节性能Kp值、设备寿命指标)和经济指标(净现值NPV、平准化储能成本LCOS),并遵循"建模-仿真-实验"的闭环流程。

技术工作者 244

操作系统 知识点整理

文章目录 操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机的基石。它本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。 运行在电脑上的所有应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。 操作系统屏蔽了硬件层的复杂性,更像是硬件使用的负责人,统筹着各种相关事项。 操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。 内核是连接应用程序和硬件的桥梁,决定着系统的性

shpunishment的博客 1056

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

m0_51579041的博客 1万+

LWN: 加固 virtio!

关注了就能看到更多这么棒的文章哦~Hardening virtioAugust 9, 2021This article was contributed by Marta Rybczyńsk...

Linux News搬运工 415

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

高性能网络 SIG 月度动态:长期投入得到业界认可,新增一位 virtio reviewer

高性能网络 SIG 4月动态送达,来看看都有哪些进展~

weixin_60347558的博客 810

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LWN:Android上使用KVM!

关注了就能看到更多这么棒的文章哦~KVM for AndroidBy Jake EdgeNovember 11, 2020KVM Forum(https://lwn.net/Archiv...

Linux News搬运工 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

高性能网络SIG月度动态:virtio-net 支持动态中断调节,SMC v2 协议增加新扩展

高性能网络 SIG(Special Interest Group) 月度动态来了,欢迎大家点击了解~

weixin_60347558的博客 689

LWN:对io_uring中能做的操作进行限制!

关注了就能看到更多这么棒的文章哦~Operations restrictions for io_uringByJonathan CorbetJuly 15, 2020From:htt...

Linux News搬运工 353

LWN: 针对驱动程序设计的防火墙!

关注了就能看到更多这么棒的文章哦~A firewall for device driversBy Jonathan CorbetAugust 13, 2021DeepL assisted ...

Linux News搬运工 227

2021-09-04

虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,并且 把内存扩展到硬盘空间。 分段是把虚拟内存划分为多个独立的地址空间,每个地址空间可以动态增长,互不影响。每个段可以单独进行控制,有助于保护和共享。 分页是一维的,主要是为了获得更大的线性地址空间。 页表实现了虚拟内存到物理内存的映射 第三次握手,ACK包丢了的话,如果客户端接着发送数据包,服务器端可以从接收到的数据包中得到与ACK包同样的信息,所以服务端并不非要收到ACK包;如果客户端不发数据包,服务端会认为自己的SYN+ACK包丢失了,会重新发 fo

weixin_44320074的博客 124

CUDA学习笔记(九)内存

Memory kernel性能高低是不能单纯的从warp的执行上来解释的。比如之前博文涉及到的,将block的维度设置为warp大小的一半会导致load efficiency降低,这个问题无法用warp的调度或者并行性来解释。根本原因是获取global memory的方式很差劲。 众所周知,memory的操作在讲求效率的语言中占有极重的地位。low-latency(低延迟)和high-band...

云中寻雾的博客 1万+

Linux阅码场 - Linux内核月报(2020年07月)

关于Linux内核月报Linux阅码场Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。限于篇幅,只会对...

宋宝华 2612

DPDK系列之十一虚拟化virtio源码分析之底层设备

DPDK的前后端数据的流动分析说明

fpcc的专栏 1252

VIRTIO0.95与1.1控制面协议简析

virtio最初的设计目的就是在guest和host之间建立一个通道,达到更高效的数据传输。传统的模拟io的方式,guest可以不感知,称为全虚拟化,但是guest每次向设备写入数据都需要做一次VM-exit,效率极低;virtio称为半虚拟化的方式,guest是会感知的,因为他需要专门的内核驱动(前端VIRTIO驱动),而不是原本的网卡驱动。 在guest侧,virtio模拟的设备显示出来是virtio-net/virtio-blk这样的设备类型。 所以本质上,VIRTIO就是一种协议,目的就是令

leiyanjie8995的博客 4345

KVM虚拟机的热迁移---Live Migration

KVM虚拟机的热迁移---Live Migration: 服务器虚拟化技术是当前的热点,而虚拟机的“热迁移(Live Migration)”技术则是虚拟机的运行状态完整保存下来,同时可以快速的回复到原有硬件平台甚至是不同硬件平台上。恢复后,虚拟机仍旧平滑运行,用户不会察觉到任何差异。 迁移的种类: P2P:物理机之间的迁移 V2P:虚拟机迁到物理机 P2V:物理机迁...

weixin_30594001的博客 734

virtio,vhost 和vhost-user

随着qemu2.1的发布,可以看到,qemu支持了vhost-user。从介绍可以看出,这是把原来vhost-backend从kernel移到了userspace,这和原来virtio架构有什么区别呢?并且这个特性带来了怎样的改进? virtio 在虚拟机中,可以通过qemu模拟e1000网卡,这样的经典网卡一般各种客户操作系统都会提供inbox驱动,所以从兼容性上来看,使用类似e1000的模...

weixin_30852419的博客 163
上一篇: LWN: 针对GCC的静态分析框架!
下一篇: LWN: Linux内核5.5合并窗口的第一部分
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值