引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/】
![平台虚拟化图示 server-virtualization](http://www.yiiyee.cn/Blog/wp-content/uploads/2017/03/server-virtualization.png)
GVT是Intel针对集成显卡(IGD)设备实现的虚拟化方案,最近已经被成功地Upstream到了Linux内核4.10中了。所以用户只要拥有一份最新的Linux内核代码或镜像文件,就可以尝试这个很酷的显卡虚拟化功能。但GVT只是一个核心模块,剥离了和具体的系统虚拟化方案的耦合性,所以要想通过GVT来虚拟化你的显卡,还必须结合特定虚拟化平台下的适配模块。GVT本身是平台无关的,它通过一套公共的接口来抽象各种虚拟化平台的功能。
KVMGT是一起被Upstream的另一个模块,它就是在KVM(Kernel Virtual Machine)平台下GVT的适配模块。虚拟软件比如QEMU在KVM平台上,可以通过KVMGT暴露的用户层接口,来创建和维护GVT的虚拟GPU实例。将来,GVT在XEN和其它虚拟化平台下的适配模块,也将会被Upstream到Linux内核中去,不过这需要一些时间和持续的努力。
前面的一篇文章中,简单介绍了渲染引擎的虚拟化原理,这个模块还有非常多可供展开的细节可以深入和挖掘,但在此之前,我想先和大家聊聊在整个虚拟化方方案中,相对简单的一个模块,就是显示设备和引擎的模拟。在历史上,我们曾经讨论和实现过三种相对高级的显示设备的虚拟化方案,不妨列举一下。
第一种是Direct Display方案,这种方案很直观地把物理显示器分配给虚拟机使用。分配的动作是通过软件接口动态实现的,所以同一个物理显示器,可以在多个虚拟机以及主机之间切换,想看哪个系统的界面,将系统ID作为参数调用软件接口就可以了。这个方案的优点是虚拟机可以使用一个完整的物理设备,显示器的全部功能都能够运用。缺点是工具链不是很完善,没有开发可以在当前虚拟机里面执行的切换工具,必须直接在主机中执行切换命令;另外就是测试人员可能不太喜欢,他们总是同时运行三个或七个虚拟机,必须不断地在虚拟机画面之间来回切换来确认系统是否运行正常——实际上,他们宁愿让每个系统显示在一个小窗口中,这样能一目了然。
第二种是Composite Display方案,它大概就是为了因应测试人员的需求吧,用小窗口显示全部的虚拟机界面。但实际上,大部分的虚拟系统,都是采用的这种方案。Windows系统上人们广泛使用的虚拟机软件VirtualBox,以及系统自带的Hyper-V,就是采用的窗口显示方案。这种方案需要在虚拟软件QEMU中添加一些适配代码,虽然代码不多,但往QEMU社区推代码不是很容易,这是最大的障碍。
第三种是对某些远程显示协议进行了特殊优化,使得用户在使用这些远程显示的软件时,能够获得更为流畅的桌面体验,比如在远程桌面上看视频或玩3D游戏而不掉帧。
但最后这三种方案都没有被包含到Upstream的代码中,这将是下一步需要被讨论和努力的地方,我想社区最终会接受其中的一种或几种方案的。那么,现在的Upstream代码是怎么实现显示虚拟化的呢?它实现了一个所谓的headless显示设备,就是说本地看不到显示内容,只能通过远程桌面软件来看——由于第三种方案也没有实现,所以远程桌面显示的内容是未经硬件加速的。这是当前Upstream代码所实现的显示设备的虚拟化。
即便只是虚拟一个Headless显示设备,但对于虚拟系统来说,它所看到的应该是一个功能和逻辑完备的显示器,来不得半点含糊,否则远程桌面就什么也看不到了。这要求GVT对于显示设备的模拟不能有半点含糊,必须通过软件的方式,把一个完备的显示设备“呈现”到虚拟系统那儿——其实目前的代码,只要在QEMU以及GVT中加少量的代码,就可以实现第二种方案Local Display了。
从总体上看,一个完备的显示逻辑至少要包括这样三个方面的内容:
- 显示设备的检测。系统软件一般会通过动态检测(Hot Plug Detection简称HPD)或者轮讯(Pool)的方式检测显示设备,在硬件上,必须有一些状态寄存器被预先设置好,这样系统软件才能准确地“发现”这些显示设备,并为它们设置模式(Mode)。
- 时序(timing)的模拟。硬件工程师非常重视时序,只有时序正确了,它们的硬件设备才能够准确无误地运行下去。软件依赖于时序来安排作业。对于显示器来说,时序最重要的体现就是特定显示分辨率下的刷新频率。对于一个最大刷新率为60Hz的显示器而言,平台上运行的任何3D程序的帧率(FPS)都不可以超过60帧/秒,否则就会出现画面撕裂的状况。
- 对访问数据的模拟。显示器有一块内存保存自己的配置(configuration)、设置(Setting)和性能(capability)信息,以及和显示相关的寄存器,这些寄存器被用来对显示模式进行配置。GVT当然需要对它们进行准确的模拟。
下一篇内容,我会逐一地介绍GVT是如何对显示逻辑的这三个方面进行虚拟的。
3,728 total views, 2 views today