專利名稱::實現(xiàn)程序動態(tài)加載的方法和生成映射文件的方法及設(shè)備的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計算機(jī)領(lǐng)域,尤其涉及一種在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法、一種生成基于嵌入式系統(tǒng)的映像文件的方法以及一種嵌入式設(shè)備。
背景技術(shù):
:在ARM(AdvancedRISCMachines,—類微處理器的通稱)的集成開發(fā)環(huán)境中,一個程序的只讀的代碼段和常量被稱作RO(Readonly)段;可讀寫的全局變量和靜態(tài)變量被稱作RW(ReadWrite)段;RW段中要被初始化為零的變量被稱為ZI(Zerolnit)段。對于嵌入式系統(tǒng)而言,程序映像都是存儲在Flash存儲器等一些非易失性器件中的,而在運行時,程序中的RW-險必須重新加載到可讀寫的存儲卡,如RAM(RandomAccessMemory,隨才幾存儲器),或者系統(tǒng)文件中。在嵌入式系統(tǒng)中動態(tài)加載程序一般是指在嵌入式系統(tǒng)燒寫到Flash后,系統(tǒng)可以通過讀入存儲卡或者文件系統(tǒng)來加載外部新生成的映像程序文件,即類似于在WINDOWS系統(tǒng)(微軟公司開發(fā)的窗口圖形界面的操作系統(tǒng))下執(zhí)行一個可執(zhí)纟于文件。目前嵌入式領(lǐng)域中可以自身實現(xiàn)程序的動態(tài)加載的操作系統(tǒng)有Symbian,WINCE,Palm等,然而現(xiàn)有中的嵌入式操作系統(tǒng)不支持全局/靜態(tài)變量,如高通的BREW(BinaryRuntimeEnvironmentforWireless,無線二進(jìn)制運行環(huán)境)平臺基于的REX(ROUTEEXTENSION,路由擴(kuò)展)系統(tǒng),雖然支持BIN(Plainbinary,二進(jìn)制文件)格式的映像文件動態(tài)加載,但是其加載的BIN格式不支持全局/靜態(tài)變量,即當(dāng)加載涉及BIN格式用到的全局/靜態(tài)變量時,程序會出現(xiàn)執(zhí)行異常,導(dǎo)致加載失敗。
發(fā)明內(nèi)容本發(fā)明實施例在于提供一種在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法,一種生成基于嵌入式系統(tǒng)的映像文件的方法以及一種嵌入式設(shè)備,支持全局/靜態(tài)5變量,解決了當(dāng)加載涉及映像文件用到的全局/靜態(tài)變量時程序會出現(xiàn)執(zhí)行異常,導(dǎo)致加載失敗的問題。為了達(dá)到上述技術(shù)效果,本發(fā)明實施例提出了一種在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法,包括如下步驟為基于嵌入式系統(tǒng)進(jìn)行加載的映像文件分配內(nèi)存,所述映像文件中設(shè)有指定所述映像文件進(jìn)行加載時的入口地址的入口函數(shù);將所述映像文件的內(nèi)容讀入所述分配的內(nèi)存;所述映像文件的內(nèi)容讀入完成后,執(zhí)行所述映像文件的指令代碼,并根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行所述映像文件中的全局/靜態(tài)變量的重新映射,完成程序的動態(tài)加載。相應(yīng)地,本發(fā)明實施例還公開了一種生成基于嵌入式系統(tǒng)的映像文件的方法,包括步驟編譯器編譯映像文件時設(shè)置映像文件的入口函數(shù),所述入口函數(shù)指定所述映^象文件進(jìn)行加載時的入口地址。相應(yīng)地,本發(fā)明實施例還公開了一種嵌入式設(shè)備,其包括分配模塊,用于為基于嵌入式系統(tǒng)進(jìn)行加載的映像文件分配內(nèi)存,所述映像文件中設(shè)有指定所述映像文件進(jìn)行加載時的入口地址的入口函數(shù);讀入模塊,用于將所述映像文件的內(nèi)容讀入所述分配模塊分配的內(nèi)存;加載模塊,執(zhí)行所述映像文件的指令代碼,并根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行映i象文件中的全局/靜態(tài)變量的重新映射,完成程序的動態(tài)加載。實施本發(fā)明實施例,通過對映像文件中的全局/靜態(tài)變量進(jìn)行重新映射,實現(xiàn)了動態(tài)加載映像文件支持全局/靜態(tài)變量,解決了當(dāng)加載涉及映像文件用到的全局/靜態(tài)變量時程序會出現(xiàn)執(zhí)行異常,導(dǎo)致加載失敗的問題,更加便于對生成的映像文件的測試,滿足了用戶的需求。圖1是本發(fā)明實施例的在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法流程圖;圖2是本發(fā)明實施例的在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載BIN格式的映像文件的方法流程圖3是本發(fā)明實施例的動態(tài)加載中分配內(nèi)存的狀態(tài)圖4是本發(fā)明實施例的在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載ELF格式的映像文件的方法流程圖5是本發(fā)明實施例的嵌入式設(shè)備的結(jié)果示意圖;圖6是本發(fā)明實施例的分配模塊的結(jié)構(gòu)示意圖;圖7是本發(fā)明實施例的加載模塊的結(jié)構(gòu)示意圖。具體實施例方式本發(fā)明實施例提供了一種在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法,一種生成基于嵌入式系統(tǒng)的映像文件的方法以及一種嵌入式設(shè)備,支持全局/靜態(tài)變量,解決了當(dāng)加載涉及映像文件用到的全局/靜態(tài)變量時程序會出現(xiàn)執(zhí)行異常,導(dǎo)致加載失敗的問題。下面結(jié)合附圖詳細(xì)說明本發(fā)明的優(yōu)選實施例。請參閱圖1,圖1示出了本發(fā)明實施例的在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法流程圖,包括如下步驟步驟S101:為基于嵌入式系統(tǒng)進(jìn)行加載的映4象文件分配內(nèi)存;具體地,所述映像文件中設(shè)有指定所述映像文件進(jìn)行加載時的入口地址的入口函數(shù),為基于嵌入式系統(tǒng)進(jìn)行加載的映像文件分配預(yù)留數(shù)據(jù)段的內(nèi)存空間、指令代碼段的內(nèi)存空間以及函數(shù)地址表空間步驟S102:將所述映像文件的內(nèi)容讀入所述分配的內(nèi)存;具體地,將所述映像文件的內(nèi)容讀入分配的指令代碼段的內(nèi)存空間。步驟S103:所述映像文件的內(nèi)容讀入完成后,執(zhí)行所述映像文件的指令代碼,并根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行所述映像文件中的全局/靜態(tài)變量的重新映射,完成程序的動態(tài)加載。需要說明的是,在嵌入式系統(tǒng)中對映像文件進(jìn)行動態(tài)加載前,需要由終端用戶、廠商等生成進(jìn)行加載的映像文件,具體地,在使用編譯器編譯映像文件時設(shè)置映像文件的入口函數(shù),所述入口函數(shù)指定所述映像文件進(jìn)行加載時的入口地址,然后由嵌入式設(shè)備對生成的映像文件按照上述實施例進(jìn)行動態(tài)加載。通過上述實施例,對映像文件中的全局/靜態(tài)變量進(jìn)行重新映射,實現(xiàn)了動態(tài)加載映像文件支持全局/靜態(tài)變量,解決了當(dāng)加載涉及映像文件用到的全局/靜態(tài)變量時程序會出現(xiàn)執(zhí)行異常,導(dǎo)致加載失敗的問題,更加便于對生成的映像文件的測試,滿足了用戶的需求。需要說明的是,本發(fā)明實施例中的嵌入式系統(tǒng)為基于ARM體系的嵌入式系統(tǒng),系統(tǒng)中對映像文件進(jìn)行動態(tài)加載前,需要生成基于ARM體系,并且與地址無關(guān)的BIN格式、ELF(ExecutableandLnkingFormat,可執(zhí)行映4象和連接格式)格式或者基于此兩種格式的衍生格式的映像文件,然后對生成的映像文件進(jìn)行動態(tài)加栽。下面分別以BIN格式的映像文件的動態(tài)加載以及ELF格式的映像文件的動態(tài)加載為例,詳細(xì)說明本發(fā)明實施例的一種在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法。1、BIN格式的映^f象文件的動態(tài)加載終端用戶、廠商等生成基于ARM體系并且與地址無關(guān)的BIN格式映像文件,與地址無關(guān)指模塊內(nèi)外部函數(shù)、全局/靜態(tài)變量等的尋址與鏈接階段由ADS集成開發(fā)環(huán)境的ARMLINKER選項中指定的ROBASE和RWBASE無關(guān),ROBASE和RWBASE分別用于告知連接器RO段和RW端的連接基地址,具體地,在生成過程中可以利用ADS(ARMDeveloperSuite,ARM開發(fā)工具集)編譯、鏈接的一些選項,如ropi、rwpi等,或者利用ELF轉(zhuǎn)換器,設(shè)置BIN映像文件的入口地址的入口函數(shù),如ModMain,使生成的BIN映像文件程序中的所有函數(shù)在進(jìn)行動態(tài)加載時可以相對于一個特定的入口函數(shù)(如上述的ModMain)進(jìn)行相對地址尋址,即BIN映像文件的起始地址為ModMain的地址,其他非本模塊(即模塊外部)的函數(shù)都可以在ModMain上的函數(shù)地址表來進(jìn)行尋址。下面結(jié)合圖2示出的本發(fā)明實施例的在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載BIN格式的映像文件的方法流程圖,進(jìn)一步說明本發(fā)明的一種在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法,包括如下步驟步驟S201:為進(jìn)行加載的BIN映像文件分配內(nèi)存;具體地,為進(jìn)行加載的所述BIN映像文件分配預(yù)留數(shù)據(jù)段的內(nèi)存空間、指令代碼段的內(nèi)存空間以及函數(shù)地址表空間,如圖3示出的本發(fā)明實施例的動態(tài)加載中分配內(nèi)存的狀態(tài)圖,為BIN映像文件分配適量的RAM空間的內(nèi)存,其大小為預(yù)留數(shù)據(jù)段的內(nèi)存空間、指令代碼段的內(nèi)存空間以及函數(shù)地址表空間的總和,其中預(yù)留數(shù)據(jù)段大小可定義成一個比較大的值M,如32K,其起始地址可以為A;函數(shù)地址表為一個4Bytes大小的表指針加上4Bytes的間隔區(qū),其起始地址可以為B,自B地址而上皆為BIN映像文件的預(yù)留數(shù)據(jù)段的內(nèi)存空間;為BIN映像文件的二進(jìn)制內(nèi)容分配起始地址為C的讀入地址,地址C以下存放8BIN映像文件的內(nèi)容,在C-8地址處(即B地址處)放置系統(tǒng)函數(shù)表指針。步驟S202:將所述BIN映像文件的內(nèi)容讀入所述分配的內(nèi)存;具體地,將BIN映像文件的內(nèi)容讀入分配的指令代碼段的內(nèi)存空間,即將BIN映像文件的內(nèi)容從地址C處載入到RAM中。步驟S203:所述BIN映像文件的內(nèi)容讀入完成后,執(zhí)行所述BIN映像文件的指令代碼,并根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行所述映像文件中的全局/靜態(tài)變量的重新映射,完成程序的動態(tài)加載。具體地,所述BIN映像文件的內(nèi)容讀入完成后,才艮據(jù)所述入口地址以及分配的預(yù)留數(shù)據(jù)段的地址信息,設(shè)置將映像文件中的全局/靜態(tài)變量從所述入口地址映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間的映射程序,系統(tǒng)CPU從地址C處開始執(zhí)行BIN映像文件中的指令代碼,在進(jìn)入BIN映像文件的入口地址的入口函數(shù)ModMain后調(diào)用所述映射程序,所述映射程序相當(dāng)于入口函^t調(diào)用的第一個子函數(shù),將映像文件中的全局/靜態(tài)變量映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間中,讓程序可以正常執(zhí)行,完成程序的動態(tài)加載。需要說明的是,上述實施例還包括,系統(tǒng)在執(zhí)行所述映像文件的指令代碼時,可以根據(jù)所述入口函數(shù)ModMain對BIN映像文件程序中的所有函數(shù)進(jìn)行相對地址尋址,其他非本^莫塊(即模塊外部)的函數(shù)都可以在ModMain上的函數(shù)地址表來進(jìn)行尋址,完成映像文件在加載中關(guān)于模塊內(nèi)部/外部函數(shù)的動態(tài)尋址。需要說明的是,在生成BIN映像文件的過程中,可以在BIN映像文件的頭部添加分配信息,所述分配信息為自定義的固定結(jié)構(gòu)的一個頭部信息,分配信息包括所述映像文件的指令代碼段的起始信息以及大小信息、數(shù)據(jù)段的起始信息以及大小信息等。在系統(tǒng)對生成的BIN映像文件分配預(yù)留數(shù)據(jù)段的內(nèi)存空間、指令代碼段的內(nèi)存空間時,具體地,系統(tǒng)可以根據(jù)所述分配信息中指令代碼段的信息以及數(shù)據(jù)段的信息分別計算需要分配的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間,然后為BIN映像文件分配計算出的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間,因此系統(tǒng)通過所述分配信息可以得知動態(tài)加載時需要耗用的RAM空間,節(jié)省了RAM空間。2、ELF格式的映像文件的動態(tài)加載終端用戶、廠商等生成基于ARM體系并且與地址無關(guān)的ELF格式映像文件,具體地,可以〗吏用ADS編譯工具,可以通過armcc/armcpp/tcc/tcpp編譯生成.o格式OBJ文件,然后使用armlink與系統(tǒng)SDK鏈接生成.axf格式的ELF文件,在生成過程中可以利用ADS編譯、鏈接的一些選項,如ropi、rwpi等,或者利用ELF轉(zhuǎn)換器,設(shè)置ELF映像文件的入口地址的入口函數(shù),如ModMain,使生成的ELF映像文件程序中的所有函數(shù)在進(jìn)行動態(tài)加載時可以相對于一個特定的入口函數(shù)(如上述的ModMain)進(jìn)行相對地址尋址,即ELF映像文件的起始地址為ModMain的地址,其他非本模塊(即模塊外部)的函數(shù)都可以在ModMain上的函數(shù)地址表來進(jìn)行尋址。另外,生成的ELF格式的映像文件含有固定的ELF頭部,可以根據(jù)所述ELF頭部的信息計算出ELF映像文件的數(shù)據(jù)段大小以及指令代碼段的大小。下面結(jié)合圖4示出的本發(fā)明實施例的在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加栽ELF格式的映像文件的方法流程圖,進(jìn)一步說明本發(fā)明的一種在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法,包括如下步驟步驟S401:為進(jìn)行加載的ELF映像文件分配內(nèi)存;具體地,為進(jìn)行加載的所述ELF映像文件分配預(yù)留數(shù)據(jù)段的內(nèi)存空間、指令代碼段的內(nèi)存空間以及函數(shù)地址表空間,與上述實施例為進(jìn)行加載的BIN映像文件分配內(nèi)存的過程類似,系統(tǒng)可以根據(jù)ELF映像文件的頭部信息計算需要分配的預(yù)留數(shù)據(jù)段的內(nèi)存空間,由ELF映像文件的大小減去ELF頭部的大小可以計算出需要分配的指令代碼段的內(nèi)存空間,然后為ELF映像文件分配計算出的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間。步驟S402:將所述ELF映像文件的內(nèi)容讀入所述分配的內(nèi)存;具體地,將ELF映像文件中ELF頭部以外的內(nèi)容讀入分配的指令代碼段的內(nèi)存空間,即將ELF映i象文件的內(nèi)容從指定的地址處載入到RAM中。步驟S403:所述ELF映像文件的內(nèi)容讀入完成后,執(zhí)行所述ELF映像文件的指令代碼,并根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行所述映像文件中的全局/靜態(tài)變量的重新映射,完成程序的動態(tài)加載。具體地,所述ELF映像文件的內(nèi)容讀入完成后,根據(jù)所述入口地址以及分配的預(yù)留數(shù)據(jù)段的地址信息,設(shè)置將映像文件中的全局/靜態(tài)變量從所述入口地址映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間的映射程序,系統(tǒng)CPU從地址C處開始執(zhí)行ELF映像文件中的指令代碼,在進(jìn)入ELF映像文件的入口地址的入口函數(shù)ModMain后調(diào)用所述映射程序,所述影射程序相當(dāng)于入口函數(shù)調(diào)用的第一個子函數(shù),將映像文件中的全局/靜態(tài)變量映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間中,讓10程序可以正常執(zhí)行,完成程序的動態(tài)加載。需要說明的是,上述實施例還包括,系統(tǒng)在執(zhí)行所述映像文件的指令代碼時,可以根據(jù)所述入口函數(shù)ModMain對ELF映像文件程序中的所有函數(shù)進(jìn)行相對地址尋址,其他非本模塊(即模塊外部)的函數(shù)都可以在ModMain上的函數(shù)地址表來進(jìn)行尋址,完成映像文件在加載中關(guān)于模塊內(nèi)部/夕卜部函數(shù)的動態(tài)尋址。需要說明的是,除了上述BIN格式和ELF格式的映像文件外,基于此兩種格式的衍生格式映像文件也可以通過上述實施例的方法實現(xiàn)程序的動態(tài)加載。下面結(jié)合圖5示出的本發(fā)明實施例的嵌入式設(shè)備的結(jié)果示意圖,詳細(xì)說明本發(fā)明的一種嵌入式設(shè)備的結(jié)構(gòu),包括分配模塊51,用于為基于嵌入式系統(tǒng)進(jìn)行加栽的映像文件分配內(nèi)存,所述映像文件中設(shè)有指定所述映像文件進(jìn)行加載時的入口地址的入口函數(shù);具體地,為基于嵌入式系統(tǒng)進(jìn)行加載的映像文件分配預(yù)留數(shù)據(jù)段的內(nèi)存空間、指令代碼段的內(nèi)存空間以及函數(shù)地址表空間。讀入^f莫塊52,用于將所述映像文件的內(nèi)容讀入分配模塊51分配的內(nèi)存;具體地,將所述映像文件的內(nèi)容讀入分配的指令代碼段的內(nèi)存空間。加載模塊53,執(zhí)行所述映像文件的指令代碼,并根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行映像文件中的全局/靜態(tài)變量的重新映射,完成程序的動態(tài)加載。需要說明的是,在嵌入式系統(tǒng)中對映像文件進(jìn)行動態(tài)加載前,需要由終端用戶、廠商等生成進(jìn)行加載的映像文件,具體地,在使用編譯器編譯映像文件時設(shè)置映像文件的入口函數(shù),所述入口函數(shù)指定所述映像文件進(jìn)行加載時的入口地址,然后由上述實施例中的嵌入式設(shè)備對生成的映像文件進(jìn)行動態(tài)加載。下面結(jié)合圖6示出的本發(fā)明實施例的分配模塊的結(jié)構(gòu)示意圖,進(jìn)一步說明本發(fā)明的一種嵌入式設(shè)備的結(jié)構(gòu),分配模塊51包括計算單元511,用于根據(jù)所述映射文件的頭部信息計算預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間,所述頭部信息含有所述映像文件的指令代碼段的起始信息以及大小信息、數(shù)據(jù)段的起始信息以及大小信息;分配子單元512,用于為所述映像文件分配所述計算單元計算出的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間。具體地,以BIN格式的映像文件的動態(tài)加載為例,在生成BIN映像文件的過程中,可以在BIN映像文件的頭部添加分配信息,所述分配信息為自定義的固定結(jié)構(gòu)的一個頭部信息,分配信息包括所述映像文件的指令代碼段的起始信息以及大小信息、數(shù)據(jù)段的起始信息以及大小信息等,計算單元511可以根據(jù)所述分配信息中指令代碼段的信息以及數(shù)據(jù)段的信息分別計算需要分配的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間,然后分配子單元512為BIN映像文件分配計算出的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間;以ELF格式的映像文件的動態(tài)加載為例,生成的ELF格式的映像文件含有固定的ELF頭部,計算單元511可以根據(jù)ELF映像文件的頭部信息計算需要分配的預(yù)留數(shù)據(jù)段的內(nèi)存空間,由ELF映像文件的大小減去ELF頭部的大小可以計算出需要分配的指令代碼段的內(nèi)存空間,然后分配子單元512為ELF映^f象文件分配計算出的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間。因此系統(tǒng)通過BIN映像文件中的分配信息或者ELF映像文件中的頭部信息可以得知動態(tài)加載時需要耗用的RAM空間,節(jié)省了RAM空間。下面結(jié)合圖7示出的本發(fā)明實施例的加載模塊的結(jié)構(gòu)示意圖,進(jìn)一步說明本發(fā)明的一種嵌入式設(shè)備的結(jié)構(gòu),加載模塊53包括執(zhí)行單元531,用于執(zhí)行讀入模塊52讀入的映像文件的指令代碼;設(shè)置單元532,用于根據(jù)所述入口地址以及分配模塊51分配的預(yù)留數(shù)據(jù)段的地址信息,設(shè)置將映像文件中的全局/靜態(tài)變量從所述入口地址映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間的映射程序;調(diào)用單元533,用于調(diào)用設(shè)置單元532"^殳置的映射程序,完成將映像文件中的全局/靜態(tài)變量映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間中。尋址單元534,用于當(dāng)執(zhí)行單元531執(zhí)行映像文件的指令代碼時,根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行函數(shù)的相對地址尋址。具體地,所述映像文件的內(nèi)容讀入完成后,設(shè)置單元532根據(jù)所述入口地址以及分配的預(yù)留數(shù)據(jù)段的地址信息,設(shè)置將映像文件中的全局/靜態(tài)變量從所述入口地址映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間的映射程序,執(zhí)^f亍單元531開始執(zhí)行BIN映像文件中的指令代碼,在進(jìn)入映像文件的入口地址的入口函數(shù)(如ModMain)后調(diào)用單元533調(diào)用所述映射程序,所述映射程序相當(dāng)于入口函數(shù)調(diào)用的第一個子函數(shù),將映像文件中的全局/靜態(tài)變量映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間中,讓程序可以正常執(zhí)行,完成程序的動態(tài)加載。另外,執(zhí)行單元531在執(zhí)行所述映像文件的指令代碼時,尋址單元534可以4艮據(jù)所迷入口函數(shù)ModMain對映像文件程序中的所有函數(shù)進(jìn)行相對地址尋址,其4也非本模塊(即才莫塊外部)的函數(shù)都可以在ModMain上的函數(shù)地址表來進(jìn)行尋址,完成映4象文件在加載中關(guān)于模塊內(nèi)部/外部函數(shù)的動態(tài)尋址。綜上所述,實施本發(fā)明實施例,通過在分配內(nèi)存空間之前計算需要分配的合適內(nèi)存空間,節(jié)省了RAM空間,通過生成基于ARM體系并且與地址無關(guān)的映像文件,在加載該映像文件時,對映像文件中的全局/靜態(tài)變量進(jìn)行重新映射,實現(xiàn)了動態(tài)加載映像文件支持全局/靜態(tài)變量,解決了當(dāng)加載涉及映像文件用到的全局/靜態(tài)變量時程序會出現(xiàn)執(zhí)行異常,導(dǎo)致加栽失敗的問題,更加便于對生成的映像文件的測試,滿足了用戶的需求。需要說明的是,通過以上的實施方式的描述,本領(lǐng)域的才支術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的硬件平臺的方式來實現(xiàn),當(dāng)然也可以全部通過硬件來實施。基于這樣的理解,本發(fā)明的技術(shù)方案對背景^f支術(shù)做出貢獻(xiàn)的全部或者部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機(jī)軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如ROM/RAM、磁碟、光盤等,包括若干指令用以使得一臺計算機(jī)設(shè)備(可以是個人計算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例或者實施例的某些部分所述的方法。以上所揭露的僅為本發(fā)明實施例中的一種較佳實施例而已,當(dāng)然不能以此來限定本發(fā)明之權(quán)利范圍,因此依本發(fā)明權(quán)利要求所作的等同變化,仍屬本發(fā)明所涵蓋的范圍。權(quán)利要求1、一種在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法,其特征在于,包括如下步驟為基于嵌入式系統(tǒng)進(jìn)行加載的映像文件分配內(nèi)存,所述映像文件中設(shè)有指定所述映像文件進(jìn)行加載時的入口地址的入口函數(shù);將所述映像文件的內(nèi)容讀入所述分配的內(nèi)存;所述映像文件的內(nèi)容讀入完成后,執(zhí)行所述映像文件的指令代碼,并根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行所述映像文件中的全局/靜態(tài)變量的重新映射,完成程序的動態(tài)加載。2、如權(quán)利要求l所述的方法,其特征在于,所述為基于嵌入式系統(tǒng)進(jìn)行加載的映像文件分配內(nèi)存的步驟包括為所述映像文件分配預(yù)留數(shù)據(jù)段的內(nèi)存空間、指令代碼段的內(nèi)存空間以及函數(shù)地址表空間。3、如權(quán)利要求2所述的方法,其特征在于,當(dāng)所述映像文件為二進(jìn)制文件BIN格式的映像文件時,所述映像文件的頭部含有分配信息,所述分配信息包括所述映像文件的指令代碼段的起始信息以及大小信息、數(shù)據(jù)段的起始信息以及大小信息,所述為所述映像文件分配預(yù)留數(shù)據(jù)段的內(nèi)存空間、指令代碼段的內(nèi)存空間的步驟包括根據(jù)所述分配信息計算預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間;為所述映像文件分配計算出的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間。4、如權(quán)利要求2所述的方法,其特征在于,當(dāng)所述映像文件為可執(zhí)行映像和連接ELF格式的映像文件時,所述為所述映像文件分配預(yù)留數(shù)據(jù)段的內(nèi)存空間、指令代碼段的內(nèi)存空間的步驟包括根據(jù)ELF格式的映像文件中的頭部信息計算預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間;為所述映像文件分配計算出的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間。5、如權(quán)利要求2所迷的方法,其特征在于,所述根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行映像文件中的全局/靜態(tài)變量的重新映射的步驟包括根據(jù)所述入口地址以及分配的預(yù)留數(shù)據(jù)段的地址信息,設(shè)置將映像文件中的全局/靜態(tài)變量從所述入口地址映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間的映射程序;調(diào)用所述映射程序,完成將映像文件中的全局/靜態(tài)變量映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間中。6、如權(quán)利要求l所述的方法,其特征在于,所述方法還包括執(zhí)行所述映像文件的指令代碼時,根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行函數(shù)的相對地址尋址。7、一種生成基于嵌入式系統(tǒng)的映像文件的方法,其特征在于,編譯器編譯映像文件時設(shè)置映像文件的入口函數(shù),所述入口函數(shù)指定所述映像文件進(jìn)行加載時的入口地址。8、如權(quán)利要求7所述的方法,其特征在于,當(dāng)所述映像文件為BIN格式的映像文件時,所述方法還包括編譯器編譯映像文件后,在所述映像文件的頭部添加分配信息,所述分配信息包括所述映像文件的指令代碼段的起始信息以及大小信息、數(shù)據(jù)段的起始信息以及大小信息。9、一種嵌入式設(shè)備,其特征在于,包括分配模塊,用于為基于嵌入式系統(tǒng)進(jìn)行加載的映像文件分配內(nèi)存,所述映像文件中設(shè)有指定所述映像文件進(jìn)行加載時的入口地址的入口函數(shù);讀入模塊,用于將所述映像文件的內(nèi)容讀入所述分配模塊分配的內(nèi)存;加載模塊,執(zhí)行所述映像文件的指令代碼,并根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行映像文件中的全局/靜態(tài)變量的重新映射,完成程序的動態(tài)加載。10、如權(quán)利要求9所述的嵌入式設(shè)備,其特征在于,所述分配模塊包括計算單元,用于根據(jù)所述映射文件的頭部信息計算預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間,所述頭部信息含有所述映像文件的指令代碼段的起始信息以及大小信息、數(shù)據(jù)段的起始信息以及大小信息;分配子單元,用于為所述映像文件分配所述計算單元計算出的預(yù)留數(shù)據(jù)段以及指令代碼段的內(nèi)存空間。11、如權(quán)利要求10所述的嵌入式設(shè)備,其特征在于,所述加載模塊包括執(zhí)行單元,用于執(zhí)行所述讀入模塊讀入的映像文件的指令代碼;設(shè)置單元,用于根據(jù)所述入口地址以及所述分配才莫塊分配的預(yù)留數(shù)據(jù)段的地址信息,設(shè)置將映像文件中的全局/靜態(tài)變量從所述入口地址映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間的映射程序;調(diào)用單元,用于調(diào)用所述設(shè)置單元設(shè)置的映射程序,完成將映像文件中的全局/靜態(tài)變量映射到所述預(yù)留數(shù)據(jù)段的內(nèi)存空間中。12、如權(quán)利要求11所述的嵌入式設(shè)備,其特征在于,所述加載模塊還包括尋址單元,用于當(dāng)所述執(zhí)行單元執(zhí)行映像文件的指令代碼時,根據(jù)所述入口函數(shù)指定的入口地址進(jìn)行函數(shù)的相對地址尋址。全文摘要本發(fā)明公開了一種在嵌入式系統(tǒng)中實現(xiàn)程序動態(tài)加載的方法,包括如下步驟為基于嵌入式系統(tǒng)進(jìn)行加載的映像文件分配內(nèi)存;將映像文件的內(nèi)容讀入所述分配的內(nèi)存;所述映像文件的內(nèi)容讀入完成后,執(zhí)行映像文件的指令代碼,并根據(jù)入口函數(shù)指定的入口地址進(jìn)行映像文件中的全局/靜態(tài)變量的重新映射,完成程序的動態(tài)加載。相應(yīng)地,本發(fā)明還公開了一種生成基于嵌入式系統(tǒng)的映像文件的方法以及一種嵌入式設(shè)備,通過實施本發(fā)明實施例,對映像文件中的全局/靜態(tài)變量進(jìn)行重新映射,實現(xiàn)了動態(tài)加載映像文件支持全局/靜態(tài)變量,解決了當(dāng)加載涉及映像文件用到的全局/靜態(tài)變量時程序會出現(xiàn)執(zhí)行異常,導(dǎo)致加載失敗的問題,更加便于對生成的映像文件的測試。文檔編號G06F9/445GK101661397SQ20081019818公開日2010年3月3日申請日期2008年8月29日優(yōu)先權(quán)日2008年8月29日發(fā)明者燕青洲申請人:宇龍計算機(jī)通信科技(深圳)有限公司