,,
(西安郵電大學(xué) 計(jì)算機(jī)學(xué)院,西安 710061)
Android是Google公司在2007年發(fā)布的一款基于Linux內(nèi)核的開源操作系統(tǒng)。經(jīng)過不斷地發(fā)展,該操作系統(tǒng)不僅在移動(dòng)設(shè)備上迅速普及[1],在其它領(lǐng)域的使用率也逐漸增多,延伸到電視盒、桌面設(shè)備甚至工控機(jī)器。但在這些拓展領(lǐng)域上,Android操作系統(tǒng)的應(yīng)用生態(tài)極為貧乏。如果能夠移植現(xiàn)有的Linux程序到Android平臺(tái),則能夠加速Android平臺(tái)在各個(gè)領(lǐng)域的應(yīng)用。Linux系統(tǒng)一般情況下指的是GNU/Linux操作系統(tǒng),它是由GNU工程創(chuàng)建的一系列軟件工具包,與Linux內(nèi)核組合在一起形成的操作系統(tǒng)[2],可安裝在各種硬件設(shè)備中。Linux系統(tǒng)經(jīng)過長(zhǎng)時(shí)間的發(fā)展,擁有豐富的軟件資源[3],可滿足各種領(lǐng)域的需求。
目前Linux程序向Android平臺(tái)移植主要采用基于交叉編譯的方法?;诮徊婢幾g的移植方法為嵌入式系統(tǒng)制作程序的常用方法,就是在一個(gè)平臺(tái)上通過編譯器編譯另一個(gè)平臺(tái)上的可執(zhí)行程序的方法[4]。對(duì)于Android平臺(tái),最常用的交叉編譯工具是Google開發(fā)的Android NDK或GCC交叉編譯器。論文“移植Tcpdump到Android手機(jī)捕獲無(wú)線數(shù)據(jù)包的方法研究”[5]中就使用Android NDK進(jìn)行移植。由于Android中的C運(yùn)行庫(kù)是Bionic,而Linux程序均使用Glibc庫(kù)進(jìn)行編程,Bionic庫(kù)與Glibc庫(kù)具有較大不同,所以該方法需要對(duì)編譯選項(xiàng)和目標(biāo)程序代碼進(jìn)行適當(dāng)?shù)男薷膩?lái)適配Android的Bionic庫(kù)。因此該方法只適合依賴程序庫(kù)少且代碼量較小的程序,對(duì)于依賴很多程序庫(kù)或者代碼量太大的程序使用Android NDK移植并不現(xiàn)實(shí)。GCC交叉編譯器雖然可以使用Glibc庫(kù),從而不用大量修改程序的代碼,但是它需要程序提供靜態(tài)編譯選項(xiàng)且移植過程繁雜。以Linux系統(tǒng)中的CUPS程序?yàn)槔蕾嚨某绦驇?kù)數(shù)量非常多,并且很多依賴程序甚至沒有靜態(tài)編譯選項(xiàng),以至于無(wú)法利用GCC交叉編譯器進(jìn)行靜態(tài)編譯。所以已有的移植方法不能滿足移植Linux程序到Android平臺(tái)的要求,需要一個(gè)更可行的移植方法。
針對(duì)Linux程序向Android平臺(tái)移植的問題,本文從應(yīng)用程序二進(jìn)制接口(Application Binary Interface,ABI)層面分析了Linux和Android平臺(tái)的差異,提出一種基于ABI兼容技術(shù)的移植方法。
應(yīng)用程序二進(jìn)制接口描述了應(yīng)用程序和操作系統(tǒng)之間,或一個(gè)應(yīng)用和它的依賴庫(kù)之間,或應(yīng)用的組成部分之間的低層接口[6]。ABI包含各種細(xì)節(jié):如系統(tǒng)調(diào)用約定、可執(zhí)行程序的格式、程序依賴庫(kù)、數(shù)據(jù)類型的規(guī)定以及系統(tǒng)目錄結(jié)構(gòu)等內(nèi)容。在ABI兼容的系統(tǒng)中,編譯好的程序可以直接運(yùn)行,無(wú)需改動(dòng)目標(biāo)程序代碼且無(wú)需重新編譯。比較ABI兼容性的前提是操作系統(tǒng)可以運(yùn)行在相同處理器架構(gòu)的硬件兼容環(huán)境中,否則無(wú)法比較。比如ARM 架構(gòu)下的 Linux 系統(tǒng)可以與 ARM 架構(gòu)下的 Android系統(tǒng)比較ABI兼容性。由于 Linux 系統(tǒng)與 Android 系統(tǒng)都能在主流處理器架構(gòu)下運(yùn)行,所以不存在某個(gè)處理器架構(gòu)下的Android系統(tǒng)沒有對(duì)應(yīng)Linux 系統(tǒng)的情況。因此本文的討論不限于某個(gè)處理器架構(gòu),并且只需要在操作系統(tǒng)層面討論Linux和Android操作系統(tǒng)的ABI差異。
Linux和Android可分為用戶態(tài)和內(nèi)核態(tài)兩個(gè)部分,從該角度看Linux和Android的系統(tǒng)架構(gòu),如圖1所示。應(yīng)用程序運(yùn)行在用戶態(tài),系統(tǒng)調(diào)用是內(nèi)核態(tài)與用戶態(tài)交互的接口。在內(nèi)核態(tài)中,兩種系統(tǒng)使用的都是Linux內(nèi)核。但Android中的Linux內(nèi)核與標(biāo)準(zhǔn)Linux內(nèi)核不完全相同,其保留原有信號(hào)等機(jī)制的同時(shí)添加了Binder IPC、Ashmem等機(jī)制[7]。對(duì)比Android的Linux內(nèi)核分支源碼和標(biāo)準(zhǔn)Linux內(nèi)核源碼,發(fā)現(xiàn)X86、ARM等構(gòu)架對(duì)應(yīng)的系統(tǒng)調(diào)用均完全相同,則說(shuō)明Android的Linux內(nèi)核與標(biāo)準(zhǔn)Linux內(nèi)核的系統(tǒng)調(diào)用保持一致。因此在相同處理器架構(gòu)設(shè)備上的Linux系統(tǒng)或者Android系統(tǒng),其系統(tǒng)調(diào)用的約定是一致的。比如:X86上的Linux程序想在X86上的Android系統(tǒng)中運(yùn)行,系統(tǒng)調(diào)用部分是兼容的。
圖1 Linux和Android系統(tǒng)架構(gòu)
由于Linux系統(tǒng)和Android系統(tǒng)都使用了Linux內(nèi)核,所以內(nèi)核態(tài)中的ABI基本相同。在用戶態(tài),有一個(gè)重要ABI差異就是系統(tǒng)目錄結(jié)構(gòu)。
Linux中的系統(tǒng)目錄結(jié)構(gòu)遵循文件系統(tǒng)層次化標(biāo)準(zhǔn)(Filesystem Hierarchy Standard,F(xiàn)HS)[8]。FHS標(biāo)準(zhǔn)規(guī)定了系統(tǒng)不同目錄里存放的內(nèi)容,如:/var目錄存放系統(tǒng)運(yùn)行時(shí)要改變的數(shù)據(jù)、/etc目錄用來(lái)存放程序配置文件。但是Android沒有遵循FHS標(biāo)準(zhǔn),Android中沒有/var目錄、應(yīng)用程序沒有/etc目錄的讀寫權(quán)限。因此系統(tǒng)目錄結(jié)構(gòu)不一致會(huì)導(dǎo)致程序運(yùn)行時(shí)出現(xiàn)無(wú)法創(chuàng)建或打開文件的錯(cuò)誤。
Linux系統(tǒng)中的可執(zhí)行程序可以分為腳本程序和ELF(Executable and Linking Format)程序兩種[9]。
1)腳本程序即用Shell等腳本語(yǔ)言編寫的程序。腳本程序通常被其它程序調(diào)用,來(lái)輔助完成其它程序的功能。Linux上的腳本程序遵循POSIX標(biāo)準(zhǔn)。POSIX表示可移植操作系統(tǒng)接口,是UNIX系統(tǒng)的一個(gè)設(shè)計(jì)標(biāo)準(zhǔn),其中包括對(duì)Shell腳本的規(guī)定。對(duì)于這類程序,需要使用腳本解釋器執(zhí)行,比如:Bash解釋器可以用來(lái)解釋執(zhí)行Shell腳本。腳本解釋器文件本身則屬于第二種ELF程序類別。因此Linux程序在Android平臺(tái)運(yùn)行需要解決的是ELF程序的執(zhí)行。
2)Linux系統(tǒng)里的ELF程序主要是指利用C/C++等語(yǔ)言編寫的程序,這類程序需要經(jīng)過編譯鏈接,生成ELF格式文件才能執(zhí)行。ELF文件有三類:可執(zhí)行文件、共享庫(kù)文件和重定位文件[9]。其中的可執(zhí)行文件和共享庫(kù)文件是程序運(yùn)行時(shí)需要的文件,ABI兼容需要解決這兩種文件的執(zhí)行問題。ELF可執(zhí)行程序在編譯鏈接時(shí)有動(dòng)態(tài)鏈接和靜態(tài)鏈接兩種方式。靜態(tài)鏈接的程序?qū)⒁蕾嚭瘮?shù)與程序本身打包在一起,而動(dòng)態(tài)鏈接的程序需要在啟動(dòng)的時(shí)候讀取指定路徑的共享庫(kù)文件才可以運(yùn)行。
在Android應(yīng)用層,采用的是Android應(yīng)用程序包(Android application package,APK)格式,它在安裝到系統(tǒng)后由ART虛擬機(jī)解釋執(zhí)行,而Android底層仍然使用ELF可執(zhí)行文件,且ELF文件格式和Linux系統(tǒng)中的相同。由于Android中的動(dòng)態(tài)鏈接庫(kù)解釋器與Linux系統(tǒng)中的解釋器不同,并且缺少對(duì)應(yīng)的動(dòng)態(tài)鏈接庫(kù),實(shí)際上Linux中的大部分ELF程序并不能在Android系統(tǒng)直接執(zhí)行。
程序依賴庫(kù)指的是一系列為了簡(jiǎn)化編程復(fù)雜度、提高開發(fā)效率,對(duì)系統(tǒng)調(diào)用進(jìn)行包裝的函數(shù)集合。程序依賴庫(kù)在Linux中編譯后就是后綴為so的ELF共享庫(kù)文件。ELF共享庫(kù)文件也被稱為動(dòng)態(tài)鏈接庫(kù),因?yàn)閯?dòng)態(tài)鏈接的ELF可執(zhí)行文件在啟動(dòng)的時(shí)候需要加載鏈接其依賴的共享庫(kù)文件。例如:圖1中的Glibc和Bionic庫(kù)。Linux中程序的C運(yùn)行庫(kù)是Glibc,而Android中的C運(yùn)行庫(kù)則是Bionic。基于Glibc庫(kù)開發(fā)的動(dòng)態(tài)鏈接程序要想在Android平臺(tái)上運(yùn)行,如果不修改源代碼適配Bionic庫(kù),就必須把Glibc共享庫(kù)文件也移植過去。
ELF動(dòng)態(tài)鏈接程序的文件結(jié)構(gòu)如圖2所示,包含ELF頭(ELF header)、程序頭表(Program header table)、中間若干段section和節(jié)區(qū)頭表(Section header table)。其中.dynamic段記錄了該ELF程序動(dòng)態(tài)鏈接信息。該段里的DT_NEED類型的項(xiàng)記錄了其依賴的共享庫(kù)文件的位置,動(dòng)態(tài)鏈接庫(kù)解釋器通過該項(xiàng)字段便能找到其依賴的全部動(dòng)態(tài)鏈接庫(kù)。
圖2 ELF動(dòng)態(tài)鏈接程序文件結(jié)構(gòu)
通過前面的分析可知,Linux和Android平臺(tái)程序的ABI兼容問題主要是系統(tǒng)目錄結(jié)構(gòu)一致性問題和可執(zhí)行程序的加載和鏈接問題。這兩個(gè)問題分別可以通過目錄結(jié)構(gòu)重定向技術(shù)和程序依賴關(guān)系分析技術(shù)解決。
為了解決系統(tǒng)目錄結(jié)構(gòu)的差異,可使用目錄結(jié)構(gòu)重定向技術(shù)在Android上構(gòu)造Linux中的系統(tǒng)目錄結(jié)構(gòu)。目錄結(jié)構(gòu)重定向指改變程序執(zhí)行時(shí)包括根目錄在內(nèi)的目錄文件位置,或使得程序只看見指定的目錄文件。在Linux系統(tǒng)里有兩個(gè)機(jī)制能夠重定向目錄結(jié)構(gòu),Namespace機(jī)制和Change Root機(jī)制。
Namespace是Linux內(nèi)核里的一種機(jī)制,提供一種包括目錄在內(nèi)的資源隔離功能,但是由于很多Android設(shè)備廠商在編譯內(nèi)核時(shí)沒有開啟namespace機(jī)制,所以使用Namespace機(jī)制不能保證對(duì)所有Android設(shè)備可用。
Change Root機(jī)制指改變程序執(zhí)行根目錄的機(jī)制。Change Root機(jī)制最常見的實(shí)現(xiàn)是Chroot,它是Unix類系統(tǒng)中的一個(gè)操作命令。在Linux系統(tǒng)中,它的功能由Linux內(nèi)核實(shí)現(xiàn),通過系統(tǒng)調(diào)用的形式提供,并且使用者需要擁有Root權(quán)限。Chroot工具通常用來(lái)限制程序的可讀寫文件,保護(hù)系統(tǒng)安全。如“在Solaris環(huán)境下通過實(shí)現(xiàn)Chroot增進(jìn)系統(tǒng)安全性”論文中的應(yīng)用[10],正是利用Chroot的特性創(chuàng)建一個(gè)封閉的環(huán)境,在里面提供程序所需的所有文件。
但是Chroot有個(gè)限制,它需要Root權(quán)限才能夠使用。相比之下,可以使用一個(gè)名為Proot的工具[11],能夠在用戶態(tài)實(shí)現(xiàn)Chroot的功能。它的原理與Chroot不同,它通過Ptrace系統(tǒng)調(diào)用,實(shí)現(xiàn)父進(jìn)程控制子進(jìn)程的執(zhí)行過程,從而改變運(yùn)行時(shí)的根目錄。Proot的出現(xiàn)拓寬了Change Root機(jī)制的應(yīng)用場(chǎng)景。尤其在Android系統(tǒng)中,應(yīng)用程序通常無(wú)法獲取Root權(quán)限,這時(shí)可以使用Proot工具代替Chroot完成目錄結(jié)構(gòu)重定向的功能。
為了使Linux動(dòng)態(tài)編譯的程序能夠在Android平臺(tái)上運(yùn)行,首先需要移植Linux中的動(dòng)態(tài)鏈接庫(kù)解釋器“l(fā)d-linux.so”,Linux動(dòng)態(tài)編譯的程序便能通過它在Android平臺(tái)上加載進(jìn)入內(nèi)存。其次,動(dòng)態(tài)鏈接庫(kù)解釋器會(huì)鏈接其依賴的全部動(dòng)態(tài)鏈接庫(kù)文件。本文使用程序依賴關(guān)系分析技術(shù)來(lái)解決程序的依賴文件問題。
這里給出依賴關(guān)系的數(shù)學(xué)描述:設(shè)有關(guān)系模式R(U),其中U{A1,A2,...,An}是關(guān)系的屬性全集,X、Y是U的屬性子集,設(shè)t和u是關(guān)系R上的任意兩個(gè)元組,如果t和u在X的投影t[X]=u[X]推出t[Y]=u[Y],即:t[X]=u[X]=>t[Y]=u[Y],則稱X決定Y,或Y依賴于X。記為X->Y。
在Linux中,ELF動(dòng)態(tài)鏈接程序之間的依賴關(guān)系表現(xiàn)為,關(guān)系模式R(U),其中U{A1,A2,...,An}是系統(tǒng)全部的ELF動(dòng)態(tài)鏈接程序,X、Y是U中任意兩個(gè)ELF動(dòng)態(tài)鏈接程序子集,如果在某個(gè)條件t下總能從t[X]=u[X]推出t[Y]=u[Y],則說(shuō)明兩個(gè)動(dòng)態(tài)鏈接程序具有依賴關(guān)系。這樣的依賴關(guān)系在ELF程序間普遍存在,依賴關(guān)系的實(shí)現(xiàn)依靠ELF動(dòng)態(tài)鏈接程序文件里的動(dòng)態(tài)鏈接信息和軟鏈接文件。
從圖2中已經(jīng)了解到ELF動(dòng)態(tài)鏈接文件和共享庫(kù)的依賴信息記錄在.dynamic段里。在Linux系統(tǒng)中有一個(gè)ldd命令,它能夠調(diào)用程序動(dòng)態(tài)鏈接庫(kù)解釋器查看該文件.dynamic段里的動(dòng)態(tài)鏈接信息。借助ldd命令便能分析出程序的依賴關(guān)系。但存在ELF文件里的動(dòng)態(tài)鏈接信息所指向的目標(biāo)是一個(gè)軟鏈接,軟鏈接經(jīng)過若干次鏈接,指向最終的動(dòng)態(tài)鏈接文件。因此程序依賴關(guān)系分析的流程如圖3所示。
圖3 程序依賴關(guān)系分析流程圖
圖3中的步驟描述如下:
1)以目標(biāo)程序編譯后的輸出文件夾為起點(diǎn),掃描里面所有的ELF動(dòng)態(tài)鏈接文件;
2)讀取.dynamic段里的動(dòng)態(tài)鏈接信息,依次查找里面記錄的依賴文件。
3)將查找到的文件復(fù)制到指定位置,如果該文件是ELF文件,則讀取該文件里的動(dòng)態(tài)鏈接信息,進(jìn)入遞歸;如果是軟鏈接文件,則找到最終指向的ELF文件,然后遞歸讀取。
基于ABI兼容的移植方法框架如圖4所示。整體結(jié)構(gòu)分為左右兩個(gè)部分,左邊是Linux目標(biāo)程序部分,即需要移植的程序,右邊是Android控制程序部分,Android控制程序用于操作目標(biāo)程序。
最底層是Android系統(tǒng)的Linux內(nèi)核,移植的程序需要與Android系統(tǒng)共享一個(gè)內(nèi)核。Linux目標(biāo)程序通過ABI兼容層越過Android Framework層直接與Linux內(nèi)核進(jìn)行系統(tǒng)調(diào)用操作。
中間的ABI兼容層由三個(gè)子模塊組成,分別是Change Root模塊 、Bash環(huán)境模塊和程序依賴模塊。Change Root模塊通過Proot工具重定向目錄結(jié)構(gòu),在一個(gè)封閉的環(huán)境里提供與Linux系統(tǒng)一致的目錄結(jié)構(gòu);Bash環(huán)境模塊使用Busybox工具集[12]提供滿足POSIX標(biāo)準(zhǔn)的Shell環(huán)境,提供程序所需的Shell命令;程序依賴模塊通過程序依賴關(guān)系分析技術(shù)提供Linux目標(biāo)程序所需的全部動(dòng)態(tài)依賴庫(kù)。三個(gè)模塊共同組成的ABI兼容層提供了Linux目標(biāo)程序完整的執(zhí)行環(huán)境,使得Linux目標(biāo)程序能夠在Android平臺(tái)正常運(yùn)行。
圖4 移植方法的框架
在Linux系統(tǒng)中程序原有的控制方式是命令行,但是在Android系統(tǒng)中以這種用戶不友好的方式運(yùn)行程序不合適,所以本文提出的方法通過編寫一個(gè)Android應(yīng)用程序,實(shí)現(xiàn)圖形界面控制到目標(biāo)程序命令控制轉(zhuǎn)換的功能,使用者就能夠通過Android控制程序這個(gè)中間層實(shí)現(xiàn)對(duì)目標(biāo)程序的控制操作。
圖5是目標(biāo)程序的運(yùn)行流程。使用者操作Android控制程序,由Android控制程序通過命令行方式直接向內(nèi)核發(fā)送fork系統(tǒng)調(diào)用,從而啟動(dòng)Linux目標(biāo)程序。然后Linux目標(biāo)程序運(yùn)行在Change Root模塊所創(chuàng)建的進(jìn)程中,并且能夠從程序依賴模塊獲取所依賴的共享庫(kù)文件。以及在需要的時(shí)候通過Bash環(huán)境模塊運(yùn)行Shell命令,從而完成目標(biāo)程序的全部功能。
圖5 目標(biāo)程序的運(yùn)行流程
CUPS是Unix/Linux下的開源打印系統(tǒng),提供一整套完善的打印方案,擁有USB打印、網(wǎng)絡(luò)打印等功能。本文以移植Linux中的CUPS程序到OPENTHOS系統(tǒng)為例,驗(yàn)證本文提出的移植方法。OPENTHOS系統(tǒng)是清華大學(xué)、同方股份有限公司、一銘軟件股份有限公司聯(lián)合開發(fā)以Android-x86為基礎(chǔ)的開源桌面操作系統(tǒng)。移植CUPS程序到OPENTHOS系統(tǒng)是整個(gè)OPENTHOS項(xiàng)目的一個(gè)重要部分,為該系統(tǒng)提供打印功能。
在OPENTHOS中運(yùn)行移植的CUPS程序,并通過ps命令查詢系統(tǒng)中的進(jìn)程。部分查詢結(jié)果如圖6所示,其中名為cupsd的條目代表CUPS程序的進(jìn)程,說(shuō)明CUPS程序正在系統(tǒng)中運(yùn)行。用USB接口連接上HP P1108打印機(jī),并運(yùn)行安裝在OPENTHOS系統(tǒng)上的文本處理程序WPS,使用其中的打印功能。移植的程序能夠正常識(shí)別HP P1108打印機(jī),并且成功打印出WPS里的文本,打印結(jié)果與預(yù)覽中的效果一致,說(shuō)明CUPS打印程序在OPENTHOS系統(tǒng)上運(yùn)行正常。
圖6 進(jìn)程列表截圖
通過整理實(shí)驗(yàn)數(shù)據(jù)得到本文方法與基于交叉編譯的移植方法的對(duì)比表格1。從中可以看到,本文提出的基于ABI兼容的移植方法,相比基于交叉編譯的方法,由于需要移植程序依賴的動(dòng)態(tài)庫(kù),所以占用空間稍微大了一些,但是本文提出的方法不需要修改目標(biāo)程序的代碼,因此支持更多的程序、降低了移植的復(fù)雜度。由于ABI兼容不需要重新編譯程序,所以在相同處理器構(gòu)架下的設(shè)備中能夠使用閉源程序。但是,本文提出的方法還有一些不足,比如:若目標(biāo)程序沒有提供命令行操作接口,那么這個(gè)程序很難使用本文的方法移植,但是這樣的程序在Linux系統(tǒng)中很少見。另外在不同的處理器構(gòu)架下閉源驅(qū)動(dòng)不能使用,這個(gè)問題以后可以考慮加入X86等處理器架構(gòu)的模擬器來(lái)運(yùn)行閉源部分的程序,比如名為Bochs的開源X86平臺(tái)模擬器可以在ARM上運(yùn)行X86程序。
表1 移植方法的對(duì)比
本文首先分析了Linux和Android系統(tǒng)在ABI兼容上的主要差異,然后分析了消除ABI差異的技術(shù):目錄結(jié)構(gòu)重定向和程序依賴關(guān)系分析技術(shù)。在此基礎(chǔ)上,本文提出基于ABI兼容技術(shù)的移植方法,并將Linux系統(tǒng)中的CUPS程序成功移植到基于Android的OPENTHOS系統(tǒng)。本方法適用于一般的Linux平臺(tái)的程序,并優(yōu)于基于交叉編譯的移植方法。希望本文提出的改進(jìn)方法能夠?qū)π枰袻iunx程序向Android平臺(tái)移植的工作者提供一點(diǎn)幫助和啟示。
參考文獻(xiàn):
[1] 貢知洲, 路昭亮. Android發(fā)展的分析與研究[J]. 價(jià)值工程, 2013, 32(2):185-186.
[2] Mackinnon J G. The Linux operating system: Debian GNU/Linux[J]. Journal of Applied Econometrics, 1999, 14(4):443-52.
[3] 李其鋒, 李 兵. 開源軟件開發(fā)者的演化研究[J]. 計(jì)算機(jī)科學(xué), 2015, 42(12):43-46.
[4] 張歡慶, 高 麗, 宋承祥. 基于ARM的嵌入式Linux交叉編譯環(huán)境的研究與實(shí)現(xiàn)[J]. 計(jì)算機(jī)與數(shù)字工程, 2012, 40(2):151-153.
[5] 胡錦暉, 胡大斌. 移植Tcpdump到Android手機(jī)捕獲無(wú)線數(shù)據(jù)包的方法研究[J]. 無(wú)線通信技術(shù), 2015, 24(1):6-10.
[6] 黃聰會(huì), 陳 靖, 羅 樵,等. 面向二進(jìn)制移植的虛擬化技術(shù)[J]. 計(jì)算機(jī)應(yīng)用研究, 2012, 29(11):4185-4188.
[7] 梁 超. Android內(nèi)核與標(biāo)準(zhǔn)Linux內(nèi)核對(duì)比分析[J]. 工業(yè)設(shè)計(jì), 2012(2):74-74.
[8] Hierarchy F S. Linux Standard Base[Z]. 2015.
[9] 黃 進(jìn). Linux應(yīng)用二進(jìn)制兼容技術(shù)的研究與實(shí)現(xiàn)[D]. 哈爾濱:國(guó)防科學(xué)技術(shù)大學(xué), 2003.
[10] 蘇 雅, 王 鋼, 巴特爾. 在Solaris環(huán)境下通過實(shí)現(xiàn)chroot增進(jìn)系統(tǒng)安全性[J]. 內(nèi)蒙古工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版, 2003, 22(4):289-292.
[11] cedric-vincent,Proot項(xiàng)目主頁(yè)[EB/OL].http://proot.me,2017.
[12] 邵長(zhǎng)彬, 李洪亮. 用Busybox制作嵌入式Linux根文件系統(tǒng)[J]. 微計(jì)算機(jī)信息, 2007, 23(29):48-50.