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