虚拟的功能设备 实现虚拟的功能设备是支持虚拟机 IO 的第二种方法。虚拟的功能设备就是说虚拟机使用的 IO 设备不一定要遵守已有的设备标准如SCSI 协议,Intel 以太网卡的规范等等 linux, 只要实现上能完成操作系统想要的功能即可,如支持磁盘数据块的传送,TCP/IP 网络包的传送,实现 IO 完成的通知等。 这种方式由于不遵守已有的设备格式和规范,无法使用客操作系统上已有的物理设备驱动,在 VMM 上虚拟化设备的同时,在客操作系统上也需要专有的驱动程序配合。 不同的 VMM 实现往往有自己独立的虚拟设备的实现机制,目前 KVM 采用的是称为 virtIO 的技术。 VirtIO 是 IBM 的Rusty Russell 提出的实现虚拟设备的规范,其核心思想是通过定义一个公共的 ABI, 让客户机操作系统以简易的方式向 VMM 告知其数据缓冲区,并以这些缓冲区为基础承载不同类型虚拟设备的数据交换。 在virtIO 的思想中,虽然逻辑数据是客主双方交换的,但缓冲区总是由客操作系统方面提供的。 以 Linux 客操作系统为例,VirtIO 的实现可简要描述如下 linux: a.KVM 以仿真的PCI 设备的方式向客操作系统呈现每一个 VirtIO 设备。 所有类型的 VirtIO 设备都使用同一个 Device ID。 VirtIO 设备的类型由 PCI 设备的 subsystem Vendor Id 及 subsystem Device Id 来区分。目前已经实现的 VirtIO 设备包括 virtio_net, virtio_blk, virtio_baloon, virtio_console 及 virtio_hw_random。 在 Linux 上 virtio_pci 驱动的设备 probe 函数 virtio_pci_probe 最终会调用具体的 VirtIO 设备的 probe 函数( 如 virtnet_probe) 来识别其设备,建立相关的数据结构linux。 b. 数据结构 structvirtio_device 用来代表被识别的每一个 virtIO 设备, 和该结构关联的是一组操作接口,包括 get, set,get_status, set_status,get_features,finalize_features,reset, find_vqs 及 del_vqs。 这些接口的作用就是通过对 virtIO 设备的配置空间的读写,来和设备进行交互,或对设备进行控制。 其中find_vqs 就是用来发现该 virtIO 设备的后端提高了那些 virtioqueuelinux。 c. 在 virtIO 的框架中,用来在客户机操作系统和 VMM 之间实现数据传输的抽象机制就称为 virtioqueue。 Virtioqueue 就是一组操作接口, 包括 add_buf, get_buf, disable_cb, enable_cb, notify 以及 callback。 其中 callback是由具体类型的 virtIO 驱动实现的,其他几个操作的实现則由特定 Linux 版本的 virtioqueue 采用的具体实现方式确定。 详细:http://www.51rhca.com/archives/576
|