ring是什么意思(半虚拟化技术)
如果有更好的建议或者想看更多关于综合百科技术大全及相关资讯,可以多多关注茶馆百科网。

作者:法海
产地:http://tinylab.org/virtio-vring/
virtio数据传输机制
如上所述,为了提高虚拟机的IO效率,virtio标准应运而生。virtio的核心机制是通过共享内存在前端驱动和后端实现之间传输数据,共享内存区域称为vring。共享内存为客户/主机通信奠定了基础,但它仍然需要灵活、可靠和高效的机制保证。本文基于最简单的场景描述了vring的本质。
vring共享内存基本原理
虚拟化的本质是共享内存,它需要使用共享内存的软件模块来访问这个内存。在虚拟化场景中,guest/host如何实现共享内存?第一个问题:vring描述符中存放的内存地址什么?
vring由客户驱动程序应用,因此存储在vring描述符中的地址是GPA。第二个问题:guest/host如何实现共享?
一般来说,有三种情况:qemu模拟的设备,GPA位于qemu的进程地址空间,qemu自然可以访问。qemu外部仿真的设备,比如vhost-net/vhost-user,需要建立一个新的内存映射。以vhost-net为例,简单说明在初始化过程中,qemu通过ioctl命令字通知vhost-net内核模块vring的内存信息。内存信息包括:GPA/userspace_addr/size等。vhost-net内核模块记录GPA和userspace_addr(qemu进程上下文虚拟地址)之间的内存映射。Vhost-net内核模块在启动内核线程时记录该线程服务于哪个qemu虚拟机,同时记录qemu虚拟机进程的页表信息。内核线程运行时,使用对应的qemu虚拟机进程页表。这样,vhost-net内核模块可以访问qemu进程上下文的虚拟地址。对于真实的硬件设备,需要使用IOMMU来完成地址转换。
vring的构成与实现
vring定义与构成
来自virtiospec:struct virtq {//the actual descriptors(16 bytes each)struct virtq _ desc desc[QueueSize];//Aringofavailabledescriptorheadswithfree-running index . struct virtq _ avail avail;//paddingtethenextqueuealignboundary . u8 pad[Padding];//Aringofuseddescriptorheadswithfree-running index . struct virtq _ used used;};Vring包括三个主要方面:
DescriptorTable:描述了内存缓冲区,主要包括addr/len等信息。AvailableRing:用来驱动通知设备新的描述符是可用的。例如,通知后端设备有一个消息描述符要发送。UsedRing:用于通知驱动程序所使用的描述符。比如后端设备收到消息,需要将消息数据放入可用描述符,更新UsedRing,同时通知前端驱动。
DescriptorTable
DescriptorTable是一个描述符数组,每个描述符可以代表一个内存缓冲区,结构如下:struct virtq _ desc { le 64 addr;le32lenle16flagsle16next};结构元素含义:
Addr:内存缓冲区(GPA)的实际地址len: length flags:控制信息bit01:表示该描述符是链描述符,并且有连续的数据位11:writeonlyfordevice 0:readonlyfordevicenext:如果是链描述符,该字段表示下一个描述符ID
AvailableRing
struct virtq _ avail { le16 FLAVIN。le16idxle 16 ring[QueueSize];};AvailableRing用于驱动通知设备拥有可用的描述符。注意:在驱动程序提供新的可用描述符后,设备端不必立即使用它们。例如,virtio-net将为消息接收提供一些描述符,并在消息到达时根据需要使用它们。结构元素含义:
Flags:控制信息,比如VIRTQ_AVAIL_F_NO_INTERRUPT,表示驱动端不想接收通知idx:驱动会把下一个描述符,也就是环形数组的下标ring []放在哪里:ID
UsedRing
struct VIRTQ _ used { le16 descriptor table中AVAIL描述符的Flagsle16idxstruct virtq _ used _ elem ring[queue size]; };structvirtq_used_elem{le32id;le32len;};UsedRing用于通知驱动设备侧已经使用的buffer和长度。主要结构成员如上,相比availring结构多了len字段,用于表示设备侧写入的数据长度。对于只读数据类型,不改变len长度。
chained描述符
当传输数据大小大于单个描述符的长度,可以使用多个描述符。这种描述符被称作chaineddescriptor。
使用方法:
除最后一个描述符外,之前的描述符设置NEXTflag,desc.next字段设置为下一个描述符的id。
下图使用两个描述符描述了一段内存buffer:
注意:将chaineddescriptors加入availring时,只需要把第一个描述符id加入即可。
vring前后端通信过程
具体步骤
驱动分配vring驱动更新描述符,如下图所示,一个描述符描述了起始地址为0x8000的长度为2000的设备侧只写的buffer区域。驱动更新availringavail->ring[idx]=desc;idx++;驱动通知设备有新的可用描述符设备侧感知到新可用描述符,在使用完成后,更新UsedRing设备侧通过虚拟中断方式通知驱动,有新的Used描述符,请及时处理总体框图
step1-4总体框图:
step5-6总体框图:
其它问题
indirectdescriptor间接描述符表示一个描述符指向的数据还是描述符
packeddescriptorpackeddescriptors是virtiospec1.1提出的描述符格式。本文不涉及。主要为为了提高性能。
因为splitdescriptors每次操作涉及三个内存区域,cachemiss较多,packeddescriptors将三区域融合到一个区域,提高cache利用率。
参考资料
https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travelsvirtiospec1.1作者:法海
出处:http://tinylab.org/virtio-vring/
本文主要介绍了关于ring是什么意思(半虚拟化技术)的相关养殖或种植技术,综合百科栏目还介绍了该行业生产经营方式及经营管理,关注综合百科发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解综合百科技术怎么管理的要点,是您综合百科致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://23.234.50.4:8411/article/97494.html