dw中做网站的步骤,互联网架构师,做网站开店,一个网站多个域名接前一篇文章#xff1a;中移#xff08;苏州#xff09;软件技术有限公司面试问题与解答#xff08;0#xff09;—— 面试感悟与问题记录 本文参考以下文章#xff1a;
VirtIO实现原理——PCI基础
VirtIO实现原理——virtblk设备初始化
特此致谢#xff01; 本文对…接前一篇文章中移苏州软件技术有限公司面试问题与解答0—— 面试感悟与问题记录 本文参考以下文章
VirtIO实现原理——PCI基础
VirtIO实现原理——virtblk设备初始化
特此致谢 本文对于中移苏州软件技术有限公司面试问题中的“1virtio会创建哪些设备”进行解答与解析。 要弄清楚并回答这个问题首先得从virtio这个“根”上讲起。
传统的设备模拟中虚拟机内部设备驱动完全不知道自己处在虚拟化环境中。对于网络和存储等设备I/O操作会完整地走完“虚拟机内核栈-QEMU-宿主机内核栈”这一过程会产生很多的VM Exit和VM Entry因此性能很差。
以e1000网卡为例在传统的全模拟方案下虚拟机操作系统内核中的网卡驱动还是跟具体的硬件设备相同。也就是说QEMU模拟的是e1000的网卡虚拟机操作系统还是通过传统的方式进行收发包。e1000以及其它模拟设备网卡的驱动在进行收发包的时候会有很多次的写网卡寄存器或IO端口的操作这会导致大量的VM Exit使得网卡的性能比较差。
virtio方案则是旨在提高性能的一种优化方案。在该方案中虚拟机能够感知到自己处于虚拟化环境并且会加载相应的virtio总线驱动和virtio设备驱动。
半虚拟化的基本原理如下图所示 主要包括两部分的内容一个是VMM创建出模拟的设备即后端设备另一个是虚拟机操作系统内部安装好该模拟设备的驱动即前端驱动。在半虚拟化环境下设备和驱动都是新的、专门用来适应虚拟化环境的。虚拟机中的设备驱动前端驱动与QEMU中的虚拟网卡设备后端设备定义一套自己的协议来进行数据传输通过自己约定的接口可以很方便地进行通信。virtio即是这样一种利用半虚拟化技术提供I/O性能的框架。
到这儿就可以初步知道题目的意思了所谓“virtio会创建哪些设备”主要指的是virtio后端设备都有哪些。具体的设备接下来就会讲到这里先别着急且容我慢慢道来。
先来介绍一下virtio框架如下图所示 virtio是一种前后端架构包括前端驱动Front-End Driver和后端设备Back-End Device、以及自身定义的传输协议。通过传输协议virtio不仅可以用于QEMU/KVM方案也可以用于其它的虚拟化方案。如虚拟机可以不必是QEMU也可以是其它类型的虚拟机。后端不一定要在QEMU中实现也可以在内核中实现这实际上就是vhost方案。接下来对这三个组件做简单介绍。
前端驱动Front-End Driver
前端驱动为虚拟机内部的virtio模拟设备对应的驱动每一种前端设备都需要有对应的驱动才能正常运行。前端驱动的主要作用是接收用户态的请求然后按照传输协议将这些请求进行封装之后再写I/O端口发送一个通知到QEMU的后端设备。
后端设备Back-End Device
后端设备则是在HostQEMU中用来接收前端驱动发过来的I/O请求然后从接受的数据中按照传输协议的格式进行解析。对于网卡等需要实际物理设备交互的请求后端驱动会对物理设备进行操作从而完成请求并且会通过中断机制通知前端驱动。
virtio队列
virtio前端和后端驱动的数据传输通过virtio队列virtio queuevirtqueue完成。一个设备会注册若干个virtio队列每个队列负责处理不同的数据传输有的是控制层面的队列有的是数据层面的队列。virtqueue是通过vring实现的。vring是虚拟机和QEMU之间共享的一段环形缓冲区。当虚拟机需要发送请求到QEMU的时候就准备好数据将数据描述放到vring中写一个I/O端口然后QEMU就能够从vring中读取数据信息进而从内存中读出数据。QEMU完成请求之后也将数据结构存放在vring中前端驱动也就可以从vring中得到数据了。vring的基本原理如下图所示 vring包含三个部分
第一部分是描述符表Descriptor Table用来描述I/O请求的传输数据信息包括地址、长度等信息第二部分是可用的vringAvailable Vring这是前端驱动设置的表示后端设备可用的描述符表中的索引第三部分是已经使用的vringUsed Vring这是后端设备在使用完描述符表后设置的索引这样前端驱动可以知道哪些描述符已经被用了。
至此对于问题“virtio会创建哪些设备”就有了初步答案。这个问题会转换为virtio后端设备都有哪些根据上图可知分为两大类设备virtio PCI控制设备和virtio设备。具体来说就是virtio-pci设备和具体的virtio设备包括 1af4:1041 network device (modern) 1af4:1042 block device (modern) 1af4:1043 console device (modern) 1af4:1044 entropy generator device (modern) 1af4:1045 balloon device (modern) 1af4:1048 SCSI host bus adapter device (modern) 1af4:1049 9p filesystem device (modern) 1af4:1050 virtio gpu device (modern) 1af4:1052 virtio input device (modern) legacy: #define PCI_DEVICE_ID_VIRTIO_NET 0x1000 #define PCI_DEVICE_ID_VIRTIO_BLOCK 0x1001 #define PCI_DEVICE_ID_VIRTIO_BALLOON 0x1002 #define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x1003 #define PCI_DEVICE_ID_VIRTIO_SCSI 0x1004 #define PCI_DEVICE_ID_VIRTIO_RNG 0x1005 #define PCI_DEVICE_ID_VIRTIO_9P 0x1009 #define PCI_DEVICE_ID_VIRTIO_VSOCK 0x1012 #define PCI_DEVICE_ID_VIRTIO_PMEM 0x1013 #define PCI_DEVICE_ID_VIRTIO_IOMMU 0x1014 #define PCI_DEVICE_ID_VIRTIO_MEM 0x1015 下一回对于细节进行讲解在初步回答此面试问题的基础上深入回答此问题。