專利名稱:基于arm芯片的多個程序段同時運(yùn)行的動態(tài)加載方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種智能移動終端的程序加載相關(guān)技術(shù),尤其是涉及一種基于ARM芯片的多個程序段同時運(yùn)行的動態(tài)加載方法。
背景技術(shù):
移動終端的智能性是指:手機(jī)在不需要重新燒錄固件程序的情況下,通過執(zhí)行存儲在外部設(shè)備(例如TF卡、SD卡等)上的、或無線網(wǎng)絡(luò)下載(例如GPRS、WIFI等)得到的可擴(kuò)展手機(jī)原有功能的動態(tài)程序,以滿足手機(jī)更豐富、更定制化的用戶需求。一般而言,這是所謂“智能手機(jī)”的主要特征。目前解決移動終端智能性的技術(shù)方案主要有2個:( 一 ) JAVA虛擬機(jī)技術(shù)。JAVA虛擬機(jī)是著名的SUN公司經(jīng)多年積累所開發(fā)的一套虛擬機(jī)解決方案(現(xiàn)已被甲骨文公司收購),其特點是技術(shù)穩(wěn)定成熟,有豐富的第三方應(yīng)用程序支持,文檔配套齊全并擁有大量的開發(fā)人才;但是缺點也是非常明顯的,一是使用JAVA虛擬機(jī)要收取一筆昂貴的授權(quán)費(fèi)用,這對于很多規(guī)模不大的公司往往承擔(dān)不起;二是JAVA虛擬機(jī)由于執(zhí)行效率低下、消耗資源龐大,使得大多數(shù)配置較為低端的手機(jī)根本無法流暢運(yùn)行起來。( 二)傳統(tǒng)動態(tài)加載技術(shù)。事實上,正是考慮到JAVA虛擬機(jī)技術(shù)的局限性,移動終端業(yè)內(nèi)已經(jīng)出現(xiàn)一種稱為“動態(tài)加載”的技術(shù),該技術(shù)基于ARM芯片,可以將獨(dú)立開發(fā)的應(yīng)用程序通過動態(tài)加載的方式載入手機(jī)中運(yùn)行,從而達(dá)到擴(kuò)展手機(jī)功能的目的。然而目前這種傳統(tǒng)的動態(tài)加載技術(shù)實現(xiàn)方法有一個重大缺陷,就是這種方法要依賴ARM芯片的R9寄存器進(jìn)行重定位,這樣就無法實 現(xiàn)多個動態(tài)段的同時運(yùn)行,從而限制了技術(shù)的應(yīng)用價值,只能說采用這種技術(shù)的移動終端是“半智能”的。
發(fā)明內(nèi)容
本發(fā)明的目的就是為了克服上述現(xiàn)有技術(shù)存在的缺陷而提供一種基于ARM芯片的多個程序段同時運(yùn)行的動態(tài)加載方法。本發(fā)明的目的可以通過以下技術(shù)方案來實現(xiàn):一種基于ARM芯片的多個程序段同時運(yùn)行的動態(tài)加載方法,其特征在于,包括以下步驟:I)以指定源文件的用戶自定義函數(shù)為入口對源文件進(jìn)行編譯,并對編譯結(jié)果進(jìn)行兩次鏈接處理,得到兩個可執(zhí)行文件,分別為startup_0.elf和startup_l.elf ;2)對得到的兩個可執(zhí)行文件進(jìn)行比較分析后得到重定位表relocation.1is ;3)將其中一個可執(zhí)行文件startup_0.elf和重定位表relocation.1is壓縮并打包,生成動態(tài)程序startup, bin ;4)將動態(tài)程序startup, bin導(dǎo)入智能移動終端后,所述的智能移動終端中的ARM芯片將動態(tài)程序startup, bin中的startup_0.elf解包并分析,建立該動態(tài)程序startup.bin的RO、RW、ZI段的內(nèi)容;5)將動態(tài)程序startup, bin中relocation.1is解包,并根據(jù)該文件信息,結(jié)合R0、Rff+ZI段的首地址,針對RO段進(jìn)行重定位;6)將RO段首地址轉(zhuǎn)換為步驟I)中所指定的用戶自定義函數(shù)類型的函數(shù)指針,直接調(diào)用該函數(shù)指針,完成動態(tài)加載過程。所述的對編譯結(jié)果進(jìn)行兩次鏈接處理具體為:1)對編譯的結(jié)果進(jìn)行鏈接處理,鏈接時指定鏈接選項-rw-base為0xR)000000,得到鏈接后的可執(zhí)行文件startup_0.elf ;2)對編譯的結(jié)果進(jìn)行鏈接處理,鏈接時指定鏈接選項-rw-base為OxEOOOOOOO,得到鏈接后的可執(zhí)行文件startup_l.elf。所述的RW段為所有已經(jīng)初始化且不為O的變量,所述的ZI段為所有聲明但沒有初始化的變量,所述的RO段為所有邏輯代碼信息和只讀變量。與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點:將重定位表與可執(zhí)行文件能夠打包在一起,任意時刻需要運(yùn)行動態(tài)程序,只需根據(jù)重定位表進(jìn)行動態(tài)重定位即可,無需考慮系統(tǒng)寄存器狀態(tài)、更無需考慮其它動態(tài)程序的運(yùn)行狀況,從而穩(wěn)定地實現(xiàn)了多程序任意時刻同時運(yùn)行。
圖1為本發(fā)明的編譯階段流程圖;圖2為本發(fā)明的運(yùn)行階段流程圖;圖3為本發(fā)明的具體應(yīng)用流程圖。
具體實施例方式下面結(jié)合附圖和具體實施例對本發(fā)明進(jìn)行詳細(xì)說明。實施例對于針對ARM7系列CPU、且只有一個文件(Example, c)的工程,常規(guī)來講如果需要動態(tài)加載地執(zhí)行它,需要在編譯時:armcc-c-apcs/ropi/rwpi/interwork-cpu ARM7EJ-S Example, c編譯后得到Example, ο文件,然后在鏈接時:armlink-rop1-rwp1-output startup, elf鏈接后得到可執(zhí)行文件startup, elf。得到的這個startup, elf之所以可以動態(tài)加載地執(zhí)行,關(guān)鍵在于ropi和rwpi兩個選項,它們可以分別把RO段以及RW段編譯成為“位置無關(guān)”的程序。但是這個rwpi有個問題,就是它用到了 R9寄存器;換句話說,如果指定了 rwpi選項,編譯鏈接器就會默認(rèn)將R9寄存器中的值作為程序運(yùn)行的首地址處理一一也就是,所有的變量地址訪問時,事實上都是相對于R9寄存器進(jìn)行偏移;我們只要運(yùn)行時將R9寄存器的值更改為動態(tài)段的首地址即可。如果對于單個程序,這種執(zhí)行方式?jīng)]有問題;但是如果涉及到幾個程序同時運(yùn)行(例如頂軟件在后臺運(yùn)行時,還要運(yùn)行其他程序),這種方式顯然有問題了,原因是R9只有一個。因此為解決這個問題,我們不使用rwpi選項,采用本發(fā)明所提出的動態(tài)加載方法,具體如圖1、圖2、圖3所示:(A)編譯時指定選項,注意不再指定rwpi (見圖1:編譯階段):armcc-c-apcs/ropi/interwork-cpu ARM7EJ-S Example, c(B)鏈接時,注意要鏈接2次:第一次:armlink-rop1-rw-baseOxFOOOOOOOExample.0-output startup_0.elf第二次:armlink-rop1-rw-baseOxEOOOOOOOExample.0-output startup_l.elf可以看到,通過指定-rw-base選項(強(qiáng)制指定數(shù)據(jù)段的起始位置為相應(yīng)值),并2次鏈接分別指定不同的值(0xF0000000、OxEOOOOOOO),得到2個不同的ELF文件(見圖1:
第一次鏈接和第二次鏈接)。(C)根據(jù)上面所提到的內(nèi)容,⑶中通過鏈接選項的不同得到了 2個不同的ELF文件(startup_0.elf和startup_l.elf),而它們的鏈接選項也僅僅是-rw-base不同。因此就可以得出結(jié)論,其實startup_0.elf和startup_l.elf無論從邏輯、變量、符號等任何方面看都是相同的,唯一的不同,就是每一個數(shù)據(jù)段的位置(一個以0處0000000作為起始值,一個以O(shè)xEOOOOOOO作為起始值)都會有一個“E”和“F”的差別。(D)然后可編寫一個簡單的工具程序,讀取startup_0.elf和startup_l.elf這2個文件并分析,比較它們所有不同的地方并記錄,就能夠得到一個可作為運(yùn)行時重定位使用的表,該重定位表將引導(dǎo)加載器去重定位動態(tài)程序的所有變量段(見圖1:得到重定位表)O(E)綜合上面編譯過程,我們得到了一個可動態(tài)運(yùn)行的ELF文件(使用startup_0.elf 或 startup_l.elf 都可以),記為 “startup, elf” ;一個指導(dǎo) ELF 文件重定位的表,記為“relocation, lis”;將這2個文件以某種方式捆綁在一起,打包成為一個可執(zhí)行程序,記為“startup, bin”。(F)手機(jī)終端運(yùn)行“startup, bin”時,首先解析“startup, elf”中的RW段、ZI段、RO段,得到它們的具體數(shù)據(jù)信息,如圖2所示。在ARM程序中,所有“已經(jīng)初始化且不為O的變量”都算作RW段,所有“聲明但沒有初始化的變量”都算作ZI段,所有“邏輯代碼信息”、“只讀變量”內(nèi)容都算作RO段。動態(tài)加載器在得到這3個段信息之后,首先創(chuàng)建與RO段大小相匹配的內(nèi)存(該內(nèi)存首地址記為PTR_R0),并把RO段的內(nèi)容拷貝到該段內(nèi)存中;然后創(chuàng)建與RW+ZI段大小相匹配的內(nèi)存(該內(nèi)存首地址記為PTR_RWZI),并把RW段的內(nèi)容拷貝到PTR_RWZI首地址處(拷貝RW段的大小),而PTR_RWZI中剩余的ZI段大小的內(nèi)容全部清空成O。(G)動態(tài)地建立好RW段、ZI段、RO段數(shù)據(jù)之后,事實上在RO段中已經(jīng)包含了可直接運(yùn)行的代碼信息,唯一有問題的地方,就是RO段中所有對于可讀寫變量的引用(RW+ZI段)地址都是編譯時指定的錯誤數(shù)據(jù),并不能適用于這種動態(tài)建立RW+ZI段的情況。因此,此時需要讀入重定位表relocation.1is文件,根據(jù)該文件中指定的信息,遍歷RO段中每一個可重定位的位置,將其修改為與PTR_RWZI相關(guān)的地址信息。具體過程如下:例如對 于RO段中一個重定位位置,其4字節(jié)值可能是“0xF0123456”,該值的意義表示在RO段程序運(yùn)行過程中的某個時刻需要讀取“0xF0123456”地址處的數(shù)據(jù)信息;然而事實上,“0xR)000000”這個數(shù)據(jù)并非程序原本試圖引用的,而是我們在鏈接階段人為地強(qiáng)制加上的鏈接選項(-rw-base 0xR)000000),程序試圖真正引用的有效數(shù)據(jù)是“0x123456”。因此,對于“0xR)123456”這個數(shù)據(jù)值,應(yīng)該做如下處理:ADDR_VALUE = 0xF0123456&0x00FFFFFF ;// 得到有效的數(shù)據(jù)ADDR_VALUE = TEMP_VALUE+PTR_RWZI ;// 得到真正的地址可以看出,“有效地址+實際的RWZI頭部”所得到的地址信息就是真正需要得到的、重定位之后的地址,將ADD_VALUE寫回重定位位置,則完成對RO段的一次重定位操作。(H)所有重定位操作完成之后,由于一開始使用了 -first、-entry等選項指定某函數(shù)(例如類型為FUNCT10N_PTR)作為入口函數(shù),則RO段的首地址PTR_R0就是這個入口函數(shù)的首地址,則進(jìn)行:FUNCT10N_PTR func = (FUNCT10N_PTR) PTR_R0 ;// 強(qiáng)制轉(zhuǎn)換func (...) ;// 調(diào)用入口這樣即 可完成對動態(tài)段程序的調(diào)用操作。綜上所述,本發(fā)明采用指定不同的鏈接選項-rw-base的二次鏈接方式,比較分析得出有價值的重定位表;在動態(tài)程序運(yùn)行時建立運(yùn)行段并進(jìn)行重定位。這種動態(tài)加載方法不會依賴寄存器R9,移植性優(yōu)秀,兼容ARM7及之后的各個ARM版本,對于架構(gòu)智能平臺、操作系統(tǒng)有著非常重要的意義。
權(quán)利要求
1.一種基于ARM芯片的多個程序段同時運(yùn)行的動態(tài)加載方法,其特征在于,包括以下步驟: 1)以指定源文件的用戶自定義函數(shù)為入口對源文件進(jìn)行編譯,并對編譯結(jié)果進(jìn)行兩次鏈接處理,得到兩個可執(zhí)行文件,分別為startup_0.elf和startup_l.elf ; 2)對得到的兩個可執(zhí)行文件進(jìn)行比較分析后得到重定位表relocation.1is ; 3)將其中一個可執(zhí)行文件startup_0.elf和重定位表relocation.1is壓縮并打包,生成動態(tài)程序startup, bin ; 4)將動態(tài)程序startup,bin導(dǎo)入智能移動終端后,所述的智能移動終端中的ARM芯片將動態(tài)程序startup, bin中的startup_0.elf解包并分析,建立該動態(tài)程序startup, bin的R0、RW、ZI段的內(nèi)容; 5)將動態(tài)程序startup,bin中relocation.1is解包,并根據(jù)該文件信息,結(jié)合R0、RW+ZI段的首地址,針對RO段進(jìn)行重定位; 6)將RO段首地址轉(zhuǎn)換為步驟I)中所指定的用戶自定義函數(shù)類型的函數(shù)指針,直接調(diào)用該函數(shù)指針,完成動態(tài)加載過程。
2.根據(jù)權(quán)利要求1所述的一種基于ARM芯片的多個程序段同時運(yùn)行的動態(tài)加載方法,其特征在于,所述的對編譯結(jié)果進(jìn)行兩次鏈接處理具體為: 1)對編譯的結(jié)果進(jìn)行鏈接處理,鏈接時指定鏈接選項-rw-base為0xR)000000,得到鏈接后的可執(zhí)行文件startup_0.elf ; 2)對編譯的結(jié)果進(jìn)行 鏈接處理,鏈接時指定鏈接選項-rw-base為OxEOOOOOOO,得到鏈接后的可執(zhí)行文件startup_l.elf。
3.根據(jù)權(quán)利要求1所述的一種基于ARM芯片的多個程序段同時運(yùn)行的動態(tài)加載方法,其特征在于,所述的RW段為所有已經(jīng)初始化且不為O的變量,所述的ZI段為所有聲明但沒有初始化的變量,所述的RO段為所有邏輯代碼信息和只讀變量。
全文摘要
本發(fā)明涉及一種基于ARM芯片的多個程序段同時運(yùn)行的動態(tài)加載方法,包括以下步驟1)以指定源文件的用戶自定義函數(shù)為入口對源文件進(jìn)行編譯,并對編譯結(jié)果進(jìn)行兩次鏈接處理,得到兩個可執(zhí)行文件,分別為startup_0.elf和startup_1.elf;2)對得到的兩個可執(zhí)行文件進(jìn)行比較分析后得到重定位表relocation.lis;3)將其中一個可執(zhí)行文件startup_0.elf和重定位表relocation.lis壓縮并打包,生成動態(tài)程序startup.bin;4)將動態(tài)程序startup.bin導(dǎo)入智能移動終端后,所述的智能移動終端中的ARM芯片將動態(tài)程序startup.bin中的startup_0.elf解包并分析,建立該動態(tài)程序startup.bin的RO、RW、ZI段的內(nèi)容。與現(xiàn)有技術(shù)相比,本發(fā)明具有穩(wěn)定地實現(xiàn)了多程序任意時刻同時運(yùn)行等優(yōu)點。
文檔編號G06F9/45GK103246524SQ201210022599
公開日2013年8月14日 申請日期2012年2月1日 優(yōu)先權(quán)日2012年2月1日
發(fā)明者馮嵩 申請人:上海野火網(wǎng)絡(luò)科技有限公司