一种基于飞腾平台与共享内核的Linux与Android并存和交互
方法
技术领域
本发明属于操作系统技术领域,具体地说,涉及一种基于飞腾平台与共享内核的Linux与Android并存和交互方法。
背景技术
Android是目前移动终端市场中市场份额最高的Linux类操作系统,在移动终端领域具有极好的生态环境;然而Android的前身Linux操作系统目前在桌面领域受到来自Windows等操作系统的冲击,所占的市场份额并不高;同时,Linux桌面操作系统由于开发人员数目和市场份额的限制发展较为缓慢。随着信息技术的飞速发展,国家对信息安全的重视程度日益提升,Windows系统作为美国闭源操作系统,存在着巨大的安全隐患,为人诟病。与此同时,国产操作系统生态环境长期处于不良状态,一直不见起色。
要解决国产操作系统的生态问题,必须解决用户数不足和平台应用软件数不足这两个关键点。Android在移动终端领域具有广泛的用户群,并且具有成熟的开发平台和应用软件群体,对于解决国产操作系统目前的窘境具有一定的参考价值。
飞腾硬件平台是搭载国产兼容ARM64架构的飞腾处理器的可运行国产操作系统的硬件平台。为实现国产信息产品的完全自主可控,国产操作系统的生态环境有必要考虑与飞腾硬件平台的紧密结合。
近年来,国内外有许多研究人员尝试将Android运行环境迁移到Windows或Linux类计算机平台以达到“兼容”的效果,现有的跨平台运行方法主要是虚拟化技术和容器技术。虚拟化技术虽然稳定性、普适性较强,但是在软件层对硬件进行模拟造成了巨大的资源浪费,并且有部分硬件,比如显卡,因为驱动和设计方案未公开,所以几乎没有第三方自主进行虚拟化的途径;容器技术虽然能够一定程度上弥补效率的不足,但是由于其封闭的特性使得两个运行环境间的交互较为不便,同时,容器难以具有一个操作系统的全部特性,经常作为模拟器或者与虚拟化技术共同使用。技术和硬件层面上的困难,使得Android“兼容”的进展比较缓慢。
中国发明专利“基于Linux容器的设备虚拟化系统及方法”(申请号CN105808320A),该申请是一种容器技术,并且明确说明对设备进行了虚拟化,通过主操作系统的客户端进行对一个或多个Android系统的兼容运行。和本申请的区别:本申请并没有基于容器技术或虚拟化技术,而是直接基于本申请所提出的共享内核技术实现Linux与Android操作系统的并行;由于未经过虚拟化,Linux和Android系统的运行效率不会在软件层面受到影响,效率极高。。
中国发明专利“Android模拟器及实现Android模拟器的方法”(申请号CN106445630A),该申请是Windows平台上对Android进行兼容运行的技术,技术要点在于Linux中间件在Windows系统上的适配。和本申请的区别:本申请是基于构建源于Linux的共享内核进而实现Linux与Android系统并存的技术,Linux内核与Windows内核完全不同,并且因为Windows属于闭源操作系统,其它开发者无法进行扩展,所以上述申请与本申请无关。
中国发明专利“Android虚拟机加载方法及装置”(申请号CN104216726A),该申请属于Android系统虚拟机加载的改进方法,侧重点在创建虚拟机的效率和维护上。和本申请的区别:Android虚拟机加载方法及装置并没有体现Linux系统与Android系统共享内核并行的特征,本申请侧重点也并非在如何高效的建立Android(Java)虚拟机实例;该申请针对的方向是Android系统的改进,本申请针对的方向是Linux系统和Android系统的并行实现。
中国发明专利“一种同时运行Android/Linux操作系统的方法”(申请号CN201410483020.9),该申请是在同一设备和内核上实现Linux与Android可切换运行的方法,在共享内核这一思路上是类似的。与本发明的区别:首先,本申请不需要在两个系统间进行切换,也不存在因为切换带来的后台运行,其次,具体来说本申请的并行也不需要共享boot loader,两个系统的文件系统是一致的。
中国发明专利“一种利用Linux应用在Android系统中运行的方法及装置”(申请号CN201010139435.6),该申请使得Android系统能够运行Linux应用,从一定程度上解决了Linux与Android兼容的问题,同时也提到了双系统显示相关的问题,并且给出了一种方案。与本申请的区别:该申请是一种Android上的Linux应用模拟器,并不需要在Android上运行整个Linux系统;本申请实现Linux与Android应用共存的方法与模拟技术有差别,首先在于两个系统真正原生运行在共享内核上,并且共享文件系统等资源;其次,本申请关于显示冲突问题的解决与该申请有差别,并非同一种方法,本申请有许多类似问题需要依赖本申请提出的创新性理论进行解决。
中国发明专利“一种在Android操作系统上运行Linux应用程序的方法及系统”(申请号CN201510683347.5),该发明公开了一种在Android操作系统上运行Linux应用程序的方法。虽然该发明还提供了一种在Android操作系统上运行Linux应用程序的系统,实现了在安装Andoird操作系统的智能设备上,直接运行Linux应用程序,但是该发明仍是基于容器技术实现Linux系统与Android系统的共存,并没有涉及到本发明中基于扩展内核与基础库的Linux系统与Android系统高效并存方案。
发明内容
有鉴于此,本发明为了解决现有技术存在的缺陷和不足,提供了一种基于飞腾平台与共享内核的Linux与Android并存和交互方法,能够在一台计算机上同时运行Linux和Android系统,自底向上的解决了Linux系统与Android系统的兼容问题。
为了解决上述技术问题,本发明公开了一种基于飞腾平台与共享内核的Linux与Android并存和交互方法,并采用以下技术方案来实现。
一种基于飞腾平台与共享内核的Linux与Android并存和交互方法,所述Linux与所述Android均运行在所述飞腾平台上;步骤包括:S1、所述Linux与所述Android的兼容性准备;S2、所述Linux与所述Android并存流程;S3、所述Linux与所述Android的交互流程。
进一步的,所述S1的兼容性准备包括:所述Linux和所述Android使用同一共享内核、所述Android针对所述Linux的功能扩展和所述Linux针对所述Android的功能扩展。
更进一步的,使所述Linux和所述Android使用同一共享内核的具体步骤包括:S111、在Linux内核中的make configmenu中激活Android binder、ashmem模块,确保config配置文件中关于binder、ashmem的编译选项为y;S112、重新编译所述Linux内核并安装;S113、配置udev。
更进一步的,所述Android针对所述Linux的功能扩展具体为对所述Android基础c库Bionic c进行扩展,移植Glibc中用于进程间通信的代码,使所述Glibc和所述Bionic c能够通过内核原有的Linux进程间通信接口进行通信;优选的,对所述Bionic c进行扩展的具体步骤为:S121、在libc中添加Sys V IPC消息队列和共享内存的代码;S122、在所述libc的系统调用列表里添加接口的声明、系统体系架构、相关头文件以及对应的代码;S123、重新编译得到新的Android基础库;所述S121和所述S122不分先后顺序。
更进一步的,所述Linux针对所述Android的功能扩展具体为将所述Android进程间通信机制Binder移植到Linux上;使所述Linux上的Binder库和所述Android上的Binder库能够通过内核的binder、ashmem设备以及驱动进行通信。
再进一步的,将所述Binder移植到所述Linux的过程是通过Linux编译链接工具实现的;具体为将所述Android源码项目中的Binder源码按照Glib c的格式与规范进行修改,再在所述Linux上编译链接成可供Linux进程调用的动态库文件。
进一步的,所述S2的具体步骤包括:
S201、启动所述Linux系统;
S202、所述Linux系统启动完成并保持运行,等待所述Android系统启动,待所述Android系统启动完成后进入S211;所述Android系统启动流程具体为S203-S209;
S203、开始构建所述Android系统运行时;
S204、启动适配的Android基础环境初始化init流程;
S205、初始化适配的Native环境;
S206、启动Dailvk/ART;
S207、启动适配的Frameworks环境;
S208、适配应用层环境;
S209、确保所述Android系统运行时环境构建完成;
S210、Android端显示、交互适配;
S211、Linux端显示、交互适配;
S212、实现所述Linux与所述Android在同一硬件平台、内核以及同一用户界面上的并存;
所述S210和所述S211不分先后顺序。
进一步的,所述S3的具体步骤包括:
S301、启动Linux进程A,进入main函数;
S302、调用Glibc中的函数将指定数据写入指定文件;
S303、main函数返回,结束所述进程A;
S304、启动Android应用B,进入Java层;
S305、所述Java层通过JNI调用进入Native层,所述Java层等待所述JNI调用返回;
S306、所述Native层通过Bionic c中的函数读取所述指定文件,得到所述数据;
S307、所述JNI调用返回结果,所述Java层继续执行下一步;
S308、所述Java层执行相应函数输出所述数据。
一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上任一所述Linux与Android并存和交互方法的步骤。
一种飞腾平台上基于完全函数的多版本软件管理装置,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上任一所述Linux与Android并存和交互方法的步骤。
与现有技术相比,本发明可以获得包括以下技术效果:通过自底向上全面兼容并行Linux与Android两个系统,最终能够实现一个兼容式的新系统,它们使用同一内核,使用共同的内核接口,既能够保留各自系统的运行时,又能将自身扩展到对方系统中去;为高效兼容并行Linux和Android提供稳定可靠的方法。
当然,实施本发明的任一产品并不一定需要同时达到以上所述的所有技术效果。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是本发明一个实施例的整体架构示意图。
图2是本发明一个实施例的Linux和Android系统运行基础库主要部分的关系图。
图3是本发明一个实施例的Linux与Android交互运行的主要流程图。
图4是本发明一个实施例的Linux与Android共存运行的主要流程图。
具体实施方式
以下将配合附图及实施例来详细说明本发明的实施方式,藉此对本发明如何应用技术手段来解决技术问题并达成技术功效的实现过程能充分理解并据以实施。
本发明提供了一种基于国产飞腾硬件平台、以Linux为操作系统共享内核,在一台计算机(包括服务器、PC机、笔记本、一体机等)上同时运行Linux和Android系统的方法,自底向上的解决了Linux系统与Android系统的兼容问题。
图1是Linux与Android系统基于飞腾硬件平台以及共享内核并行的整体架构示意图。包括运行在飞腾硬件平台上的Linux系统和Android系统,以及这两个系统对应的基础库和共享内核,Linux基础库里还包括针对Android系统的扩展库,Android基础库还包括针对Linux系统的扩展库。共享内核包括Linux内核和Binder Ashmem,其中Binder Ashmem是Android内核必要的部件以及对应驱动,例如binder、ashmem等,以确保Android系统能够运行在Linux内核上。
对于图1,从底层看,Linux系统与Android系统不经过任何虚拟化或者模拟技术直接共享硬件层与内核层;从顶层来看,Linux系统与Android系统拥有各自的运行并且拆开来看时,Linux与Android的运行时环境不受共享内核的影响,原有的结构并不改变;在共享内核的情况下,Linux与Android的运行时,看似没有交集,但是因为运行在任一系统上的进程共享了内核资源,所以它们能够进行传统的进程间通信。
本申请在Linux内核的基础上加入Android内核必要的部件以及对应驱动(如binder、ashmem等),并且重新编译内核,使得Linux和Android系统可以直接运行在扩展的共享内核上;只要运行在同一内核上,就能通过共享内核资源实现资源共享和信息交互。
由于Android系统本身的内核源于Linux内核,所以它们内核的很多部分的工作原理、工作方式甚至对外的接口都是相同的。如果能够使Linux与Android系统在同一终端上共享同一内核,那么这很大一部分资源就能够不进行适配直接共享。但是由于Linux与Android原生内核毕竟有所不同,所以一直以来两个系统只能运行在不同的内核上。本申请通过兼容性扩展Linux系统,实现内核层同时对Linux和Android系统的兼容,能够直接共享内核的资源。剩下的任务便是两个系统对扩展内核接口的适配,将各自系统重要的内核接口增加到对方系统的基础库中,这样便能够实现Linux和Android共享内核资源的通用协议。
安卓系统主要是面向嵌入式硬件环境和移动智能终端平台,其使用的安卓内核基于标准Linux内核增加了一些针对这些平台和安卓自身特点的驱动模块。目前安卓内核特有的驱动模块源码已经整合到了标准Linux内核中,因此首先需要将安卓内核对应的驱动模块移植到国产飞腾操作系统内核中,同时还需要结合国产操作系统对安卓运行时环境易用性的支持进行内核的适配和扩展。
具体实现方式如下:
(1)共享内核的实现:
为了使Linux和Android共享内核,内核必须同时支持Linux和Android运行时的需要,故选取合适的linux内核(目前安卓内核特有的驱动模块源码已经整合到了标准Linux内核中,具有Android模块的编译选项,在Android内核回归Linux后,Linux内核默认包含了Android模块,并且在config配置文件中默认为不激活),在make configmenu中激活Android binder、ashmem等模块,确保config配置文件中关于binder、ashmem的编译选项为y,重新编译此Linux内核并安装,最后配置udev使得/dev/binder和/dev/ashmem的权限为666。
(2)Android针对Linux功能扩展:
主要是对Android基础c库Bionic c进行扩展,移植Glibc中一些用于进程间通信的代码(Bionic里提供了一些库,它们只实现了Glibc库中一部分功能,libc是C语言最基础的库文件,它提供了系统的基本功能,主要是对系统调用的封装,是应用和内核交流的桥梁),使Glibc和Bionic c能够通过内核原有的Linux进程间通信接口进行通信。在libc中添加Sys V IPC消息队列和共享内存的代码,同时在libc的系统调用列表里添加接口的声明以及系统体系架构,并添加相关头文件以及对应的C语言或者汇编实现,重新编译得到新的Android基础库。
(3)Linux针对Android功能扩展:
主要是Android进程间通信机制Binder在Linux上的移植,Binder库中同时又包含了Ashmem的实现,Linux上的Binder库和Android上的Binder库能够通过内核的binder、ashmem设备和驱动进行通信,Binder移植需要通过使用Linux编译链接工具,将安卓源码项目中的Binder源码按照Glib c的格式与规范进行适当修改,在Linux上编译链接成可供Linux进程调用的动态库文件。
图2是Linux基础库glibc以及Android基础库bionic c经过验证或适配的内核接口以及内核接口的封装协议的韦恩图。Linux基础库扩展的具体方法是通过使用Linux系统的编译工具gcc/g++编译Android基础库的源码,这种方法的作用是为Linux提供了通向Android的接口。Android基础库的扩展方法是选择性的添加Linux基础库中的关键代码以及系统调用,使得Android也具有了通向Linux的接口和协议。因为考虑到Android基础库本身的轻量性和完备性,本申请Android基础库的扩展只实现了部分关键Linux基础库代码的移植。
通过对Linux基础库glibc和Android基础库bionic c的扩展内核的内核接口进行扩展以及重新编译,使得在保留Linux和Android自身基础库的情况下,新的Linux基础库和Android基础库能够适配共享内核,使用一组共同的进程间通信协议,进而为两个系统的资源共享提供基础支撑。
对图2所示的Linux基础库与Android基础库的关系图,需要进一步指出的是,Linux系统和Android系统虽然在内核层和基础库层十分相似,但两者的基础库不能互通;这是因为两者在进行核外开发时使用了完全不同的编译链接工具,编译连接器的不同很大程度上影响了基础库的二进制编码形式;同时,为了保持上层应用的稳定性,基础库层也只能以内核增加接口的方式进行适配;所以,即使扩展后的任一系统拥有共同的资源,也并不能够以直接调用对方系统库函数的形式进行,而是需要显式的经过内核进行跨系统调用。
图3是检验Linux运行时与Android运行时通过基于飞腾硬件平台与共享内核进行交互的实例流程图。在并行Linux和Android的环境下,一个Linux进程A通过适配后的Linux基础C库glibc以及共享内核接口写入一个变量到共享内核的文件系统中,这里的变量选用了string类型变量;然后一个Android的Java进程B调用JNI接口,并通过Android基础库bionic c提供的内核接口访问共享内核,读取Linux进程A在之前写入文件系统的文件filepath,最后返回到B进程中进行打印。其中,Linux进程A可以直接通过Linux终端命令行运行;Android进程B,可以通过Linux的终端来运行/system/bin/adb install来安装进程B的apk文件至Android系统内。然后通过/system/bin/am start-n命令启动,Android进程返回的结果可以通过/system/bin/logcat|grep System.out.println()查看。
具体步骤为:
S301、启动Linux进程A,进入main函数;
S302、调用Glibc的stdio和string库将“你好”这个字符串使用fwrite函数写入文件,文件路径为FilePath;
S303、main函数返回,Linux进程A结束;
S304、启动Android应用B,进入Java层;
S305、Java层通过JNI调用进入Native层,Java层等待JNI调用返回;
S306、Native层通过Bionic c的stdio的fread函数和string库读取Linux glibc写入的文件,得到string“你好”;
S307、JNI调用返回结果,Java层继续执行下一步;
S308、Java层执行System.out.println(),控制台输出“你好”。
图3中所述的Linux进程A和Android进程B,一般的,指的是分别使用各自的编译系统(如Linux的gcc/g++,Android的源码项目AOSP编译环境和Android Studio的编译环境等),向同一计算机体系架构编译出的可执行文件。通过图3的示例,能够验证本申请的理论在基础C库(string库)和文件系统上的准确性,即通过本申请提出的方法,能够实现Linux系统和Android系统资源共享的效果。
本申请的本质是Linux和Android两个系统在内核级的兼容;通过这种自底向上的兼容形式,能够模糊不同系统间进程的边界,使得核外用户层能够通过共享内核进行资源共享与通信交互,为实现Linux系统与Android系统的并行和交互提供了最基础的支持。
以上所述的都是基于Linux与Android运行时已经并存这一前提条件,Linux与Android实现并存的具体步骤如图4所示。实现Linux与Android运行时并存的主要思路是以Linux操作系统为宿主系统,在Linux系统启动完成的大前提下,重新定制Android的启动流程,比如init流程、显示流程等,进而达到Linux与Android运行时并存的效果。具体的实现并存的步骤包括:
S401、启动基于飞腾硬件平台和共享内核的Linux系统,即正常开机启动,挂载设备、创建文件目录等操作;
S402、基于飞腾硬件平台的Linux运行时搭建完成,在保持自身运行时的前提下,准备启动Android运行时(init进程);此步骤之后流程会分为两个并行分支,其中在Linux上的流程进入S411(其实是进入等待状态,等待Android启动完成后再与之进行显示、交互适配),而在Android上的流程则进入下一步;
S403、Android运行时构建开始,在Linux运行时搭建完成后,选择通过宿主系统Linux以启动进程的方式启动Android init进程;
S404、基于飞腾硬件平台和共享内核启动适配的Android基础环境初始化init流程,适配的内容大致有去除Linux系统已经挂载、创建过的目录、去除额外启动分支等;
S405、对经过适配后的Native层环境进行初始化,在原生Android Native层启动的基础上,基于共享内核通用协议适配SurfaceFlinger、InputEvent、Sys文件系统等;
S406、启动Daivlk/ART,Android进入java环境;
S407、启动适配的Frameworks环境,在原生Android Frameworks层的基础上,增加扩展的Wifi模块、Apk管理模块等;
S408、适配应用层环境,主要是对用户界面进行修改;
S409、Android运行时启动完成,准备与宿主系统进一步交互;
S410、Android上的显示适配和交互适配,通过Native层和Frameworks层经过适配后的SurfaceFlinger、InputEvent、Sys文件系统等建立Android端的显示和交互模块;
S411、Linux上的显示适配和交互适配,通过共享内核通用协议(共享内存)建立Qt窗口,实现Android显示流程的显示功能,并实现InputEvent输入事件的键盘鼠标交互功能等;
S412、经过上述步骤,实现了Linux与Android在同一硬件平台和内核上的并存,并且实现了Linux与Android在同一用户界面上的并存。
本申请能够同时完美运行Linux和Android系统的根本原因是因为Android内核本身与Linux同源并且相似;通过对内核和两个操作系统基础库的定制与适配,最终可以实现将两个系统同时运行在同一内核之上,并且实现完全的资源共享。
Binder:Binder是Android系统进程间通信(IPC)机制。Linux已经拥有管道,system VIPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信。
Ashmem:Ashmem(Anonymous Shared Memory匿名共享内存),是在Android的内存管理中提供的一种机制。它基于mmap系统调用,不同的进程可以将同一段物理内存空间映射到各自的虚拟空间,从而实现共享。
JNI:Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++语言)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
本发明的有益效果是:通过自底向上全面兼容并行Linux与Android两个系统,最终能够实现一个兼容式的新系统,它们使用同一内核,使用共同的内核接口,既能够保留各自系统的运行时,又能将自身扩展到对方系统中去;为高效兼容并行Linux和Android提供稳定可靠的方法。
以上对本发明实施例所提供的一种基于飞腾平台与共享内核的Linux与Android并存和交互方法,进行了详细介绍。以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
如在说明书及权利要求当中使用了某些词汇来指称特定组件或模块。本领域技术人员应可理解,不同机构可能会用不同名词来称呼同一个组件或模块。本说明书及权利要求并不以名称的差异来作为区分组件的方式,而是以组件或模块在功能上的差异来作为区分的准则。如在通篇说明书及权利要求当中所提及的“包含”、“包括”为开放式用语,故应解释成“包含但不限定于”。“大致”是指在可接收的误差范围内,本领域技术人员能够在一定误差范围内解决所述技术问题,基本达到所述技术效果。说明书后续描述为实施本发明的较佳实施方式,然所述描述乃以说明本发明的一般原则为目的,并非用以限定本发明的范围。本发明的保护范围当视所附权利要求所界定者为准。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的商品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种商品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的商品或者系统中还存在另外的相同要素。
上述说明示出并描述了本发明的若干优选实施例,但如前所述,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述发明创造构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。