13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Linux虚拟化KVM-Qemu分析之Virtio设备

虚拟化 本文先从Qemu侧的virtio device入手,我会选择从一个实际的设备来阐述,没错,还是上篇文章中提到的网络设备。

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

背景

说明:

  1. KVM版本:5.9.1
  2. QEMU版本:5.0.0
  3. 工具:Source Insight 3.5, Visio
  4. 文章同步在博客园:https://www.cnblogs.com/LoyenWang/

新的一年, 大家牛起来!

祝小姐姐们:

落雁沉鱼 兰质蕙心 明眸皓齿 螓首蛾眉 天生丽质 天香国色 杏脸桃腮 煦色韶光 涎玉沫珠 宜嗔宜喜 远山芙蓉 艳色绝世 余霞成绮 阿娇金屋 逞娇呈美 国色天香 花颜月貌 绝色佳人 暗香盈袖 闭月羞花 倾国倾城 温婉娴淑 千娇百媚 仪态万千...

祝男的:

新年好。

1. 概述

先来张图:

想在一篇文章中写完这四个模块,有点too yong too simple,所以,看起来又是一个系列文章了。

本文先从Qemu侧的virtio device入手,我会选择从一个实际的设备来阐述,没错,还是上篇文章中提到的网络设备。

2. 流程分析

在Qemu的网卡虚拟化时,通常会创建一个虚拟网卡前端和虚拟网卡后端,如下图:

全文围绕着Tap设备的创建和Virtio-Net设备的创建展开。

入口流程如下:

  1. Qemu中设备模拟通过type_init先编译进系统,在module_call_init时进行回调,比如图中的xxx_register_types,在这些函数中都是根据TypeInfo类型信息来创建具体的实现;
  2. net_init_client用来创建网络设备,比如Tap设备;
  3. device_init_func根据Qemu命令的传入参数创建虚拟设备,比如Virtio-Net;

下边进入细节,the devil is in the details。

3. tap创建

从上文中,我们知道,Tap与Virtio-Net属于前后端的关系,最终是通过结构体分别指向对方,如下图:

创建Tap设备的主要工作就是创建一个NetClientState结构,并添加到net_clients链表中:

函数的调用细节如下图:

以上就是Tap后端的创建过程,下文将针对前端创建了。

4. virtio-net创建

这是一个复杂的流程。

4.1 数据结构

Qemu中用C语言实现了面向对象的模型,用于对设备进行抽象,精妙!

针对Virtio-Net设备,结构体及拓扑组织关系如下图:

4.2 流程分析

与设备创建相关的三个函数,可以从device_init_func入口跟踪得知:

4.2.1 class_init

4.2.2 instance_init

类初始化结束后,开始对象的创建:

4.2.3 realize

到目前为止,我们似乎都还没有看到Virtio-Net设备的相关操作,不用着急,已经很接近真相了:

本文基本捋清了虚拟网卡前端设备和后端设备的创建过程,完成的工作只是绑定了彼此,数据交互以及通知机制,留给后续吧。

参考

《 Virtual I/O Device (VIRTIO) Version 1.1》

https://www.redhat.com/en/blog/virtio-devices-and-drivers-overview-headjack-and-phone


标题名称:Linux虚拟化KVM-Qemu分析之Virtio设备
URL地址:http://cdbrznjsb.com/article/cccssch.html

其他资讯

让你的专属顾问为你服务