一种应用于多系统的设备复用方法及装置
技术领域
本发明属于通信设备技术领域,涉及一种应用于多系统的设备复用方法及装置。
背景技术
Linux系统是一种开源电脑操作系统内核,“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。而不同的硬件设备有各自不同的控制方法和操作逻辑,如果内核针对每一套硬件都做一份特别的适配则会对内核开发难度和上层应用程序使用硬件带来极大的困难;为了适配于大量的不同的硬件平台,因此Linux内核对每一个子系统都定义了一套标准的操作框架,不同硬件平台厂商按照该框架来完成自己的设备驱动设计,并将驱动交给该框架统一管理。
为了使上层应用进程在不同硬件平台使用同类型设备时可以有统一的调用方法,在某些操作框架中,Linux自身实现了一个规范化的驱动,用于管理内核中的某一类设备;该驱动向用户层提供标准的调用接口,同时隐藏底层该设备驱动的实现细节;底层具体硬件的设备驱动通过该驱动提供的函数向其注册,并让其负责控制自身的函数调用,用户进程只需要通过规范的接口标准调用该规范化的设备驱动就能够完成对硬件的控制,例如Linux内核中的显示处理框架和音频处理框架就采用了这种方式。
以Linux内核中对显示的管理为例,内核可以分为两个层次,一是被内核标准化的帧缓冲驱动FrameBuffer,另一个是针对不同硬件平台有不同实现的显示驱动;显示驱动将自身向FrameBuffer注册,注册的结构体中含有显示缓存区以及显示驱动的相关信息,并将部分操作交由FrameBuffer管理。具有框架的Android系统请求显示绘制的过程为:通过系统调用请求FrameBuffer,然后FrameBuffer再根据注册的结构体的信息来操作显存或将请求传递给显示驱动完成操作。
在多Android系统同时运行但只有一个物理显示屏的情况下,现有的技术方案则是将虚拟化实现在FrameBuffer层中,具体步骤为:根据显示驱动注册到FrameBuffer中的结构体创建多份虚拟的结构体(与同时运行的系统数相同,每个系统对应一个虚拟出的结构体),显示驱动注册的结构体关联真实的驱动函数,虚拟的结构体关联设备实现的函数(分别为open、close、read、write、ioctl),并分配与显存同样大小的缓存区。在Android系统请求绘制时,若发起请求的系统处于前台则在FrameBuffer层中通过真实注册的结构体与显示驱动正常交互和操作显示缓存区。若发起请求的系统处于后台,则通过与该系统相对应的虚拟的结构体调用自己实现的函数,在自己实现的函数中,除open和close外,不对传递来的数据进行处理和保存,只返回0表示操作正确。当多系统的前后台发生切换时,前台系统将显存中的数据保存到自身对应的虚拟结构体指向的缓存中,后台系统将自身对应的虚拟结构体指向的缓存中的数据拷贝到显存,从而完成显示切换。
然而,随着Android系统对图形处理日趋复杂,上述内核管理模式已难以满足工作要求,主要存在以下技术缺陷:首先,Android系统请求FrameBuffer时传递来的数据为双向的,需要处理后返回给Android,并与Android维护的相关状态保持同步,这就意味着自己实现的函数必须对数据状态进行正确处理,而现有的方案中并未对数据进行处理,这将导致Android由于状态错误而崩溃;其次,显示驱动出于安全考虑不再向FrameBuffer直接暴露显存首地址,这将导致现有的技术方案无法拷贝显存数据完成前后台切换。
发明内容
本发明的目的旨在针对上述现有技术中存在的问题,提供一种应用于多系统的设备复用方法及装置,保证内核中保存的设备状态始终与上层系统维护的相关状态同步,特别是可以避免前后台系统切换时因状态不一致而导致的系统崩溃问题;并进一步解决了因缺少设备首地址而导致的前后台系统无法切换的问题。
为了达到以上目的,本发明采用以下技术方案来实现。
本发明提供了一种应用于多系统的设备复用方法,步骤如下:
接收来自Linux用户空间的设备操作请求以及发送者进程号;
根据设备操作请求判断操作类型;
根据发送者进程号判断操作请求来自前台还是后台;
若操作请求来自前台,依据操作请求,执行真实操作,并记录真实操作后的设备资源和/或设备状态;
若操作请求来自后台,依据操作请求,执行伪操作,并记录伪操作后的伪设备资源和/或伪设备状态。
上述应用于多系统的设备复用方法,对于同一操作请求,真实操作与伪操作执行的操作逻辑相同,真实操作内容为执行操作逻辑并作用于设备,伪操作内容为执行操作逻辑不作用于设备。
上述应用于多系统的设备复用方法,将真实操作后的设备资源和/或设备状态记录于第一设备链表中。
上述应用于多系统的设备复用方法,将伪操作后的伪设备资源和/或设备状态记录于第二设备链表中。
上述应用于多系统的设备复用方法,当前台系统与后台系统进行切换时,进一步包括以下步骤:
依据接收的前台系统与后台系统切换请求,暂停对来自Linux用户空间的设备操作请求的处理;
对设备进行初始化操作;
将记录的待切换后台系统的伪设备资源和/或伪设备状态重新设置为设备资源和/或设备状态,完成后台系统到前台系统的切换;
将记录的待切换前台系统的设备资源和/或设备状态重新设置为伪设备资源和/或伪设备状态,完成前台系统到后台系统的切换;
前台系统和后台系统切换完成后,恢复对来自Linux用户空间的设备操作请求的处理。
本发明进一步提供了一种应用于多系统的设备复用装置,其特征在于包括:
接收模块,接收来自Linux用户空间的设备操作请求以及发送者进程号;
操作类型判断模块,根据设备操作请求判断操作类型;
请求系统判断模块,根据发送者进程号判断操作请求来自前台还是后台;
第一执行模块,若操作请求来自前台,依据操作请求,执行真实操作,并记录真实操作后的设备资源和/或设备状态;
第二执行模块,若操作请求来自后台,依据操作请求,执行伪操作,并记录伪操作后的伪设备资源和/或伪设备状态。
上述应用于多系统的设备复用装置,对于同一操作请求,第一执行模块和第二执行模块具有相同的操作逻辑。
上述应用于多系统的设备复用装置,第一执行模块包括用于真记录实操作后的设备资源和/或设备状态的第一设备链表。
上述应用于多系统的设备复用装置,第二执行模块包括用于记录伪操作后的伪设备资源和/或设备状态的第二设备链表。
上述应用于多系统的设备复用装置,进一步包括用于前台系统和后台系统进行切换的,
暂停模块,接收前台系统与后台系统切换的请求,暂停对来自Linux用户空间的设备操作请求的处理;
初始化模块,对设备进行初始化操作;
第一重置模块,依据第二设备链表中记录的待切换后台系统的伪设备资源和/或伪设备状态,在第一执行模块重新设置设备资源和/或设备状态,完成后台系统到前台系统的切换;
第二重置模块,依据第一设备链表中记录的待切换前台系统的设备资源和/或设备状态,在第二执行模块重新设置伪设备资源和/或设备状态,完成前台系统到后台系统的切换;
恢复模块,前台系统和后台系统切换完成后,恢复对来自Linux用户空间的设备操作请求的处理。
本发明提供的应用于多系统的设备复用方法及装置,具有以下至少一项有益效果:
1、由于本发明通过模拟真实驱动对来自后台系统的设备操作请求进行伪操作,保证了每个运行的上层系统与对应内核中保存的设备状态保持一致;进一步前后台系统切换后,内核始终与前台系统保持状态同步;
2、由于本发明依据记录的前后台系统的数据通道以及与设备相关数据信息实现前后台系统的切换,由于数据状态同步,不仅避免了因缺少设备首地址无法完成前后台系统切换的问题,而且提高了前后台系统切换效率,增加用户体验舒适感;
3、由于本发明模拟操作仅对涉及数据通道操作进行处理,避免多系统在同时请求操作时的系统资源占用增加,其与单系统请求操作时资源占用差别极小;
4、由于本发明采用设备链表保存设备驱动模块中的数据通道和与设备相关的数据信息,用于前后台系统切换时数据状态同步,保证了前后台系统切换的效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,以下将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,以下描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图所示实施例得到其它的实施例及其附图。
图1为本发明实施例的应用于多系统的设备复用方法流程图。
图2为本发明实施例的当前后台系统切换时的设备复用方法流程图。
图3为本发明实施例的应用于多系统的设备复用装置流程图。
图4为本发明实施例的Linux内核架构示意图。
图5为本发明实施例的结构体fb_virt的创建流程图。
图6为本发明实施例的Fake-MDP模块初始化流程图。
图7为本发明实施例的请求显示流程图。
图8为本发明实施例的显示图像流程图。
图9为本发明实施例的前后胎系统切换时序图。
图10为本发明另一实施例的前后胎系统切换时序图。
具体实施方式
以下将结合附图对本发明各实施例的技术方案进行清楚、完整的描述,显然,所描述实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所得到的所有其它实施例,都属于本发明所保护的范围。
实施例1
本实施例应用于多系统的设备复用方法实现于Linux内核,适用于高通平台,并以应用于多个Android系统的Linux内核显示驱动为例,实现于FrameBuffer层以下、显示驱动层中。本实施例结合显示驱动对设备复用方法进行详细的解释,但该解释并不构成对本发明的任何限定。
图1示出了本实施例提供的应用于多系统的设备复用方法流程图,步骤如下:
步骤101,接收来自Linux用户空间的设备操作请求以及发送者进程号。
用户通过上层系统(例如Android系统)发起设备操作请求,并经Linux用户空间传送至Linux内核。以图形显示为例,用户通过Android系统发起图形显示的操作请求,并经Linux用户空间传送Linux内核。此外,与设备操作请求一起发送给Linux内核的还包括发送者进程号。
步骤102,根据设备操作请求判断操作类型。
操作类型是指设备操作请求中操作指令所对应的设备驱动中的具体操作,例如打开(open)、关闭(close)、读(read)、写(write)和通道管理(ioctl)等。在接收到设备操作请求后,需要先判断操作类型以及该操作请求来自哪个系统,该步骤的目的是判断操作类型,只有清楚了操作类型,才能进一步调用设备驱动中的操作函数。可以依据设备操作请求来判断操作属于哪一种类型,从而调用相应的驱动函数。以请求显示为例,通过操作请求可以看出,操作类型是“显示”,则需要调用相应的显示驱动函数。
步骤103,根据发送者进程号判断操作请求来自前台还是后台;
发送者进程,是指由操作请求发起系统系统调用内核传递设备操作请求的进程(例如SurfaceFlinger进程(显示)、Audioflinger进程(音频)等);相应的进程编号即为发送者进程号,通过发送者进程号不仅可以判断设备操作系统来自于哪个系统,还可以判断该系统是在前台运行还是在后台运行,其实现过程可以参考本领域已经披露的常用方法(Andrus J,Dall C,Hof A V,et al.Cells:a virtual mobile smart phonearchitecture[C]//ACM Symposium on Operating Systems Principles.ACM,2011:173-187.)。这里的前台是指当前与用户发生交互、响应用户操作的系统,后台是指正在运行但不与用户交互的系统。
本实施例中,基于上述原理,通过构建虚拟设备结构体的方式来实现,在Linux内核创建多个虚拟设备结构体(对于显示驱动管理而言,即在FrameBuffer层中创建虚拟出的多个设备结构体fb_virt),每个虚拟设备结构体对应一个系统(例如Android系统),结构体(例如fb_virt)的状态与该系统的状态实时对应,用来区分操作请求(例如显示请求)来自的系统,而根据结构体fb_virt中的标识可以判断请求系统处于前台还是后台。
例如,当一Android系统通过通道管理(ioctl)向FrameBuffer请求显示时,首先调用保存于fb_info中的显示驱动函数,并根据发送者进程号,将显示驱动函数传递的参数赋值为操作请求系统对应的结构体fb_virt,这样便可以依据结构体fb_virt及其标识判断操作请求来自于哪个Android系统以及该系统处于前台还是后台。
步骤104,若操作请求来自前台,依据操作请求,执行真实操作,并记录真实操作后的设备资源和/或设备状态。
若操作请求来自前台,继续依据驱动函数调用操作函数完成对设备的真实操作;操作结束后,要记录真实操作对设备资源和/或状态的改变即得到真实操作后的设备资源和/或设备状态,还要将设备操作结果(执行设备操作请求后成功或失败的状态)反馈给操作请求系统。
设备资源,是指物理硬件的计算或存储资源,可以由抽象出的结构体数组代表,例如数据通道池(Pipe通道池)、显示缓存池等。
设备状态,是指保存的硬件状态,例如开状态、关状态、数据处理状态、数据待处理状态、硬件合成器的使用状态等。
上述设备资源和设备状态用于保持与上层系统(例如Android系统)维护的相关状态一致,以便在进行前后台切换时,避免系统因状态相异引起的系统崩溃问题,可以记录于第一设备链表中,第一设备链表保存于Linux内核层或者相应的执行模块中。以显示设备为例,第一设备链表可以记录于显示驱动层或者其中需要调用第一设备链表的执行模块中。
以分配数据通道(pipe)为例,请求分配的Android系统处于前台时,依据分配驱动函数调用分配操作函数进行分配操作,然后将数据通道分配状况记录于第一设备链表中,还要将执行成功的状态反馈给Android系统。
再以显示图形为例,请求显示的Android系统处于前台时,依据显示驱动函数调用显示操作函数对显示设备进行操作,然后将Pipe通道的分配信息数据和显示数据记录于第一设备链表中,还要将执行成功的状态反馈给Android系统。
步骤105,若操作请求来自后台,依据操作请求,执行伪操作,并记录伪操作后的伪设备资源和/或伪设备状态。
若操作请求来自后台,继续依据驱动函数调用操作函数完成对设备的伪操作;伪操作结束后,要记录伪操作对设备资源和/或状态的改变即得到伪操作后的伪设备资源和/或设备状态,还要将伪设备操作结果(执行设备操作请求后成功或失败的状态)反馈给操作请求系统。
伪设备资源,是指虚拟的物理硬件的计算或存储资源,可以由抽象出的结构体数组代表,与设备资源相似,但不关联硬件的数据通道池和硬件合成器等。
伪设备状态,是指保存的虚拟的硬件状态,例如开状态、关状态、数据处理状态、数据待处理状态、硬件合成器的使用状态等。
上述伪设备资源和伪设备状态用于保持与上层系统(例如Android系统)维护的相关状态一致,以便在进行前后台切换时,避免系统因状态相异引起的系统崩溃问题,可以记录于第二设备链表中,第二设备链表保存于Linux内核层或者相应的执行模块中。以显示设备为例,第二设备链表可以记录于显示驱动层或者其中需要调用第二设备链表的执行模块中。
以分配数据通道(pipe)为例,请求分配的Android系统处于后台时,依据分配驱动函数调用分配操作函数进行分配操作,然后将数据通道分配状况记录于第二设备链表中,还要将执行成功的状态反馈给Android系统。
再以显示图形为例,请求显示的Android系统处于后台时,仅是通过数据通道保存图形数据信息、图像缓存地址和硬件合成器地址,并将操作请求系统发来的数据和请求参数记录于第二设备链表中,但不对数据进行处理即不对显示设备进行真实操作,以免影响显示设备的运行,还要将执行成功的状态反馈给Android系统。
从上述举例可以看出,当操作请求来自后台时,对于不同的操作请求,其处理过程是有差异的,此时仅对影响Android系统状态有影响的状态数据进行逻辑操作,而对于影响设备运行的操作请求,仅是启动数据通道、保存数据信息和请求参数,并不对数据进行处理。
从对步骤104和105的分析可以看出,对于同一操作请求(特别是影响上层系统维护的相关状态的操作请求,例如开设备、关设备、分配数据通道等),真实操作与伪操作执行的操作逻辑相同,真实操作内容为执行操作逻辑并作用于设备,伪操作内容为执行操作逻辑不作用于设备。
实施例2
图2示出了当前台系统与后台系统进行切换时,上述应用于多系统的设备复用方法流程图,包括以下步骤:
步骤201,依据接收的前台系统与后台系统切换请求,暂停对来自Linux用户空间的设备操作请求的处理。
用户通过上层系统(例如Android系统)发起系统切换请求,并经Linux用户空间传送至Linux内核。此时,需要暂停对来自Linux用户空间设备操作请求的处理,可以采用本领域已经披露的上锁之类的常规手段实现暂定处理;上锁,是指通过互斥锁来阻止其他进程进入临界区,并挂起阻塞在互斥锁中的进程,从而实现对设备操作请求的暂停处理(《linux操作系统中互斥与同步控制》或李国禄,王霞.1inux操作系统中互斥与同步控制[J].青海師專學報,2007,27(5):109-111)。
以显示驱动为例,当发生前后台系统切换时,先对FrameBuffer的ioctl函数上锁(Lock),确保不会有新的显示请求在前后台系统切换过程中传入显示驱动层。
步骤202,对设备进行初始化操作。
该步骤的目的是使设备重新处于待命状态,即把设备状态信息和数据信息重新设置为设备未使用时的状态。。
步骤203,将记录的待切换后台系统的伪设备资源和/或伪设备状态重新设置为设备资源和/或设备状态,完成后台系统到前台系统的切换。
该步骤的目的是依据步骤105记录的待切换后台系统的伪设备资源和/或伪设备状态重新设置为与设备关联的设备资源和/或设备状态,进而依据所得到的设备资源和/或设备状态重新设置数据通道,完成后台系统到前台系统的切换,切换后的前台系统维护的相关状态与重置的设备资源和/或设备状态保持一致;由于重置的设备资源和/或设备状态与设备关联,可以通过重置的数据通道以及设备资源和/或设备状态完成对操作函数的调用,实现对设备的操作。
步骤204,将记录的待切换前台系统的设备资源和/或设备状态重新设置为伪设备资源和/或伪设备状态,完成前台系统到后台系统的切换。
该步骤的目的是依据步骤104记录的待切换前台系统的设备资源和/或设备状态重新设置为与设备不关联的伪设备资源和/或伪设备状态,进而依据所得到的伪设备资源和/或伪设备状态重新设置数据通道,完成前台系统到后台系统的切换,切换后的后台系统维护的相关状态与重置的伪设备资源和/或伪设备状态保持一致;由于重置的伪设备资源和/或伪设备状态与设备不关联,因此重置的数据通道以及设备资源和/或设备状态不会影响设备的运行。
前后台系统切换后,需要依据重置的设备资源和/或设备状态调用操作函数对设备执行一次操作,以使设备进入运行状态。
以Linux内核显示驱动的前台Android系统与后台Android系统切换为例,首先分别依据记录的前台Android系统的Pipe分配信息和记录的后台Android系统的Pipe分配信息逐个释放各自的Pipe通道;然后将第一设备链条中保存的与前台Android系统对应的Pipe分配信息和显示数据信息与第二设备链条中保存的与后台Android系统对应的Pipe分配信息和显示数据信息进行交换;再根据交换后第一设备链条中保存的的Pipe分配信息和显示数据重置与设备关联的Pipe通道和计算显示数据;根据交换后第二设备链条中保存的的Pipe分配信息和显示数据重置伪Pipe通道,但不计算显示数据,以免影响显示设备运行。前后台Android系统切换后,需要调用显示操作函数进行一次屏幕刷新,以使显示设备进入运行状态。
以上步骤203和步骤204的顺序对前后台系统切换没有影响,是可以互换的,其最终达到的效果是一致的。
步骤205,前台系统和后台系统切换完成后,恢复对来自Linux用户空间的设备操作请求的处理。
前后台系统切换完成后,需要对已经上锁的进程进行解锁,恢复对来自Linux用户空间设备操作请求的处理。解锁与上锁相对,可以采用本领域已经披露的解锁之类的常规手段实现恢复运行(《linux操作系统中互斥与同步控制》或李国禄,王霞.1inux操作系统中互斥与同步控制[J].青海師專學報,2007,27(5):109-111)。
以显示驱动为例,当前后台系统切换完成后,对FrameBuffer的ioctl函数解锁,恢复对切换后前后台操作请求的接收。
实施例3
图4示出了本实施例提供的应用于多系统的设备复用装置结构框图所示,包括:
接收模块,接收来自Linux用户空间的设备操作请求以及发送者进程号。
用户通过上层系统(例如Android系统)发起设备操作请求,并经Linux用户空间传送至Linux内核由接收模块接收。
操作类型判断模块,根据设备操作请求判断操作类型。
接收模块接收到设备操作请求后,需要先判断操作类型以及该操作请求来自哪个系统,该模块就是用于判断操作类型,只有清楚了操作类型,才能进一步调用设备驱动中的操作函数。可以依据设备操作请求来判断操作属于哪一种类型,从而调用相应的驱动函数。
请求系统判断模块,根据发送者进程号判断操作请求来自前台还是后台;
发送者进程,是指由操作请求发起系统系统调用内核传递设备操作请求的进程(例如SurfaceFlinger进程(显示)、Audioflinger进程(音频)等);相应的进程编号即为发送者进程号,通过发送者进程号不仅可以判断设备操作系统来自于哪个系统,还可以判断该系统是在前台运行还是在后台运行,其实现过程可以参考本领域已经披露的常用方法(Andrus J,Dall C,Hof A V,et al.Cells:a virtual mobile smart phonearchitecture[C]//ACM Symposium on Operating Systems Principles.ACM,2011:173-187.)。这里的前台是指当前与用户发生交互、响应用户操作的系统,后台是指正在运行但不与用户交互且对设备不进行操作的系统。
第一执行模块,若操作请求来自前台,依据操作请求,执行真实操作,并记录真实操作后的设备资源和/或设备状态。
若操作请求来自前台,第一执行模块继续依据驱动函数调用操作函数完成对设备的真实操作;操作结束后,第一执行模块记录真实操作对设备资源和/或状态的改变即得到真实操作后的设备资源和/或设备状态,还要将设备操作结果(执行设备操作请求后成功或失败的状态)反馈给操作请求系统。
第二执行模块,若操作请求来自后台,依据操作请求,执行伪操作,并记录伪操作后的伪设备资源和/或伪设备状态。
若操作请求来自后台,第二执行模块继续依据驱动函数调用操作函数完成对设备的伪操作;伪操作结束后,第二执行模块记录伪操作对设备资源和/或状态的改变即得到伪操作后的伪设备资源和/或设备状态,还要将伪设备操作结果(执行设备操作请求后成功或失败的状态)反馈给操作请求系统。
本实施例中以Linux内核为例,其架构示意图如图4所示,该Linux内核包括FrameBuffer层和位于FrameBuffer层之下的显示驱动层,FrameBuffer层设置显示设备结构体fb_info,结构体fb_info包含多个操作类型的驱动函数,例如打开(open)、关闭(close)、读(read)、写(write)和通道管理(ioctl)等,在FrameBuffer层中进一步创建出多个虚拟的结构体fb_virt,与多个Android系统对应,用来区分操作请求来自的系统,但结构体fb_virt没有用于存储显存数据的缓存区。高通平台显示驱动模块简记MDP模块(即第一执行模块),实现于显示驱动层中,负责处理Android系统传递到内核的图像处理请求,通过硬件对图像进行变换和叠加后将图像数据送达显示屏显示。MDP模块氛围两个部分:Pipe和Mixer,这里通道Pipe是一个数据结构,其中存储图像数据信息、图像缓冲地址和硬件合成器的地址,在显示驱动模块中根据其存储的数据来控制硬件合成器,被视为抽象的数据通道,MDP中含有多个Pipe用于分配;Mixer为硬件部分,负责合成图像数据并传送到显示屏,由MDP模块读写寄存器控制执行操作。
上述结构体fb_virt的创建过程为:如图5所示,在Android系统打开FrameBuffer层时,自动判断结构体fb_virt是否存在,若存在,转到增加引用计数步骤,记录同一Android系统进行设备操作的次数;若结构体fb_virt不存在,首先创建结构体fb_virt,并设置标识,然后转到增加引用计数步骤,记录同一Android系统进行设备操作的次数。其中结构体fb_virt用于区分来自哪个Android系统,而其相应的标识为请求发送者进程号,用于区分Android系统处于前台还是后台。
该显示驱动层中,进一步设置有Fake-MDP模块(即第二执行模块),Fake-MDP模块在Linux内核启动后显示驱动probe时进行初始化,初始化过程如图6所示,根据描述MDP模块操作函数和数据信息的结构体msm_fb_data_type(mfd),创建描述Fake-MDP模块操作函数和数据信息的结构体virt_mfd,然后将mfd中有关通道Pipe(包括Pipe列表和Pipe信息)和图像合成器Mixer的数据拷贝到virt_mfd,再将Fake-MDP模块关联到结构体virt_mfd,即完成了Fake-MDP的初始化。Fake-MDP模块因具有与MDP模块相同的Pipe、Mixer和操作函数(即操作逻辑),操作函数如下所示,包括分配函数、释放通道函数、显示函数等。但该Fake-MDP模块没有与之匹配的硬件,所进行的数据处理全部作用于伪设备,操作的设备资源为伪设备资源,因此不会影响真实显示设备的运行。
handle_ioctl_overlay_prepare:
mdss_mdp_overlay_unset:
mdss_mdp_overlay_play:
mdss_mdp_overlay_kickoff:
mdss_fb_handle_buf_sync_ioctl:
mdss_fb_display_commit:
mdss_fb_blank_sub:
MDP模块和Fake-MDP模块均具有各自用于记录数据的设备链表,即第一设备链表和第二设备链表。
图7示出了本实施例的请求显示流程图,FrameBuffer层接收Android系统的的显示请求,FrameBuffer层依据显示请求判断出操作类型为显示,然后FrameBuffer层调用结构体fb_info中的显示驱动函数和当前系统对应的结构体fb_virt,并将结构体fb_virt赋值给显示驱动函数传递的参数,然后通过显示驱动函数调用MDP模块,MDP模块根据传递下来的结构体fb_virt判断显示请求来自的Android系统以及该Android系统是否在前台运行,若该Android系统在前台运行则正常调用MDP模块中的函数完成操作,若该Android系统处于后台运行则调用Fake模块,通过调用Fake-MDP模块中的函数完成伪操作。进一步,MDP模块和Fake-MDP模块需要进一步将操作结果或伪操作结构反馈给上层Android系统。
MDP模块的操作函数中部分需要与Android上层的图形处理模块同步状态,其它函数仅处理数据。图8示出了本实施例的显示图像流程图,当Android系统处于前台,需要显示图像数据时,便会通过FrameBuffer层中的ioctl预先向MDP请求分配Pipe,每个Pipe代表了Android系统的一个图层;Pipe分配好后,接收由Android系统传递的图像数据和刷新屏幕的请求,MDP模块根据Pipe存储的图像合成器地址信息通过读写寄存器控制Mixer依据图形数据合成图像,并将合成好的图形传送给显示屏显示,从而完成一次屏幕更新。在Pipe分配好后,还需要将Pipe通道的分配信息和Pipe剩余情况进行记录,优选是通过第一设备链表来记录。在进行图像显示时,也需要将图像数据记录,优选是通过第一设备连败哦记录。
而当Android系统处于后台时,Fake-MDP模块对显示数据的处理(即伪操作)分为两种类型,一种类似于Pipe通道分配,此时与MDP的处理逻辑相同,并保存Pipe分配信息和Pipe剩余情况于第二设备链表,使Fake-MDP模块保存的Pipe状态与上层Android系统同步;另一种类似于图像显示,此时Fake-MDP模块仅利用第二设备链表保存Android系统发送的显示数据和请求参数,但不对显示数据进行处理,从而达到既能以固有的逻辑与Android系统状态保持同步,又能不影响Mixer的工作,进而不影响物理显示屏。
上述FrameBuffer层可以通过自身的进程完成接收操作请求、判断操作类型的功能,此时,FrameBuffer层本身既作为接收模块也作为操作类型判断模块;FrameBuffer层也可以通过在FrameBuffer层中设置接收模块和操作类型判断模块来实现,此时由接收模块接收来自Linux用户空间的设备操作请求,然后由操作类型判断模块根据接收模块接收的设备操作请求判断操作类型,再由FrameBuffer层或者相应模块调用结构体fb_info中的显示驱动函数和当前系统对应的结构体fb_virt,并利用显示驱动函数调用请求系统判断模块或者MDP模块。
上述MDP模块在接收到调用操作函数请求时,可以通过MDP模块中的进程达到上述目的,此时MDP模块即作为请求系统判断模块,当然也可以在MDP模块中设置请求系统判断模块来对请求显示的Android系统是否在前台运行进行判断,当然也可以通过在FrameBuffer层或设备驱动层设置请求系统判断模块来对请求显示的Android系统是否在前台运行进行判断。
通过上述MDP和Fake-MDP模块中建立的第一设备链表和第二设备链表用于记录前后台Android系统在两个模块中的Pipe分配信息、传递的显示数据和请求参数.基于上述设备链表记录的数据,可以快速、高效的实现前后台系统切换,详细见实施例4。
实施例4
本实施例针对前台系统和后台系统进行切换,提供了应用于多系统的设备复用装置,进一步包括,
暂停模块,接收前台系统与后台系统切换的请求,暂停对来自Linux用户空间的设备操作请求的处理;
初始化模块,对设备进行初始化操作;
第一重置模块,依据第二设备链表中记录的待切换后台系统的伪设备资源和/或伪设备状态,在第一执行模块重新设置设备资源和/或设备状态,完成后台系统到前台系统的切换;
第二重置模块,依据第一设备链表中记录的待切换前台系统的设备资源和/或设备状态,在第二执行模块重新设置伪设备资源和/或设备状态,完成前台系统到后台系统的切换;
恢复模块,前台系统和后台系统切换完成后,恢复对来自Linux用户空间的设备操作请求的处理。
本实施例结合图9给出的前后台系统切换时序示意图,对基于Linux内核显示驱动的前后台Android系统切换过程进行解释,在前后台Android系统切换发生时,FrameBuffer层接收上层前后台Android系统切换请求;再对结构体fb_info的ioctl函数上锁,保证切换过程不会有新的显示请求传入驱动;然后对现实设备进行初始化;再由FrameBuffer层通知Fake-MDP模块,Fake-MDP模块在收到切换通知后根据第二设备链表保存的Pipe分配信息逐个释放Pipe通道;然后由Fake-MDP模块通知MDP模块,并向其传递第二设备链表头指针;MDP模块收到通知后同样根据第一设备链表记录的信息逐个释放Pipe通道,然后根据从Fake-MDP传来的第二设备链表所保存的Pipe分配信息与显示数据重新设置本模块的Pipe通道和计算显示数据,随后用第一设备链表中的数据替换第二设备链表中的数据并将第二设备链表头指针返回给Fake-MDP模块;此时Fake-MDP模块中第二设备链表保存的状态信息为待切换前台Android在MDP模块中的信息,Fake-MDP模块根据第二设备链表保存的Pipe分配信息对本模块Pipe重新进行设置;随后通知FrameBuffer层切换成功;FrameBuffer层收到消息后调用MDP模块函数进行一次屏幕刷新,并解锁ioctl函数,至此一次显示切换完成。上述FrameBuffer层对结构体fb_info的ioctl函数上锁,可以由FrameBuffer层或者设置在FrameBuffer层中的暂停模块来时实现,暂停模块根据接收模块接收的前后台Android系统切换请求,保证切换过程不会有新的显示请求传入驱动。暂停模块可以通过本领域已经披露的常规函数上锁(Lock)来实现。
上述对显示设备的初始化可以由初始化模块来来实现,初始化模块可以通过本领域经披露的常规显示设备初始化来实现。
上述MDP模块中,根据从Fake-MDP传来的第二设备链表所保存的Pipe分配信息与显示数据重新设置本模块的Pipe通道和计算显示数据可以直接由MDP模块或者由位于MDP模块中的第一重置子模块来实现,由于MDP模块中的Pipe通道已经释放,第一重置子模块可以利用从Fake-MDP传来的第二设备链表所保存的Pipe分配信息与显示数据重置Pipe分配信息与显示数据。
上述Fake-MDP模块中,根据第二设备链表保存的Pipe分配信息对本模块Pipe重新进行设置可以直接由Fake-MDP模块或者由位于ake-MDP模块中的第二重置子模块来实现,由于Fake-MDP模块中Pipe通道已经释放,第二重置子模块可以利用从MDP传来的第二设备链表所保存的Pipe分配信息重置Pipe分配信息,由于Fake-DMP模块不会对显示数据处理,因此,不需要讲显示数据进行重置。
对ioctl函数解锁,可以由FrameBuffer层或者设置在FrameBuffer层中的恢复模块来时实现,恢复模块可以通过本领域已经披露的常规函数解锁来实现。
实施例5
本实施例与实施例4给出的前后台系统切换过程基本相同,不同是的是通知过程MDP模块和Fake-DMP模块。
本实施例结合图10给出的前后台系统切换时序示意图,对基于Linux内核显示驱动的前后台Android系统切换过程进行解释,在前后台Android系统切换发生时,FrameBuffer层接收上层前后台Android系统切换请求;再对结构体fb_info的ioctl函数上锁,保证切换过程不会有新的显示请求传入驱动;然后对现实设备进行初始化;再由FrameBuffer层通知MDP模块,MDP模块在收到切换通知后根据第一设备链表保存的Pipe分配信息逐个释放Pipe通道;然后由MDP模块通知Fake-MDP模块,并向其传递第一设备链表头指针;Fake-MDP模块收到通知后同样根据第二设备链表记录的信息逐个释放Pipe通道,然后根据从MDP传来的第一设备链表所保存的Pipe分配信息重新设置本模块的Pipe通道,随后用第二设备链表中的数据替换第一设备链表中的数据并将第一设备链表头指针返回给MDP模块;此时MDP模块中第一设备链表保存的状态信息为待切换后台Android在Fake-MDP模块中的信息,MDP模块根据第一设备链表保存的Pipe分配信息和显示数据对本模块Pipe和显示数据重新进行设置;随后通知FrameBuffer层切换成功;FrameBuffer层收到消息后调用MDP模块函数进行一次屏幕刷新,并解锁ioctl函数,至此一次显示切换完成。
本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发明的原理,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。本领域的普通技术人员可以根据本发明公开的这些技术启示做出各种不脱离本发明实质的其它各种具体变形和组合,这些变形和组合仍然在本发明的保护范围内。