一种用于Android系统的GPU虚拟化方法、系统及介质与流程

文档序号:21818604发布日期:2020-08-11 21:32阅读:704来源:国知局
一种用于Android系统的GPU虚拟化方法、系统及介质与流程

本发明涉及gpu虚拟化与android系统开发技术,具体涉及一种用于android系统的gpu虚拟化方法、系统及介质。



背景技术:

hypervisor叫做虚拟机监视器(virtualmachinemonitor),是一种运行其他操作系统的操作系统。hypervisor运行在物理硬件和操作系统之间的中间层操作系统,可允许多个操作系统和应用共享一套基础物理硬件,运行在hypervisor之上的操作系统称之为客户机操作系统(guestos)。

由于多个guestos共享一套基础物理硬件,在硬件资源充足的情况下,每个guestos可单独使用一个独立的物理硬件资源,如每个guestos各自使用一块gpu硬件。当硬件资源不足的情况下,则需要将一个物理硬件进行虚拟化,供给多个guestos使用,即实际上是多个guestos竞争一个gpu硬件资源。

目前,市场上的部分高端gpu一般会自带有硬件虚拟化的功能,该功能的实现是通过硬件指令将一块gpu硬件虚拟化为多个独立的gpu供多个guestos使用,从而在gpu内部实现对gpu资源的分配和调用,不过由于gpu的硬件虚拟化必须得到芯片厂商的支持,受限于平台和硬件。虽然,还可以通过软件虚拟化gpu,但大多gpu软件虚拟化方法都是应用于linux系统,未有应用于android系统。

因此,有必要设计一种适用于android系统的gpu虚拟化方法。



技术实现要素:

本发明的目的在于:基于hypervisor技术一个处理器运行两个操作系统(其中一个系统为android)或多个操作系统,在只android系统没有可供使用的gpu硬件资源的前提下,提供一种适用于android系统的gpu虚拟化方法,能够在android端通过虚拟gpu访问后端硬件gpu实现图形的渲染。

为了达到上述目的,本发明解决技术问题所采用的技术方案如下:一种用于android系统的gpu虚拟化方法,其特征在于,包括:

配置android系统的虚拟机在其需要处理渲染任务时,调用其opengl库的api并将相应渲染指令发送至其virtio-gpu;

配置具有gpu硬件资源的虚拟机,通过其virtio-gpu驱动接收由其它android系统的虚拟机的virtio-gpu发送的渲染指令,以及解析所接收到的每个渲染指令,并相应地调用其opengl库的api,以使其具有的gpu硬件资源处理其它android系统的虚拟机的渲染任务。

根据一种具体的实施方式,本发明用于android系统的gpu虚拟化方法还包括,配置android系统的虚拟机的opengl库为mesa库。

根据一种具体的实施方式,本发明用于android系统的gpu虚拟化方法还包括,配置android系统的虚拟机的gralloc模块,使所述gralloc模块通过所述virtio-gpu分配共享内存。

根据一种具体的实施方式,本发明用于android系统的gpu虚拟化方法还包括,配置android系统的虚拟机的libegl库文件,以在调用其opengl库的api之前,判定是否有gpu硬件资源存在。

根据一种具体的实施方式,本发明用于android系统的gpu虚拟化方法中,android系统的虚拟机与具有gpu硬件资源的虚拟机之间的virtio-gpu数据交互通过hypervisor实现。

基于与本发明公开的用于android系统的gpu虚拟化方法相同的发明构思,在具体实施的一方面,本发明还提供一种用于android系统的gpu虚拟化系统,其包括虚拟机和主机;其中,所述主机用于运行hypervisor,以实现android系统的虚拟机与具有gpu硬件资源的虚拟机之间的virtio-gpu数据交互;

android系统的虚拟机,用于在需要处理渲染任务时,调用opengl库的api并通过virtio-gpu将相应渲染指令发送至具有gpu硬件资源的虚拟机;

具有gpu硬件资源的虚拟机,用于通过virtio-gpu接收其它android系统的虚拟机发送的渲染指令,以及通过解析所接收到的渲染指令,而相应地调用opengl库的api,以使其具有的gpu硬件资源处理其它android系统的虚拟机的渲染任务。

基于与本发明公开的用于android系统的gpu虚拟化方法相同的发明构思,在具体实施的一方面,本发明还提供一种图像渲染方法,包括以下步骤:

android系统的虚拟机接收到渲染任务后,调用其opengl库的api并将相应渲染指令发送至其virtio-gpu;

具有gpu硬件资源的虚拟机通过virtio-gpu接收其它android系统的虚拟机发送的渲染指令,并通过解析所接收到的渲染指令,而相应地调用opengl库的api,使其具有的gpu硬件资源处理其它android系统的虚拟机的渲染任务,并将渲染结果返回至相应的android系统的虚拟机。

此外,本发明在具体实施的一方面,还提供一种可读存储介质,其上存储有一个或多个程序,其特征在于,该一个或多个程序被一个或多个处理器执行时实现本发明用于android系统的gpu虚拟化方法或本发明的图像渲染方法。

综上所述,与现有技术相比,本发明的有益效果是:

本发明用于android系统的gpu虚拟化方法,通过配置android系统的虚拟机,使其在需要处理渲染任务时,调用opengl库的api并通过virtio-gpu将相应渲染指令发送至具有gpu硬件资源的虚拟机;以及,通过配置具有gpu硬件资源的虚拟机,使其通过virtio-gpu接收其它android系统的虚拟机发送的渲染指令,以及通过解析所接收到的渲染指令,而相应地调用opengl库的api,以使其具有的gpu硬件资源处理其它android系统的虚拟机的渲染任务。因此,本发明能够在android系统没有gpu硬件资源的情况下,通过gpu虚拟化快速地实现复杂的图形渲染,而且,并没有改变android系统的图形绘制框架,不仅保证了系统的兼容性,还是实现了跨芯片平台的应用。

附图说明:

图1为本发明用于android系统的gpu虚拟化系统的架构图;

图2为物理gpu与本发明的虚拟gpu的渲染过程示意图;

图3为本发明android系统的虚拟机初始化的流程示意图;

图4为本发明android系统的虚拟机渲染过程的流程示意图。

具体实施方式

下面结合附图及具体实施例对本发明作进一步的详细描述。但不应将此理解为本发明上述主题的范围仅限于以下的实施例,凡基于本发明内容所实现的技术均属于本发明的范围。

如图1所示,本发明用于android系统的gpu虚拟化系统的架构为在硬件上裸机运行两个guestos,其中前端的系统为android,后端的系统为linux系统,且由一个hypervisor对guestos进行控制。

本发明用于android系统的gpu虚拟化系统主要包括:前端guestos(即不具有gpu硬件资源的android系统的虚拟机,可以为多个),后端guestos(即具有gpu硬件资源的虚拟机),主机上运行的hypervisor,后端guestos的图形命令处理服务,以及相应的硬件资源。

具体的,所述主机用于运行hypervisor,以实现android系统的虚拟机与具有gpu硬件资源的虚拟机之间的virtio-gpu数据交互;即前端guestos的virtio-gpu与后端guestos的通信管理机制由hypervisor构建,从而实现前端guestos与后端guestos之间的virtio-gpu通信。

其中,在前端guestos,app经由opengl库(mesa库)通过virtio-gpu访问后端guestos的物理gpu。mesa库是开源的opengl库,支持egl、opengles接口,支持绝大部分型号的gpu,包括virtio-gpu。

后端guestos的linuxkernel在4.4以上的版本支持virtio-gpu,通过标准的drm(直接渲染管理器directrenderingmanager)是给予dri(基层直接渲染)客户端直接访问硬件的内核模块的接口,支持渲染及图形内存管理功能。

因此,本发明用于android系统的gpu虚拟化系统中,virtio-gpu由前端显卡和后端显卡组成,前端显卡(virtio-gpu驱动)运行在android的内核,后端显卡(virtio-gpu驱动)运行在linux的内核。

而且,前端guestos被配置为在需要处理渲染任务时,调用opengl库的api并通过virtio-gpu将相应渲染指令发送至后端guestos。

后端guestos被配置为通过virtio-gpu接收其它android系统的虚拟机发送的渲染指令,以及通过解析所接收到的渲染指令,而相应地调用opengl库的api,以使其具有的gpu硬件资源处理前端guestos的渲染任务。

因此,前端guestos调用的opengl命令,经过virtio-gpu转换传递,从而在后端guestos代理前端guestos的opengl绘制命令,最终由后端guestos的opengl直接访问物理gpu,实现虚拟gpu访问物理gpu。

如图2所示,前端guestos上应用访问gpu是通过标准图形接口opengl,应用对使用的gpu变化无感。与原生android对比,只有opengl库和驱动的区别,即物理gpu使用厂商提供的opengl库,虚拟gpu使用的opengl库为开源的mesa库,实际上,对系统渲染流程和框架影响不大。

具体的,在本发明用于android系统的gpu虚拟化方案中,还进一步配置前端guestos的gralloc模块(图形缓冲区管理器),使该gralloc模块通过virtio-gpu分配共享内存。即gralloc模块通过virtio-gpu分配共享内存,可以确保前端guestos和后端guestos之间在渲染过程中图像零拷贝。

在本发明用于android系统的gpu虚拟化方案中,还进一步配置前端guestos的libegl库文件,以在调用libandroid_mesa之前,判定是否有gpu硬件资源存在。具体的图3所示,前端guestos的初始化流程包括:

步骤1,应用启动,hwui(负责android渲染任务分发)初始化,包括独立的绘制线程和opengl的初始化(libegl的初始化)。

步骤2,libegl是android实现的opengl的代理,初始化时判定是否有物理gpu存在,如果没有,则选择加载mesa库。如果有,则正常进入图2所示的物理gpu的初始化流程,相关流程为现有技术方案,此处不再赘述。

步骤3,mesa初始化,打开virtio-gpu的drm设备,初始化virtio-gpu。

再如图4所示,前端guestos的渲染过程包括:

步骤1,android应用更新,触发渲染(即需要处理渲染任务),调用hwui的draw(绘制)。

步骤2,hwui把应用的绘制请求和参数转换成opengl接口,通过mesa下发绘制命令。

步骤3,mesa把opengl的接口及参数打包,发送数据到virtio-gpu驱动。

步骤4,前端guestos的virtio-gpu与后端guestos的virtio-gpu进行通信,将相应渲染指令发送至后端guestos后端。

然后,后端guestos通过virtio-gpu接收到前端guestos的virtio-gpu发送的渲染指令,然后通过后端guestos的图形命令处理服务解析所接收到的渲染指令,从而相应地调用opengl库的api,然后,通过具有的gpu硬件资源处理前端guestos的渲染任务。

此外,在具体实施的一方面,即在本发明用于android系统的gpu虚拟化之上,增加执行渲染任务的步骤,从而实现图像渲染,该图像渲染方法包括以下步骤:

android系统的虚拟机接收到渲染任务后,调用opengl库的api并通过virtio-gpu将相应渲染指令发送至具有gpu硬件资源的虚拟机;

具有gpu硬件资源的虚拟机通过virtio-gpu接收其它android系统的虚拟机发送的渲染指令,并通过解析所接收到的渲染指令,而相应地调用opengl库的api,使其具有的gpu硬件资源处理其它android系统的虚拟机的渲染任务,并将渲染结果返回至相应的android系统的虚拟机。

而且,本发明在具体实施的一方面,还提供一种可读存储介质,如rom存储设备、移动硬盘、u盘或者光盘等存储器,将一个或多个程序写入存储器中,并一个或多个处理器来执行该存储器中的程序。如此,当该存储器中的程序被处理器执行时实现本发明用于android系统的gpu虚拟化方法或本发明的图像渲染方法

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有1条留言
  • 访客 来自[中国] 2023年10月16日 16:00
    把开源软件已经实现方案拿来申请专利?
    0
1