本文首发于我的公众号 Linux云计算网路(id: cloud_dev),号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,第一时间掌握技术干货!
I/O 虚拟化在虚拟化技术中算是比较复杂,也是最重要的一部分。从整体上看,I/O 虚拟化也包括基于软体的虚拟化和硬体辅助的虚拟化,软体虚拟化部分又可以分为全虚拟化和半虚拟化,如果根据设备类型再细分的话,又可以分为字元设备 I/O 虚拟化(键盘、滑鼠、显示器)、块设备 I/O 虚拟化(磁碟、光碟)和网路设备 I/O 虚拟化(网卡)等。
我们先看下在没有虚拟机存在的情况下,I/O 设备请求是怎样的。某个应用或进程发出 I/O 请求,通过系统调用等方式进入内核,调用相应的驱动程序,请求到具体的 I/O 设备,然后再将结果返回到调用者进行回显。
那么存在虚拟机的情况下,又是怎样的呢。按理说,虚拟机是宿主机上的一个进程,应该可以以类似的 I/O 请求方式访问到宿主机上的 I/O 设备,但别忘了,虚拟机处在非 Root 的虚拟化模式下,请求无法直接下发到宿主机,必须借助于 VMM 来截获并模拟虚拟机的 I/O 请求,至于怎么截获并模拟,每一种 VMM 的实现方案都不一样,像 qemu-kvm ,截获操作是由内核态的 kvm 来完成,模拟操作是由用户态的 qemu 来完成的,这也是 kvm 不同于其他 VMM 实现方案的地方。kvm 这样做也是为了提升性能和保持内核的纯净性,关于这块的知识不清楚的可以查阅前文。
从层次上看,虚拟机发出 I/O 请求到完成相应的 I/O 操作,中间要经过虚拟机的设备驱动,到 VMM 的设备模型,再到宿主机的设备驱动,最终才到真正的 I/O 设备。
那什么是设备模型,设备模型就是 VMM 中进行设备模拟,并处理所有设备请求和响应的逻辑模块,对于 qemu-kvm,qemu 其实就可以看做是一个设备模型。