赞
踩
先来张图:
本文先从Qemu侧的virtio device入手,我会选择从一个实际的设备来阐述,没错,还是上篇文章中提到的网络设备。
资料直通车:Linux内核源码技术学习路线+视频教程内核源码
在Qemu的网卡虚拟化时,通常会创建一个虚拟网卡前端和虚拟网卡后端,如下图:
全文围绕着Tap设备的创建和Virtio-Net设备的创建展开。
入口流程如下:
下边进入细节,the devil is in the details。
从上文中,我们知道,Tap与Virtio-Net属于前后端的关系,最终是通过结构体分别指向对方,如下图:
创建Tap设备的主要工作就是创建一个NetClientState结构,并添加到net_clients链表中:
函数的调用细节如下图:
以上就是Tap后端的创建过程,下文将针对前端创建了。
这是一个复杂的流程。
Qemu中用C语言实现了面向对象的模型,用于对设备进行抽象,精妙!
针对Virtio-Net设备,结构体及拓扑组织关系如下图:
与设备创建相关的三个函数,可以从device_init_func入口跟踪得知:
类初始化结束后,开始对象的创建:
到目前为止,我们似乎都还没有看到Virtio-Net设备的相关操作,不用着急,已经很接近真相了:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。