專利名稱::一種手機嵌入式系統(tǒng)中動態(tài)加載的方法
技術領域:
:本發(fā)明涉及無線通信
技術領域:
,尤其涉及一種增強手機嵌入式系統(tǒng)加載功能的方法。
背景技術:
:傳統(tǒng)的手機嵌入式系統(tǒng)(例如ARM、Linux、uClinux、WinCE、PalmOS、Symbian、eCos、uC0S-II、VxWorks、pS0S、Nucleus、ThreadX、Rtems、QNX、INTEGRITY、0SE、CExecutive等系統(tǒng))都是把程序全部燒入只讀存儲器(ROM)中,手機在FLASH上加載并運行程序。動態(tài)加載功能目前只有智能機操作系統(tǒng)(SYMBIAN、WINDOWSMOBILE)才有,采用實時操作系統(tǒng)的手機平臺(例如基于MIPS的RTOS平臺)不具備動態(tài)加載功能。因此,程序的使用受到FLASH大小的限制,并且若程序員需要更新程序,則只能全部更新,而無法做到部分地更新。要解決上述問題,目前市面上有一種系統(tǒng)高通的BREW,但是BREW必須配套高通專門的芯片才能使用。因此,手機開發(fā)業(yè)界存在一種技術需求提供一種手機嵌入式系統(tǒng)中動態(tài)加載的方法,使得實時操作系統(tǒng)具備動態(tài)加載功能。
發(fā)明內(nèi)容本發(fā)明的目的是提供一種手機嵌入式系統(tǒng)中動態(tài)加載的方法,包含如下步驟編譯應用程序,將應用程序獨立編譯為一個程序文件,程序文件描述了程序文件所支持的處理器架構及節(jié)頭表所在的位置;加載程序文件,通過節(jié)頭表讀出指令及只讀數(shù)據(jù)節(jié)、初始化的全局變量節(jié)和未初始化的全局變量節(jié)在程序文件中的位置,將指令及只讀數(shù)據(jù)節(jié)、初始化的全局變量節(jié)和未初始化的全局變量節(jié)加載到內(nèi)存的適當位置即實現(xiàn)程序的動態(tài)加載;初始化運行環(huán)境,將堆棧和堆的配置參數(shù)傳遞給應用程序,重構^rt—stackheap—init()函數(shù);參數(shù)替換,當執(zhí)行初始化運行環(huán)境步驟至函數(shù)—rt—init—stackheap()時,用加載器傳入的參數(shù)替換_rt—init—stackheap()函數(shù);繼續(xù)初始化,用加載器傳入的參數(shù)繼續(xù)初始化程序運行環(huán)境步驟;生成目標代碼,將應用程序生成為ROPI(READONLYPOSITIONINDEPENDENT,只讀位置無關)和RWPI(READWRITEPOSITIONINDEPENDENT,讀寫位置無關)代碼模式;調(diào)用宿主函數(shù),首先將宿主函數(shù)名稱傳遞給符號表函數(shù),符號表函數(shù)將宿主函數(shù)的地址返回給應用程序,應用程序將宿主函數(shù)的入口參數(shù)填寫完畢后跳轉至函數(shù)地址,即完成調(diào)用宿主函數(shù)的過程;中斷C運行時庫的退出部分流程,完成程序文件的動態(tài)加載過程。在本發(fā)明的其中一個實施例中,加載應用程序的步驟包含如下步驟讀入程序文件頭部的加載信息;根據(jù)加載信息計算程序加載后所需耍使用的內(nèi)存容量;根據(jù)加載信息將程序加載到內(nèi)存中;初始化傳遞給程序的參數(shù)列表,將參數(shù)列表復制到程序的參數(shù)區(qū);跳轉到程序的入口地址。本發(fā)明的優(yōu)點是使手機的實時操作系統(tǒng)具有動態(tài)加載功能。下面結合附圖,通過對本發(fā)明的具體實施方式的詳細描述,將使本發(fā)明的技術方案及其他有益效果顯而易見。圖l為本發(fā)明手機嵌入式系統(tǒng)中動態(tài)加載的方法流程圖;圖2為本發(fā)明中加載程序文件的工作流程圖。具體實施例方式為了更進一步了解本發(fā)明的特征,請參閱以下有關本發(fā)明的詳細說明與附圖,然而所附圖式僅提供參考與說明之用,并非用來對本發(fā)明的保護范圍加以限制。如圖l所示,為本發(fā)明方法的流程圖。首先101程序開始執(zhí)行,然后執(zhí)行102編譯應用程序;編譯應用程序將應用程序獨立編譯為一個程序文件,主流的程序文件格式有ELF(ExecutableandLinkableFormat)、a.out(UNIXv5標準)、PE(PortableExecutable,MicrosoftWindows專用格式)。ARM公司提供的ADS所生成的程序文件格式是ELF,ELF相對于平面結構的a.out格式有著更好的擴展性和平臺無關性,相對于Windows專用的PE格式,ELF能夠更好地支持異構平臺。ELF文件的格式如下表所示其文件頭部的ELFheader描述了程序文件所支持的處理器架構及節(jié)頭表(Sectionheadertable)所在的位置。ELFheaderProgramheadertable.text.rodate.dataSectionheadertable之后執(zhí)行103,由加載器加載程序文件;加載程序文件時,首先為只讀段和讀寫段分配內(nèi)存,這部分4內(nèi)存用于保存代碼與數(shù)據(jù),加載次序為ER_RO(代碼及只讀數(shù)據(jù))、ER一RW(初始化的全局變量)、ER一ZI(未初始化的全周變量)。程序和中間件使用同一個堆棧,中間件分配一塊連續(xù)內(nèi)存作為程序的堆,程序的動態(tài)內(nèi)存分配在堆中實現(xiàn)。通過節(jié)頭表讀出ER—RO(指令及只讀數(shù)據(jù)節(jié))、ER—RW(初始化的全局變量)和ER一ZI(未初始化的全局變量)在程序文件中的位置,將這些節(jié)加載到內(nèi)存的適當位置即可實現(xiàn)程序文件的動態(tài)加載。程序文件加載后的內(nèi)存映像如圖3所示。ER一RO被加載到上表中的只讀段,ERJW和E1LZI被依次加載到上表中的讀寫段,堆和堆棧的分配由加載器負責。之后執(zhí)行步驟104,初始化運行環(huán)境。程序加載完畢后,初始化運行環(huán)境。初始化運行環(huán)境包括堆和堆棧的初始化。堆用于保存動態(tài)分配的內(nèi)存,堆棧在函數(shù)調(diào)用時用于保存臨時變量及保護現(xiàn)場。根據(jù)ARMCRUNTIME(C語言運行時庫,這是C語言鏈接到程序中的一組系統(tǒng)代碼)規(guī)范,堆及堆棧初始化必須重構一rt—stackheapjnitO函數(shù)。這個函數(shù)的默認以ARM的SEMIHOSTING實現(xiàn),由于大多數(shù)手機開發(fā)平臺都沒有實現(xiàn)SEMIHOSTING,因此需要重構該函數(shù)。由于堆棧和堆是由VRE的加載器實現(xiàn)的,而一rt—stackheapjnit()函數(shù)在被加載程序中,所以加載器必須把堆棧和堆的配置參數(shù)通過某種方式傳遞給應用程序。參數(shù)至少包括堆和堆棧配置、宿主函數(shù)符號表函數(shù)。傳遞方式有兩種,一是通過堆棧傳遞,二是通過共享內(nèi)存?zhèn)魉?。由于ADS在不同編譯參數(shù)下會鏈接不同的目標庫,而堆棧的分配和目標庫有關,因此用堆棧傳遞會降低系統(tǒng)可移植性,所以VRE采用共享內(nèi)存?zhèn)鬟f參數(shù)方式。被傳遞的參數(shù)被存放在堆以下的128字節(jié)中,應用程序中的一rt一stackheap—init()函數(shù)通過這塊內(nèi)存獲取加載器傳遞過來的參數(shù)。獲得參數(shù)后,__rt—stackheapjnit()按照ARM的約定把堆和堆棧的配置參數(shù)通過R0R3寄存器返回給CRUNTIME(C語言運行時庫,這是C語言鏈接到程序中的一組系統(tǒng)代碼),這樣即重構了一p—stackheapjnit(),也即修改了該函數(shù)的默認實現(xiàn),其重構后,按照新的流程執(zhí)行。之后生成目標代碼;為了支持程序的動態(tài)加載,應用程序必須以ROPI(READONLYPOSITIONINDEPENDENT,只讀位置無關)和RWPI(READWRITEPOSITIONINDEPENDENT,讀寫位置無關)(ReadOnly/ReadWritePositionIndependent)模式生成。ADS的ARMCC編譯器通過加入-apcs/ROPI(ReadOnlyPositionIndependent,只讀位置無關)/RWPI(ReadWritePositionIndependent,讀寫位置無關)參數(shù)編澤代碼,ARMLINK加入-ROPI(ReadOnlyPositionIndependent,只讀位置無關)—RWPI(ReadWritePositionIndependent,讀寫位置無關)參數(shù)生成程序文件。支持ROPI(READONLYPOSITIONINDEPENDENT,只讀位置無關)禾flRWPI(READWRITEPOSITIONINDEPENDENT,讀寫位置無關)代碼采用了基于PC和SB(STATICBASE,靜態(tài)基址寄存器)寄存器尋址方式,即對函數(shù)和只讀數(shù)據(jù)的尋址基于PC,而全局變量的尋址基于SB(STATICBASE,靜態(tài)華址寄存器)寄存器。這種尋址方式是ARMATPCS規(guī)定的,因此采用本方法完全符合ARM的標準,不需要另外開發(fā)編譯器和連接器。當執(zhí)行初始化至函數(shù)^rt—init一stackheap()時,執(zhí)行步驟105,用加載器傳入的參數(shù)替換—rtjnit—stackheap()函數(shù);然后執(zhí)行步驟106,用加載器傳入的參數(shù)繼續(xù)初始化程序運行環(huán)境。之后,執(zhí)行步驟107,執(zhí)行程序的咖in()函數(shù),也即調(diào)用宿主函數(shù)。宿主函數(shù)的地址通過符號表函數(shù)返回,當應用程序要調(diào)用一個系統(tǒng)函數(shù)時,首先把函數(shù)名稱傳遞給符號表函數(shù),符號表函數(shù)把這個函數(shù)的地址返回給應用程序,應用程序把系統(tǒng)函數(shù)的入口參數(shù)填寫完畢后跳轉至函數(shù)地址,即完成調(diào)用過程。程序文件執(zhí)行完畢后,即執(zhí)行步驟108,中斷C運行時庫的退出部分流程。因為如果讓C運行時庫繼續(xù)執(zhí)行下去,程序文件就會被強制退出,這樣加載就失敗了,所以必須執(zhí)行步驟108,將默認的流程中斷,才能完成程序文件的加載過程。109結束。如圖2所示,為本發(fā)明加載程序文件的工作流程圖。首先執(zhí)行201步驟,讀入程序文件頭部的加載信息;然后執(zhí)行步驟202,根據(jù)加載信息計算程序文件加載后所需要使用的內(nèi)存容量;步驟203根據(jù)加載信息將程序文件加載到內(nèi)存之中;步驟204初始化傳遞給程序的參數(shù)列表,將列表復制到程序的參數(shù)區(qū);205跳轉到程序的入口地址。權利要求1.一種手機嵌入式系統(tǒng)中動態(tài)加載的方法,其特征在于,包含如下步驟編譯應用程序,將該應用程序獨立編譯為一個程序文件,該程序文件描述了程序文件所支持的處理器架構及節(jié)頭表所在的位置;加載程序文件,通過節(jié)頭表讀出指令及只讀數(shù)據(jù)節(jié)、初始化的全局變量節(jié)和未初始化的全局變量節(jié)在程序文件中的位置,將該指令及只讀數(shù)據(jù)節(jié)、該初始化的全局變量節(jié)和該未初始化的全局變量節(jié)加載到內(nèi)存的適當位置即實現(xiàn)程序的動態(tài)加載;初始化運行環(huán)境,將堆棧和堆的配置參數(shù)傳遞給該應用程序,重構_rt_stackheap_init()函數(shù);參數(shù)替換,當執(zhí)行該初始化運行環(huán)境步驟至函數(shù)_rt_init_stackheap()時,用加載器傳入的參數(shù)替換_rt_init_stackheap()函數(shù);繼續(xù)初始化,用加載器傳入的參數(shù)繼續(xù)該初始化程序運行環(huán)境步驟;生成目標代碼,將該應用程序生成為ROPI(READONLYPOSITIONINDEPENDENT,只讀位置無關)和RWPI(READWRITEPOSITIONINDEPENDENT,讀寫位置無關)代碼模式;調(diào)用宿主函數(shù),首先將該宿主函數(shù)名稱傳遞給符號表函數(shù),該符號表函數(shù)將該宿主函數(shù)的地址返回給該應用程序,該應用程序將該宿主函數(shù)的入口參數(shù)填寫完畢后跳轉至函數(shù)地址,即完成該調(diào)用宿主函數(shù)的過程;中斷C運行時庫的退出部分流程,完成程序文件的動態(tài)加載過程。2.根據(jù)權利要求1所述的手機嵌入式系統(tǒng)中動態(tài)加載的方法,其特征在于,該加載程序文件的步驟包含如下步驟讀入程序文件頭部的加載信息;根據(jù)該加載信息計算程序加載后所需要使用的內(nèi)存容量;根據(jù)該加載信息將程序加載到內(nèi)存中;初始化傳遞給程序的參數(shù)列表,將該參數(shù)列表復制到程序的參數(shù)區(qū);跳轉到程序的入口地址。全文摘要本發(fā)明提供了一種手機嵌入式系統(tǒng)中動態(tài)加載的方法,包含如下步驟編譯應用程序;加載程序文件,通過節(jié)頭表讀出指令及只讀數(shù)據(jù)節(jié)、初始化的全局變量節(jié)和未初始化的全局變量節(jié)在程序文件中的位置;初始化運行環(huán)境;參數(shù)替換,當執(zhí)行該初始化運行環(huán)境步驟至函數(shù)_rt_init_stackheap()時,用加載器傳入的參數(shù)替換_rt_init_stackheap()函數(shù);繼續(xù)初始化;生成目標代碼;調(diào)用宿主函數(shù);中斷C運行時庫的退出部分流程,完成程序文件的動態(tài)加載過程。文檔編號H04W8/24GK101668283SQ20081004234公開日2010年3月10日申請日期2008年9月1日優(yōu)先權日2008年9月1日發(fā)明者胡鑄韜申請人:沃勤網(wǎng)絡科技(上海)有限公司