Linux虚拟化KVM-Qemu分析之Vhost-Net

linux虚拟化KVM-Qemu分析之Vhost-Net

作者:LoyenWang 2021-05-07 06:42:51

云计算

虚拟化 结构体的核心围绕着数据和通知机制,其中数据在vhost_virtqueue中体现,而通知主要是通过vhost_poll来实现,具体的细节下文将进一步描述。

 [[397740]]

本文转载自微信公众号「LoyenWang」,作者LoyenWang。转载本文请联系LoyenWang公众号。

背景

说明:

1. 概述

让我们先来看看问题的引入,在之前的virtio系列文章中,网络虚拟化的框架如下图所示:

vhost-net的框架图如下:

本文将分析vhost-net的原理,只说重点,进入主题。

2. 数据结构

vhost-net内核模块的层次结构如下图:

结构体的核心围绕着数据和通知机制,其中数据在vhost_virtqueue中体现,而通知主要是通过vhost_poll来实现,具体的细节下文将进一步描述。

3. 流程分析

3.1 初始化

vhost-net为内核模块,注册为misc设备,Qemu通过系统调用接口与内核交互,Qemu中的初始化如下图:

ioctl系统调用,与驱动交互简单来说可以分为三大类,下边分别介绍几个关键的设置:

vhost net设置

vhost dev设置

从Guest OS中的虚拟地址到最终的Host上的物理地址映射关系如上图所示,如果在Guest OS中要将数据发送出去,实际上只需要将Qemu中关于Guest OS的物理地址布局信息传递下去,此外再结合VHOST_SET_OWNER时传递的内存空间信息,就可以根据映射关系找到Guest OS中的数据对应到Host之上的物理地址,完成最后搬运即可;

vhost vring设置

上述的这些设置的流程路径如下,只画出了关键路径:

初始化完成后,接下来让我们看看数据的发送与接收,为了能将整个流程表达清楚,我会将完整的图拆分成几个步骤来讲述。

3.2 数据发送

1)

发送前的框图如下:

2)

3)

4)

3.3 数据接收

数据的接收是发送的逆过程,流程一致:

1)

初始化部分与发送过程一致;

Tap/Tun驱动从NIC接收到数据包,准备发送给vhost-net;

2)

3)

4)

数据接收完成后,通过irqfd机制通过vcpu,从而在Guest OS中进行处理;

vhost-net的整体内容较多,从上到下涉及到的细节很繁琐,短短的一篇文章难以涵盖全部,权当给个轮廓了。

暂且告一段落吧。

参考

Introduction to virtio-networking and vhost-net

Deep dive into Virtio-networking and vhost-net

Vhost-net Device IOTLB


当前名称:Linux虚拟化KVM-Qemu分析之Vhost-Net
网站地址:http://www.turtgq.com/article/dpgiehc.html

其他资讯