一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

跨进程调用的图形渲染方法、装置、电子设备与存储介质与流程

2021-10-24 13:08:00 来源:中国专利 TAG:
1.本发明涉及计算机
技术领域
:,尤其涉及一种跨进程调用的图形渲染方法、装置、电子设备与存储介质。
背景技术
::2.移动硬件平台通常为安卓(android)操作系统提供驱动程序,如与图形渲染有关的驱动支持安卓操作系统中的图形渲染接口egl/gles。3.在这些硬件平台上可能会运行桌面版的linux操作系统,如ubuntu、debian等,由于硬件厂商通常不为linux发行版提供驱动,如果在linux操作系统执行图形渲染任务能够调用安卓操作系统中的图形渲染接口将是有利的。技术实现要素:4.本发明提供一种跨进程调用的图形渲染方法、装置、电子设备与存储介质。5.本发明提供一种跨进程调用的图形渲染方法,应用于电子设备,电子设备包括:第一操作系统和与第一操作系统共享内核并部署在第一操作系统中的第二操作系统,所述第一操作系统包括第一线程,第二操作系统包括第二线程,所述方法包括:根据所接收到的图形渲染任务请求,在目标渲染进程所对应的第一命名空间中创建第一线程;其中,所述目标渲染进程为第一操作系统进程;所述第一命名空间是在目标渲染进程的进程地址空间中创建的且能够运行第二操作系统图形驱动线程的命名空间;在所述第一命名空间中,由所述第一线程调用第二操作系统图形驱动的第二线程,以实现图形渲染任务;其中,在所述第一命名空间中,所述第一线程中的第一对象存储在指定寄存器中的第一地址与所述第二线程中的第二对象存储在所述指定寄存器中的第二地址不同。6.根据本发明提供的一种跨进程调用的图形渲染方法,在所述根据所接收到的图形渲染任务请求,在目标渲染进程所对应的第一命名空间中创建第一线程之前,方法还包括:在所述目标渲染进程的进程地址空间中申请第一命名空间;在所述第一命名空间中加载第二操作系统图形驱动的elf文件;根据所述第二操作系统图形驱动的elf文件中的elf头信息,在所述第一命名空间中构建第二操作系统图形驱动的依赖列表;其中,所述第二操作系统图形驱动的依赖列表描述了第二操作系统图形驱动在第二操作系统中所依赖的动态库列表;在所述第一命名空间中,对第二操作系统图形驱动在第二操作系统中所依赖的各个动态库进行初始化。7.根据本发明提供的一种跨进程调用的图形渲染方法,所述根据所述第二操作系统图形驱动的elf文件中的elf头信息,在所述第一命名空间中构建第二操作系统图形驱动的依赖列表,包括:根据所述第二操作系统图形驱动的elf头信息,将所述第二操作系统图形驱动中的符号表加载到所述第一命名空间中,并对所述符号表中的符号进行地址重定向;根据所述第二操作系统图形驱动的elf头信息,将所述第二操作系统图形驱动在第二操作系统中所依赖的动态库列表加载到所述第一命名空间中,得到第二操作系统图形驱动的依赖列表。8.根据本发明提供的一种跨进程调用的图形渲染方法,所述第一对象为tcbhead_t结构体,所述第二对象为tls数组;相应的,所述在所述第一命名空间中,对第二操作系统图形驱动在第二操作系统中所依赖的各个动态库进行初始化,包括:在所述第一命名空间中,对与第二操作系统图形驱动相关的系统全局变量的构造初始化进行拦截;在所述第一命名空间中,对与第二操作系统图形驱动线程相关的资源变量的初始化进行拦截;将第二操作系统图形驱动的属性列表进行初始化,并将初始化后的所述属性列表映射到所述第一命名空间中;在所述第一命名空间中,为所述第一线程中的tcbhead_t结构体存储在指定寄存器中的第一地址或所述第二线程中的tls数组存储在指定寄存器中的第二地址进行设置,以使得所述第一地址与所述第二地址不同。9.根据本发明提供的一种跨进程调用的图形渲染方法,所述为所述第一线程中的tcbhead_t结构体存储在指定寄存器中的第一地址或所述第二线程中的tls数组存储在指定寄存器中的第二地址进行设置,包括:对所述第二线程中的tls数组所对应的索引在指定寄存器中的地址进行后移,得到所述第二地址。10.根据本发明提供的一种跨进程调用的图形渲染方法,所述为所述第一线程中的tcbhead_t结构体存储在指定寄存器中的第一地址或所述第二线程中的tls数组存储在指定寄存器中的第二地址进行设置,包括:将所述第一线程中的tcbhead_t结构体之前部分在指定寄存器中的地址予以保留,得到所述第一地址。11.根据本发明提供的一种跨进程调用的图形渲染方法,所述对所述符号表中的符号进行地址重定向,包括:对于第二操作系统图形驱动中的所有引用符号,通过查询elf文件中的程序链接表和全局偏移表确定符号地址,并将第二操作系统调用符号地址修改为第一操作系统调用符号地址。12.根据本发明提供的一种跨进程调用的图形渲染方法,所述第一操作系统与第二操作系统共享linux操作系统内核linuxkernel;其中,所述第一线程基于libc、glibc、uclibc、klibc、eglibc、musl‑libc、newlib、dietlibc中的至少一种c函数库,所述第二线程基于bionic、musl‑libc、libcrystax中的至少一种c函数库。13.本发明还提供了一种跨进程调用的图形渲染装置,应用于电子设备,电子设备包括:第一操作系统和与第一操作系统共享内核并部署在第一操作系统中的第二操作系统,所述第一操作系统包括第一线程,第二操作系统包括第二线程,所述装置包括:第一线程创建模块,用于根据所接收到的图形渲染任务请求,在目标渲染进程所对应的第一命名空间中创建第一线程;其中,所述目标渲染进程为第一操作系统进程;所述第一命名空间是在目标渲染进程的进程地址空间中创建的且能够运行第二操作系统图形驱动线程的命名空间;图形渲染任务执行模块,用于在所述第一命名空间中,由所述第一线程调用第二操作系统图形驱动的第二线程,以实现图形渲染任务;其中,在所述第一命名空间中,所述第一线程中的第一对象存储在指定寄存器中的第一地址与所述第二线程中的第二对象存储在所述指定寄存器中的第二地址不同。14.本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述跨进程调用的图形渲染方法的步骤。15.本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述跨进程调用的图形渲染方法的步骤。16.本发明提供的跨进程调用的图形渲染方法、装置、电子设备与存储介质,通过在目标渲染进程所对应的第一命名空间中创建第一线程,由第一线程在第一命名空间中调用第二操作系统图形驱动的第二线程,实现图形渲染任务,本发明提供的跨进程调用的图形渲染方法能够在第一命名空间中同时稳定运行第一操作系统中的动态系统库与第二操作系统中的图形驱动库,避免了第一线程与第二线程之间寄存器冲突的问题,具有实时性好、性能损失小的优点,适合在高频率调用场景中使用。附图说明17.为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。18.图1是linux中的动态系统库的线程与android图形驱动线程存在空间冲突的示意图;图2是本发明提供的跨进程调用的图形渲染方法的流程图;图3是本发明提供的跨进程调用的图形渲染方法中所涉及的第一命名空间的示意图;图4是本发明提供的跨进程调用的图形渲染装置的结构示意图;图5是本发明提供的电子设备的结构示意图。具体实施方式19.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。20.为了实现linux等操作系统在渲染过程中调用安卓操作系统的图形驱动,在图形渲染过程中需要同时加载linux操作系统中的动态系统库以及android图形驱动库。21.本技术发明人在实现上述需求时发现,linux操作系统中的动态系统库与android图形驱动库在内存布局上存在差异,很难在同一进程地址空间内部稳定运行。图1为linux中的动态系统库的线程与android图形驱动线程存在空间冲突的示意图。以图1为例,glibc是gnu发布的c语言运行库,是linux系统中最底层的api。glibc线程是linux系统的ui进程中的线程。bionic线程是android图形驱动的线程。22.无论是glibc线程,还是bionic线程,每一个线程都存有独享的tls(threadlocalstorage,线程本地存储),线程的tls数据保存了该线程独有的变量、名称等信息。根据相关规则,glibc线程与bionic线程均会通过gs寄存器保存tls数据,其中gs寄存器的低位表示系统特权级,高位表示全局描述符表,指向glibc和bionic的局部描述符表。23.当linux操作系统中的动态系统库与android图形驱动库运行在同一进程地址空间中时,glibc线程与bionic线程所使用的gs寄存器是同一个寄存器,这将会造成冲突。24.例如,参考图1,glibc线程会在gs寄存器中保存static_tls结构体、tcbhead_t结构体、struct_pthread结构体等信息。bionic线程会在gs寄存器中保存tls数组,tls数组中包括tls_slot_opengl、tls_slot_opengl_api、tls_slot_errno、tls_slot_thread_id和tls_slot_self等字段。在进行线程上下文切换过程中,由于所涉及的gs寄存器是同一个寄存器,因此会发生冲突,如bionic线程中的tls数组会覆盖glibc线程中的tcbhead_t结构体。25.为解决上述问题,发明人尝试将linux操作系统的动态系统库与android图形驱动库设置在不同的进程地址空间中,然后通过跨进程调用的方式来访问android图形驱动。但这一实现方式具有实时性较差、性能损失严重的问题,不适合在高频率调用场景中使用。26.如上所述,申请人以linux操作系统调用android操作系统的图形驱动为例说明了本发明实施例要解决的技术问题。本领域技术人员能够理解,类似的应用场景,只要是以共享操作系统内核实现的容器化的操作系统实现的跨系统的图形驱动调用都适用于本发明实施例的方法。27.例如,作为宿主的第一操作系统和部署在第一操作系统中的第二操作系统是共享linux内核,通过lxc、容器化等技术实现。28.例如,第一操作系统可以是各种桌面linux发行版,如ubuntu、debian、redhat等。需要说明的是,第一操作系统并不限定是运行在物理机上的,也可以是托管在其它操作系统上的操作系统,例如windows系统中的wsl。29.尽管没有明确描述,第一操作系统也可以是各种嵌入式的基于linux内核的操作系统,如openwrt等。30.例如,第二操作系统可以是android安卓操作系统,涵盖google发行的androidos以及aosp和基于aosp的各种衍生系统,如miui、emui、oneui等。如本领域技术人员所知,还存在多种其它的基于linuxkernel的移动操作系统,如tizen、鸿蒙等,同样适用于本发明实施例的技术方案。31.对于不同的操作系统,所采用的c函数库有差异,其中第一操作系统可以包括libc、glibc、uclibc、klibc、eglibc、musl‑libc、newlib、dietlibc中的至少一种c函数库,第二操作系统可以包括bionic、musl‑libc、libcrystax中的至少一种c函数库。相应的,与图形渲染相关的进程、线程等可以基于上述c函数库实现。32.例如,对于常见的linuxos发行版,通常使用glibc。对于常见的嵌入式linux,通常使用uclibc、eglibc、musl‑libc等。具体集成哪种c函数库,取决于系统开发过程中的选择和需求。33.例如,对于大部分androidos,通常使用bionic。对于鸿蒙os,通常使用musl‑libc。34.本发明提供的跨进程调用的图形渲染方法实现了在同一进程地址空间内同时运行第一操作系统的动态系统库与第二操作系统的图形驱动库,且两者之间不产生冲突,使得第一操作系统可以通过使用第二操作系统的图形驱动实现高性能的图形渲染,尤其适用于linuxos使用androidos的图形驱动。35.下面结合图2‑图5描述本发明的跨进程调用的图形渲染方法、装置、电子设备与存储介质。36.图2为本发明提供的跨进程调用的图形渲染方法的流程图,如图2所示,本发明提供的跨进程调用的图形渲染方法包括:步骤201、根据所接收到的图形渲染任务请求,在目标渲染进程所对应的第一命名空间中创建第一线程。37.在本实施例中,目标渲染进程是第一操作系统中负责图形渲染的进程。38.根据本发明的方法,目标渲染进程在创建时不仅会为其分配对应的进程地址空间,还会在所述进程地址空间内创建第一命名空间;其中,所述第一命名空间是能够运行第二操作系统图形驱动线程的命名空间。39.以第一操作系统为linuxos、第二操作系统为androidos为例,根据本发明实施例的方法,linux操作系统中的动态系统库与android图形驱动库能够在目标渲染进程的同一进程地址空间(第一命名空间)内部稳定运行。40.在本实施例中,第一命名空间是预先已经创建的,在本发明的其他实施例中,将会对第一命名空间的创建过程进行说明。41.在图形渲染过程中,涉及到多种类型的图形渲染任务,如linux系统中的ui客户端进程通过egl标准框架维护应用窗口的创建和/或刷新,在为纹理信息分配显存时通过gralloc驱动申请和/或释放资源,通过gles标准接口对图像帧中的纹理和/或画布进行渲染。这些图形渲染任务具有调用频率高,且api/abi接口稳定性较强的特点,因此当接收到上述类型的图形渲染任务所对应的请求时,可采用本发明提供的跨进程调用的图形渲染方法执行图形渲染任务。42.第一线程是目标渲染进程中的线程,如何在目标渲染进程所对应的第一命名空间中创建第一线程是本领域技术人员的公知常识,因此不在此处重复说明。43.步骤202、在所述第一命名空间中,由所述第一线程调用第二操作系统图形驱动的第二线程,以实现图形渲染任务。44.以第一操作系统为linuxos、第二操作系统为androidos为例,申请人发现,当linux操作系统中的动态系统库与android图形驱动库运行在同一进程地址空间中时,glibc线程与bionic线程所使用的gs寄存器是同一个寄存器,这将会造成冲突。45.而在本实施例中,在所述第一命名空间中,所述glibc线程中的第一对象(如tcbhead_t结构体)存储在指定寄存器中的第一地址与所述bionic线程中的第二对象(如tls数组)存储在所述指定寄存器中的第二地址不同。因此,能够有效避免线程之间寄存器冲突的问题。46.具体的说,要使得第一地址与第二地址不同,以第一对象为tcbhead_t结构体、第二对象为tls数组为例,可以采用以下两种实现方式中的任意一种。47.一种实现方式是将所述glibc线程中的tcbhead_t结构体之前部分在指定寄存器中的地址予以保留,得到所述第一地址。48.例如,将glibc线程下的tcbhead_t结构体中的前部位置内存进行预留,避开与bionic线程中的tls数组发生冲突的区域。49.另一种实现方式是对所述bionic线程中的tls数组所对应的索引在指定寄存器中的地址进行后移,得到所述第二地址。50.例如,将bionic线程下tls数组中极易与glibc线程中的tcbhead_t结构体造成冲突的索引位置后移使用,对bionic线程中前9位特定对象slot数组位置进行预留,使用后130位通用空闲数组存储tls数据,通过setspecific和getspecific通用设置接口存储应用通用tls数据和errno,opengl_api等特定tls数据。51.本发明提供的跨进程调用的图形渲染方法通过在目标渲染进程所对应的第一命名空间中创建第一线程,由第一线程在第一命名空间中调用第二操作系统图形驱动的第二线程,实现图形渲染任务,本发明提供的跨进程调用的图形渲染方法能够在第一命名空间中同时稳定运行第一操作系统中的动态系统库与第二操作系统的图形驱动库,避免了线程之间寄存器冲突的问题,具有实时性好、性能损失小的优点,适合在高频率调用场景中使用。52.基于上述任一实施例,在本实施例中,在所述根据所接收到的图形渲染任务请求,在目标渲染进程所对应的第一命名空间中创建第一线程之前,方法还包括:在所述目标渲染进程的进程地址空间中申请第一命名空间;在所述第一命名空间中加载第二操作系统图形驱动的elf文件;根据所述第二操作系统图形驱动的elf文件中的elf头信息,在所述第一命名空间中构建第二操作系统图形驱动的依赖列表;其中,所述第二操作系统图形驱动的依赖列表描述了第二操作系统图形驱动在第二操作系统中所依赖的动态库列表;在所述第一命名空间中,对第二操作系统图形驱动在第二操作系统中所依赖的各个动态库进行初始化。53.图3为第一命名空间的示意图。在本实施例中,将结合图3对第一命名空间的创建过程进行说明。54.目标渲染进程在创建过程中,会为其分配对应的进程地址空间。基于已分配的进程地址空间,可为目标渲染进程申请第一命名空间。显然,第一命名空间是目标渲染进程的进程地址空间的一部分。55.例如,目标渲染进程的进程地址空间大小为4g,可从中选取1g大小的进程地址空间作为第一命名空间。56.在申请第一命名空间之后,第一命名空间从特定搜索空间开始加载第二操作系统图形驱动的elf头信息以及指定字段的信息。其中,特定搜索空间是指第一操作系统动态库搜索路径以外,第二操作系统图形驱动动态库以及其所依赖的动态库所在的搜索路径。57.以第一操作系统为linuxos、第二操作系统为androidos为例,在加载时,首先读取androidos图形驱动中的elf(executableandlinkableformat,可执行与可链接格式)文件的elf头信息;然后从图形驱动的elf头信息中找到程序头表(program_header_table)的起始地址,从该起始地址开始找出并读取标记为pt_load类型的各字段信息。所述各字段信息包括:各字段的虚拟地址信息p_vaddr、各字段的段内存大小p_memsz,各字段的段标记p_flags。最后通过内存映射mmap的方式依次将图形驱动的elf文件的各个部分映射进第一命名空间,并记录前述程序头表在内存中的地址。58.本实施例所描述的androidos图形驱动可以是诸如egl、gles、gralloc的驱动库。59.在为第一命名空间加载第二操作系统图形驱动的elf文件之后,根据第二操作系统图形驱动的elf文件中的elf头信息,在第一命名空间中构建第二操作系统图形驱动的依赖列表。其中,第二操作系统图形驱动的依赖列表描述了第二操作系统图形驱动在第二操作系统中下所依赖的动态库列表。60.以安卓为例,由于安卓图形驱动由bionic线程处理,因此依赖列表也被称为bionic图形驱动依赖列表,在本实施例中,也可将其记为soinfolist。61.在第一命名空间中构建第二操作系统图形驱动的依赖列表之后,可对第二操作系统图形驱动在第二操作系统中所依赖的各个动态库进行初始化。初始化的目的是要保证第一线程与第二线程不会因为系统性全局变量、资源、寄存器等因素而发生冲突,实现第一线程与第二线程在同一进程地址空间中的同时运行。62.第一命名空间在实现了上述的加载第二操作系统图形驱动的elf文件、构建第二操作系统图形驱动的依赖列表、对第二操作系统图形驱动在第二操作系统中下所依赖的各个动态库进行初始化等多个操作后,能够运行第二操作系统图形驱动的第二线程,且同时在第一命名空间中运行的第一线程与第二线程不会发生冲突。63.本发明提供的跨进程调用的图形渲染方法从目标渲染进程创建时所分配的进程地址空间中申请第一命名空间,然后在第一命名空间中依次实现加载第二操作系统图形驱动的elf文件、构建第二操作系统图形驱动的依赖列表、对第二操作系统图形驱动在第二操作系统中所依赖的各个动态库进行初始化等操作,得到能够运行第二操作系统图形驱动的第二线程、且同时运行第一线程与第二线程不会发生冲突的第一命名空间。本发明避免了第一线程与第二线程之间冲突的问题,具有实时性好、性能损失小的优点,适合在高频率调用场景中使用。64.基于上述任一实施例,在本实施例中,根据所述第二操作系统图形驱动的elf文件中的elf头信息,在所述第一命名空间中构建第二操作系统图形驱动的依赖列表,包括:根据所述第二操作系统图形驱动的elf头信息,将所述第二操作系统图形驱动中的符号表加载到所述第一命名空间中,并对所述符号表中的符号进行地址重定向;根据所述第二操作系统图形驱动的elf头信息,将所述第二操作系统图形驱动在第二操作系统中所依赖的动态库列表加载到所述第一命名空间中,得到第二操作系统图形驱动的依赖列表。65.以第一操作系统为linuxos、第二操作系统为androidos为例,在构建安卓图形驱动依赖列表的过程中,首先可查找安卓图形驱动elf头信息中的dt_dynamic字段,从该字段中获取指向动态库数组的首地址。动态库数组包含了依赖动态库列表信息,动态符号表信息等。动态库数组中的数组成员由具有不同类型tag(标签)标记的信息组成,其中的tag标记用于区分不同类型的数组成员信息。具体的说,类型为dt_needed的数组成员包含安卓图形驱动的依赖动态库列表信息,类型为dt_symtab的数组成员包含动态符号表信息。在本步骤中,根据dt_dynamic字段获取指向动态库数组的首地址后,可对动态库数组中的各个数组成员做进一步的查找。66.接着,检测数组成员信息中tag标记,根据dt_symtab标记将图形驱动库符号表位置加载进入第一命名空间,并根据成员在驱动列表中不同位置对符号表执行地址重定向,保证各个符号表调用地址根据驱动成员库在第一命名空间的位置不同而动态变化。即:对于安卓图形驱动中的所有引用符号,通过查询elf文件中的程序链接表和全局偏移表确定符号地址,并将安卓系统调用符号地址修改为linux调用符号地址。67.符号地址重定向是指将安卓图形驱动中的引用符号进行重新调整,使得调整后的引用符号指向真实符号调用地址。在重定向期间,依次遍历动态符号表中的所有引用符号,并通过查找该符号在elf中plt表(procedurelinkagetable,过程链接表)中的对应位置,找到该符号在got表(globaloffsettable,全局偏移表)中的真实偏移地址位置。这个偏移地址是个相对位置地址,通过加上安卓图形驱动在开始阶段映射进第一命名空间的起始地址,最终得到引用符号的真实地址。68.在符号表地址重定向期间,会对安卓图形驱动列表中的基础库符号表进行监控,通过对安卓图形驱动引用bionic系统调用符号在重定向阶段的监控替换,使得安卓图形驱动在访问基础系统调用符号时进入到glibc系统调用的地址空间。69.最后,根据第二操作系统图形驱动的elf头信息,将所述第二操作系统图形驱动在第二操作系统中所依赖的动态库列表加载到所述第一命名空间中。70.以第一操作系统为linuxos、第二操作系统为androidos为例,动态库数组中字段类型为dt_needed的数组成员包含安卓图形驱动的依赖动态库列表信息,在本实施例中,将这些字段类型为dt_needed的数组成员称为驱动列表成员。71.在将安卓图形驱动在安卓环境下所依赖的动态库列表加载到所述第一命名空间中时,会依次查找前述驱动列表成员中的dt_init_array字段中定义的调用地址,并进行调用,从而实现动态库列表的加载。72.本发明提供的跨进程调用的图形渲染方法通过加载第二操作系统图形驱动中的符号表、对符号表中的符号进行地址重定向、加载第二操作系统图形驱动在第二操作系统中所依赖的动态库列表,实现了第二操作系统图形驱动的依赖列表的构建。本发明避免了第一线程与第二线程之间冲突的问题,具有实时性好、性能损失小的优点,适合在高频率调用场景中使用。73.基于上述任一实施例,在本实施例中,所述第一对象为tcbhead_t结构体,所述第二对象为tls数组;相应的,所述在所述第一命名空间中,对第二操作系统图形驱动在第二操作系统中所依赖的各个动态库进行初始化,包括:在所述第一命名空间中,对与第二操作系统图形驱动相关的系统全局变量的构造初始化进行拦截;在所述第一命名空间中,对与第二操作系统图形驱动线程相关的资源变量的初始化进行拦截;将第二操作系统图形驱动的属性列表进行初始化,并将初始化后的所述属性列表映射到所述第一命名空间中;在所述第一命名空间中,为所述第一线程中的tcbhead_t结构体存储在指定寄存器中的第一地址或所述第二线程中的tls数组存储在指定寄存器中的第二地址进行设置,以使得所述第一地址与所述第二地址不同。74.在本实施例中,对动态库的初始化过程做进一步说明。75.为了确保在第一命名空间中,只拥有第一线程在构建初始化时所创建的系统级全局变量,在动态库的初始化过程中需要对与第二操作系统图形驱动相关的系统全局变量的构造初始化进行拦截。76.以第一操作系统为linuxos、第二操作系统为androidos为例,为了确保linux操作系统中的进程通过第一命名空间创建的线程为标准linux下的glibc线程,在动态库的初始化过程中,需要对与安卓图形驱动线程(bionic线程)相关的资源变量的初始化进行拦截。77.第二操作系统图形驱动具有对应的属性列表(例如,bionic属性列表),在动态库的初始化过程中,将第二操作系统图形驱动的属性列表进行初始化,并将初始化后的所述属性列表映射到所述第一命名空间中。具体的说,可在不同进程的命名空间之间建立socket通道,然后将对应的属性列表(例如,bionic属性列表)的数据结构和键值对数据通过该socket通道以mmap映射的方式映射到所述第一命名空间中,使得不同进程的第一命名空间能够及时共享第二操作系统图形驱动的属性列表数据。78.最后,在所述第一命名空间中,为所述第一线程中的tcbhead_t结构体存储在指定寄存器中的第一地址或所述第二线程中的tls数组存储在指定寄存器中的第二地址进行设置,以使得所述第一地址与所述第二地址不同。79.以第一操作系统为linuxos、第二操作系统为androidos为例,如图1所示,glibc线程会在gs寄存器中保存static_tls结构体、tcbhead_t结构体、struct_pthread结构体等信息。bionic线程会在gs寄存器中保存tls数组,tls数组中包括tls_slot_opengl、tls_slot_opengl_api、tls_slot_errno、tls_slot_thread_id和tls_slot_self等字段。在进行线程上下文切换过程中,由于所涉及的gs寄存器是同一个寄存器,因此在现有技术中,glibc线程与bionic线程会发生冲突,如bionic线程中的tls数组会覆盖glibc线程中的tcbhead_t结构体。80.在本实施例中,可通过设置第一地址或设置第二地址的方式,来实现避免第一线程与第二线程在进行线程上下文切换时容易发生的寄存器冲突。81.在设置第一地址时,将所述第一线程中的tcbhead_t结构体之前部分在指定寄存器中的地址予以保留,得到所述第一地址。82.例如,将glibc线程下的tcbhead_t结构体中的前部位置内存进行预留,避开与bionic线程中的tls数组发生冲突的区域。83.在设置第二地址时,对所述第二线程中的tls数组所对应的索引在指定寄存器中的地址进行后移,得到所述第二地址。84.例如,将bionic线程下tls数组中极易与glibc线程中的tcbhead_t结构体造成冲突的索引位置后移使用,对bionic线程中前9位特定对象slot数组位置进行预留,使用后130位通用空闲数组存储tls数据,通过setspecific和getspecific通用设置接口存储应用通用tls数据和errno,opengl_api等特定tls数据。85.不同的动态库在被加载进入进程地址空间时的初始化工作不同。本发明的方法在将bionic图形驱动加载进入第一命名空间所对应的进程地址空间后,在初始化阶段不会对bionic基础系统库中bionic线程等基础环境进行初始化,避免与glibc线程的冲突。而是通过构建bionic的属性列表初始化机制,实现glibc和bionic的特性融合。86.以第一操作系统为linuxos、第二操作系统为androidos为例,在动态库初始化期间,第一命名空间依然会对驱动列表成员中基础库进行监控,优先完成linux系统下glibc初始化动作的基础上,对bionic的属性系统完成初始化,即在第一命名空间所对应的进程地址空间内构建bionic图形驱动所需的属性列表机制,以实现在第一命名空间下的bionic线程和glibc线程在内存空间的融合。87.本发明提供的跨进程调用的图形渲染方法通过对第二操作系统图形驱动在第二操作系统中下所依赖的各个动态库进行初始化,保证了第一线程与第二线程不会因为系统级全局变量、资源以及寄存器发生冲突。88.下面对本发明提供的跨进程调用的图形渲染装置进行描述,下文描述的图形渲染装置与上文描述的跨进程调用的图形渲染方法可相互对应参照。89.图4是本发明提供的跨进程调用的图形渲染装置的示意图,如图4所示,本发明提供的跨进程调用的图形渲染装置应用于电子设备,电子设备包括:第一操作系统和与第一操作系统共享内核并部署在第一操作系统中的第二操作系统,所述第一操作系统包括第一线程,第二操作系统包括第二线程,装置包括:第一线程创建模块401,用于根据所接收到的图形渲染任务请求,在目标渲染进程所对应的第一命名空间中创建第一线程;其中,所述目标渲染进程为第一操作系统进程;所述第一命名空间是在目标渲染进程的进程地址空间中创建的且能够运行第二操作系统图形驱动线程的命名空间;图形渲染任务执行模块402,用于在所述第一命名空间中,由所述第一线程调用第二操作系统图形驱动的第二线程,以实现图形渲染任务;其中,在所述第一命名空间中,所述第一线程中的第一对象存储在指定寄存器中的第一地址与所述第二线程中的第二对象存储在所述指定寄存器中的第二地址不同。90.本发明提供的跨进程调用的图形渲染装置通过在目标渲染进程所对应的第一命名空间中创建第一线程,由第一线程在第一命名空间中调用第二操作系统图形驱动的第二线程,实现图形渲染任务,本发明提供的跨进程调用的图形渲染装置能够在第一命名空间中同时稳定运行第一操作系统中的动态系统库与第二操作系统图形驱动库,避免了第一线程与第二线程之间寄存器冲突的问题,具有实时性好、性能损失小的优点,适合在高频率调用场景中使用。91.基于上述任一实施例,在本实施例中,装置还包括:空间申请模块,用于在所述目标渲染进程的进程地址空间中申请第一命名空间;图形驱动信息加载模块,用于在所述第一命名空间中加载第二操作系统图形驱动的elf文件;依赖列表构建模块,用于根据所述第二操作系统图形驱动的elf文件中的elf头信息,在所述第一命名空间中构建第二操作系统图形驱动的依赖列表;其中,所述第二操作系统图形驱动的依赖列表描述了第二操作系统图形驱动在第二操作系统中所依赖的动态库列表;初始化模块,用于在所述第一命名空间中,对第二操作系统图形驱动在第二操作系统中所依赖的各个动态库进行初始化。92.本发明提供的跨进程调用的图形渲染装置从目标渲染进程创建时所分配的进程地址空间中申请第一命名空间,然后在第一命名空间中依次实现加载第二操作系统图形驱动的elf文件、构建第二操作系统图形驱动的依赖列表、对第二操作系统图形驱动在第二操作系统中所依赖的各个动态库进行初始化等操作,得到能够运行第二操作系统图形驱动的第二线程、且同时运行第一线程与第二线程不会发生冲突的第一命名空间。本发明避免了第一线程与第二线程之间冲突的问题,具有实时性好、性能损失小的优点,适合在高频率调用场景中使用。93.基于上述任一实施例,在本实施例中,所述依赖列表构建模块包括:地址重定向单元,用于根据所述第二操作系统图形驱动的elf头信息,将所述第二操作系统图形驱动中的符号表加载到所述第一命名空间中,并对所述符号表中的符号进行地址重定向;动态库列表加载单元,用于根据所述第二操作系统图形驱动的elf头信息,将所述第二操作系统图形驱动在第二操作系统中所依赖的动态库列表加载到所述第一命名空间中,得到第二操作系统图形驱动的依赖列表。94.本发明提供的跨进程调用的图形渲染装置通过加载第二操作系统图形驱动中的符号表、对符号表中的符号进行地址重定向、加载第二操作系统图形驱动在第二操作系统中所依赖的动态库列表,实现了第二操作系统图形驱动的依赖列表的构建。本发明避免了第一线程与第二线程之间冲突的问题,具有实时性好、性能损失小的优点,适合在高频率调用场景中使用。95.基于上述任一实施例,在本实施例中,所述第一对象为tcbhead_t结构体,所述第二对象为tls数组;相应的,所述初始化模块,包括:全局变量构造初始化拦截单元,用于在所述第一命名空间中,对与第二操作系统图形驱动相关的系统全局变量的构造初始化进行拦截;资源变量初始化拦截单元,用于在所述第一命名空间中,对与第二操作系统图形驱动线程相关的资源变量的初始化进行拦截;属性列表映射单元,用于将第二操作系统图形驱动的属性列表进行初始化,并将初始化后的所述属性列表映射到所述第一命名空间中;地址设置单元,用于在所述第一命名空间中,为所述第一线程中的tcbhead_t结构体存储在指定寄存器中的第一地址或所述第二线程中的tls数组存储在指定寄存器中的第二地址进行设置,以使得所述第一地址与所述第二地址不同。96.本发明提供的跨进程调用的图形渲染装置通过对第二操作系统图形驱动在第二操作系统中所依赖的各个动态库进行初始化,保证了第一线程与第二线程不会因为系统级全局变量、资源以及寄存器发生冲突。97.图5示例了一种电子设备的实体结构示意图,如图5所示,该电子设备可以包括:处理器(processor)510、通信接口(communicationsinterface)520、存储器(memory)530和通信总线540,其中,处理器510,通信接口520,存储器530通过通信总线540完成相互间的通信。处理器510可以调用存储器530中的逻辑指令,以执行跨进程调用的图形渲染方法,应用于电子设备,电子设备包括:第一操作系统和与第一操作系统共享内核并部署在第一操作系统中的第二操作系统,所述第一操作系统包括第一线程,第二操作系统包括第二线程,该方法包括:根据所接收到的图形渲染任务请求,在目标渲染进程所对应的第一命名空间中创建第一线程;其中,所述目标渲染进程为第一操作系统进程;所述第一命名空间是在目标渲染进程的进程地址空间中创建的且能够运行第二操作系统图形驱动线程的命名空间;在所述第一命名空间中,由所述第一线程调用第二操作系统图形驱动的第二线程,以实现图形渲染任务;其中,在所述第一命名空间中,所述第一线程中的第一对象存储在指定寄存器中的第一地址与所述第二线程中的第二对象存储在所述指定寄存器中的第二地址不同。98.此外,上述的存储器530中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read‑onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。99.另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的跨进程调用的图形渲染方法,应用于电子设备,电子设备包括:第一操作系统和与第一操作系统共享内核并部署在第一操作系统中的第二操作系统,所述第一操作系统包括第一线程,第二操作系统包括第二线程,该方法包括:根据所接收到的图形渲染任务请求,在目标渲染进程所对应的第一命名空间中创建第一线程;其中,所述目标渲染进程为第一操作系统进程;所述第一命名空间是在目标渲染进程的进程地址空间中创建的且能够运行第二操作系统图形驱动线程的命名空间;在所述第一命名空间中,由所述第一线程调用第二操作系统图形驱动的第二线程,以实现图形渲染任务;其中,在所述第一命名空间中,所述第一线程中的第一对象存储在指定寄存器中的第一地址与所述第二线程中的第二对象存储在所述指定寄存器中的第二地址不同。100.又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的跨进程调用的图形渲染方法,应用于电子设备,电子设备包括:第一操作系统和与第一操作系统共享内核并部署在第一操作系统中的第二操作系统,所述第一操作系统包括第一线程,第二操作系统包括第二线程,该方法包括:根据所接收到的图形渲染任务请求,在目标渲染进程所对应的第一命名空间中创建第一线程;其中,所述目标渲染进程为第一操作系统进程;所述第一命名空间是在目标渲染进程的进程地址空间中创建的且能够运行第二操作系统图形驱动线程的命名空间;在所述第一命名空间中,由所述第一线程调用第二操作系统图形驱动的第二线程,以实现图形渲染任务;其中,在所述第一命名空间中,所述第一线程中的第一对象存储在指定寄存器中的第一地址与所述第二线程中的第二对象存储在所述指定寄存器中的第二地址不同。101.以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。102.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。103.最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜