陳 平,曾興斌,何加銘,賈德祥
(寧波大學(xué)通信技術(shù)研究所,浙江寧波315211)
移動終端動態(tài)加載機制研究
陳 平,曾興斌,何加銘,賈德祥
(寧波大學(xué)通信技術(shù)研究所,浙江寧波315211)
隨著移動終端系統(tǒng)深入發(fā)展,應(yīng)用程序擴展能力已成為一個基本需求,中低端移動終端系統(tǒng)迫切需要一種機制能使系統(tǒng)在運行狀態(tài)時動態(tài)添加模塊。該文提出一種內(nèi)存分配策略及基于虛擬函數(shù)表結(jié)構(gòu)動態(tài)加載機制,給出了應(yīng)用程序加載實現(xiàn)方法。實驗結(jié)果表明:基于該機制所開發(fā)的加載器具有體積小,運行速度快,性能穩(wěn)定等特點。
移動終端;內(nèi)存分配;虛擬函數(shù)表;動態(tài)加載
嵌入式系統(tǒng)發(fā)展至今天,有關(guān)嵌入式系統(tǒng)研究在國際和國內(nèi)都有很大發(fā)展,比如對Linux操作系統(tǒng)裁剪并應(yīng)用于嵌入式系統(tǒng);隨著嵌入式軟件的深入發(fā)展,人們提出且實現(xiàn)一種能在運行狀態(tài)下配置系統(tǒng)機制,即系統(tǒng)可在運行時動態(tài)裝載和卸載功能模塊[1、2]。即便如此,由于嵌入式系統(tǒng)的內(nèi)存資源有限及中低端移動終端的硬件配置較低,無法預(yù)裝類似J2ME等對終端內(nèi)存及配置較高的軟件平臺,應(yīng)用程序擴展能力遠遠低于智能終端,因此,所有的第三方應(yīng)用必須通過與系統(tǒng)集成才能使用,這大大制約了應(yīng)用軟件的開發(fā)和使用。首次適配內(nèi)存分配策略可有效地管理系統(tǒng)內(nèi)存,通過提高分配和回收的速度提高系統(tǒng)運行效率,保證內(nèi)存分配和釋放的公平性,此外,利用虛擬函數(shù)表機制有效解決加載機制中關(guān)鍵問題。該動態(tài)加載機制有效提高加載器運行加載能力,很好解決中低端移動終端應(yīng)用加載技術(shù)問題。
動態(tài)加載是系統(tǒng)進行動態(tài)擴展和在線升級的一種實現(xiàn)方法,目前關(guān)于動態(tài)加載機制研究已經(jīng)起步,也出現(xiàn)了各種各樣的動態(tài)加載實現(xiàn)方式,主要由兩類:一是利用Java技術(shù),在嵌入式操作系統(tǒng)上實現(xiàn)一個Java虛擬機,通過該虛擬機來加載各類Java應(yīng)用程序[3]。二是重定位裝入目標程序,這種方式的實現(xiàn)與操作系統(tǒng)的結(jié)構(gòu)和硬件環(huán)境緊密關(guān)聯(lián),不同操作系統(tǒng)的加載機制一般是不一樣的。但該類加載的核心問題都是系統(tǒng)API的調(diào)用[4]。
本文所討論的動態(tài)加載機制是基于第二種實現(xiàn)方式的,由于該種實現(xiàn)方式與軟硬件環(huán)境息息相關(guān),不同的操作系統(tǒng)會有不同的加載機制[5]。本文所設(shè)計的動態(tài)加載機制是針對嵌入式領(lǐng)域的,利用虛擬函數(shù)表的機制實現(xiàn)很好地解決了系統(tǒng)API的調(diào)用這個核心問題。該動態(tài)加載機制基于C開發(fā),所占容量小,功能豐富,是其他加載機制所無法比擬的。
為實現(xiàn)把目標模塊以相應(yīng)的文件格式加載到內(nèi)存,加載器中的加載模塊應(yīng)具備分配并初始化內(nèi)存空間,建立堆棧段等功能。在模塊加載系統(tǒng)中,每個目標模塊被加載至已初始化空間并在那里被鏈接,加載模塊通過加載接口將目標模塊加載至內(nèi)存。該模塊的設(shè)計需要考慮內(nèi)存分配及系統(tǒng)函數(shù)調(diào)用問題。
鑒于嵌入式系統(tǒng)的實時性、可靠性、有效性對內(nèi)存管理提出的要求,采用比較合理的內(nèi)存分配策略,顯著地提高內(nèi)存資源的利用率。
該內(nèi)存分配算法基本思想是:定義兩個鏈表,一個為空閑鏈表,來管理內(nèi)存中的空閑塊,另一個為分配鏈表,用來管理已經(jīng)分配的內(nèi)存塊,如圖1所示。每當有分配請求時,系統(tǒng)會搜尋空閑鏈表直到找到一個符合內(nèi)存請求的空閑塊,同時相應(yīng)更新兩個鏈表;內(nèi)存釋放過程為:搜尋分配鏈表,找到需釋放的內(nèi)存塊,將此內(nèi)存塊從分配鏈表中進行刪除,與此同時空閑鏈表也會相應(yīng)更新。
圖1 內(nèi)存分配策略
系統(tǒng)在分配一個內(nèi)存塊時,會先順序搜索空閑鏈表,進而更新兩個鏈表。而順序搜索最壞情況下需要搜索整個鏈表,在一般情況下搜索節(jié)點數(shù)接近于鏈表總節(jié)點數(shù)一半。
定義T1為在最壞情況時分配一個內(nèi)存塊所需耗費的時間,T2為分配一個內(nèi)存塊平均耗費時間,N為空閑鏈表中空閑節(jié)點數(shù)目,L為已分配內(nèi)存塊鏈表長度。采用遍歷節(jié)點數(shù)來表示時間。計算結(jié)果如下所示:
由式1、2可知,當分配一個內(nèi)存塊時,在最壞情況下需要遍歷整個空閑鏈表節(jié)點,平均掃描節(jié)點也接近整個空閑鏈表節(jié)點數(shù)的一半。在釋放一個內(nèi)存塊時,也需順序搜尋分配鏈表來查找待釋放的內(nèi)存塊。因為空閑鏈表是順序的,必須白掃描整個空閑鏈表以確定待釋放的內(nèi)存塊放置于空閑鏈表中的位置,所以釋放分配塊涉及到兩個鏈表搜索。定義T3為最壞情況釋放一個內(nèi)存塊所花費的時間,T4為釋放一個內(nèi)存塊平均耗費的時間,則結(jié)果如下:
由以上可知,不管是在分配空間或是釋放空間,最壞情況下的耗時和平均耗時都依賴于鏈表長度。
該算法實際上為一種排序算法,即將所有小內(nèi)存塊放在空閑表的起始部分。系統(tǒng)運行過程中,所需動態(tài)內(nèi)存視目標程序大小而定,由于加載的程序大小一般限制在60KB以下,該內(nèi)存大小相對于空閑內(nèi)存塊而言算是小內(nèi)存塊,處于空閑鏈表起始位置,搜尋起來比較方便,其受鏈表長度影響較小。事實證明加載模塊采用該算法能極大提高內(nèi)存分配有效性。
嵌入式系統(tǒng)中的應(yīng)用程序開發(fā)是基于該系統(tǒng)或平臺的,加載器的設(shè)計可以使應(yīng)用開發(fā)與底層系統(tǒng)獨立開來,但仍不可避免會用到系統(tǒng)API。當前的應(yīng)用程序是開發(fā)者使用SDK(軟件開發(fā)包)開發(fā)的,就像系統(tǒng)不知道應(yīng)用程序的地址一樣,應(yīng)用程序也不知道系統(tǒng)的函數(shù)地址。SDK也可以提供系統(tǒng)API的每個地址,但隨著系統(tǒng)的不斷升級,會導(dǎo)致每個函數(shù)的鏈接地址是不固定的,這將導(dǎo)致SDK及應(yīng)用程序也需同時升級,這種程序的運行方式是沒有意義的。
SDK使用的是運行平臺的接口聲明,應(yīng)用程序調(diào)用真正的運行平臺接口,也就是在開發(fā)過程中使用的是平臺的接口聲明,在運行時應(yīng)用程序使用真正的二進制接口,在二進制層面調(diào)用接口函數(shù)。所以必須將接口聲明和接口實現(xiàn)在二進制層面進行分離。
考慮到以上問題,本文使用了虛擬函數(shù)表的機制。虛擬函數(shù)表,即虛表,虛表中存儲的是指向平臺函數(shù)的指針,在程序加載時給這個表函數(shù)指針賦初值,應(yīng)用程序通過這個表來調(diào)用平臺函數(shù)。
虛擬函數(shù)表工作機制為:根據(jù)目標平臺函數(shù)定義虛擬函數(shù)表結(jié)構(gòu),對虛擬函數(shù)表指針賦值,完成初始化工作,定義指向虛擬函數(shù)表的指針,實現(xiàn)函數(shù)之間地址傳遞。自定義接口宏,與平臺函數(shù)一一對應(yīng),接受虛擬函數(shù)表函數(shù)指針的值。位置無關(guān)應(yīng)用程序通過接口宏使用平臺函數(shù),平臺函數(shù)對應(yīng)相應(yīng)虛表中的表項。虛表中的每一項對應(yīng)的是指向相應(yīng)平臺函數(shù)的指針,通過指針所指地址調(diào)用平臺函數(shù)。
這種方式很好地實現(xiàn)了平臺函數(shù)與自定義接口之間在二進制層面上的地址傳遞。這個虛擬函數(shù)表可以隨著需求的增加而進行無限的擴大。
在應(yīng)用開發(fā)時,使用接口函數(shù)地址表,全局變量地址表。在加載器運行時,初始化此表。當程序加載運行時作為參數(shù)動態(tài)傳入應(yīng)用程序。
本文的研究成果用C語言編程實現(xiàn),在帶有MT 6225芯片組,分辨率為240×320的手機(Bird D717)上進行驗證。經(jīng)多次測試,如表1所示,有效的動態(tài)加載機制使加載器在終端ROM上只占75KB,遠遠低于J2ME平臺所占的600KB,運行時RAM所占的50KB相對于J2ME也要小許多,非常適合在移動終端系統(tǒng)上使用。應(yīng)用程序編譯生成的二進制的原生代碼,程序加載到內(nèi)存后,直接可以運行,較J2ME的先編譯成字節(jié)碼,再在虛擬機中解釋執(zhí)行的方式,在速度上有一定的優(yōu)勢。由于采用C語言開發(fā),使得該加載器的加載速度只為0.5s,增強了應(yīng)用運行的流暢性。此外,該動態(tài)加載器可以提供較為豐富的功能。
表1 兩類加載器性能指標比較
本文主要研究了移動終端系統(tǒng)動態(tài)加載機制的原理和過程,所采用的動態(tài)加載機制是應(yīng)用從零開始的動態(tài)加載機制,有效解決加載過程中內(nèi)存分配及系統(tǒng)函數(shù)調(diào)用等關(guān)鍵問題,很好地完成模塊加載至內(nèi)存及從內(nèi)存中卸載等操作。
基于該動態(tài)加載機制開發(fā)的軟件平臺,可使中低端移動終端也能像智能終端那樣將新的應(yīng)用程序直接安裝于終端設(shè)備的存儲卡上直接運行?;谖闹刑岢龅膭討B(tài)加載機制設(shè)計的動態(tài)加載器有著J2ME不可比擬的優(yōu)勢,具有良好的應(yīng)用價值。
[1]Nagamatsu L.Runtime Software Reorganization by Traditional OS Features[J].International Symposium on Principles of Software Evolution,2000,38(17):311-315.
[2]張和君,張躍.Linux動態(tài)鏈接機制研究及應(yīng)用[J].計算機工程,2006,32(11):64-66.
[3]楊偉,羅蕾.嵌入式系統(tǒng)中的模塊動態(tài)加載技術(shù)[J].單片機與嵌入式系統(tǒng)應(yīng)用,2005,23(11):8-10.
[4]程步奇,尹寶林.可動態(tài)擴展的嵌入式操作系統(tǒng)[J].小型微型計算機系統(tǒng),2003,24(2):216-219.
[5]張墩華,劉建.Java動態(tài)類加載機制及其應(yīng)用[J].計算機工程與設(shè)計,2004,25(3):432-435.
Research of Dynamic Loading Mechanism on Mobile Terminal CHEN Ping,ZHENG Xing-bin,HE Jia-ming,JIA De-xiang
(Instituteof Communication,Ningbo University,Ningbo Zhejiang315211,China)
With development ofmobile terminal systems,expansion capability of applications has already become basic demand,low-endmobile term inal system urgently need onemechanism which make system addmodules dynamically at runtime available.In this paper,amethod ofmemory allocation and a dynamic loadingmechanism based on structure of virtual function table is proposed,providingmethod of loadingof applications.It is proved that loader based on themechanism has features of small space occupied,fastspeed of running,stable performance.
mobile terminal system;memory allocation;virtual function table;dynamic loading
TP311.5
A
1001-9146(2010)05-0077-04
2010-07-20
國家重大專項核高基資助項目(ZX01039-001-002-004、ZX03001-016、ZX03004-005);科技部公共服務(wù)平臺創(chuàng)新基金資助項目(C26243314159);浙江省科技計劃資助項目(C31107);國際科技合作資助項目(DFA12120)
陳平(1985-),男,浙江紹興人,在讀研究生,通信終端核心應(yīng)用軟件技術(shù).