專利名稱:一種基于微核操作系統的應用程序動態加載方法
技術領域:
本發明涉及一種基于微核操作系統的應用程序動態加載方法。
背景技術:
近年來,隨著技術的不斷進步,手機、PDA、 MP3、 PMP等移動手持設備上增 加了越來越多的功能。對于開發人員來說,每增加一個功能,就意味著增加若干 的應用程序。而移動手持式設備中所有的應用程序都要通過內存來執行。因此, 如何最大程度地合理利用內存就成為軟件開發人員的關鍵問題。
目前已有的技術方案是-
PC智能操作系統方面Windows上有微軟的基于PE格式的動態模塊方案(如
dll動態鏈接庫,exe可執行文件);Unix/Linux上有公開規范的基于ELF格式動
態共享方案(如so動態共享文件,bin可執行文件)。
嵌入式智能操作系統如WinCE, ulinux也實現了模塊的動態加載技術。 以上動態加載方法一個共性是都需要基于支持麗U (Memory Management
Unit,內存管理部件)的操作系統,而這是普通微核操作系統(包括nucleus在內)
所不具備的。
目前在移動手持設備中較為通用的微核操作系統(nucleus/ucos/threadx…) 內核本身只能靜態加載所有的應用程序。靜態加載應用程序會導致兩個嚴重的后 果第一,應用程序越來越多,內存的需求越來越大,也因此導致了終端產品的 成本越來越高;第二, 一旦某個應用需要改動,就需要對整個系統重新進行調試 和測試,極大地延長了產品的開發周期。
發明內容
為克服上述不足,本發明的目的在于提供一種基于微核操作系統的應用程序 動態加載方法,通過在微核操作系統(nucleus/ucos/threadx…)中引入動態加載 方法,對應用程序實現動態加載。
為完成上述發明目的,本發明采取的技術方案是
一種基于微核操作系統的應用程序動態加載方法,它主要包括以下步驟
3a. 解析目標程序的格式,計算并分配該模塊中代碼段和數據段所需要的內 存大小;
b. 拷貝代碼段和數據段到該內存中;
c. 根據目標文件的重定位信息,確定需要修改地址的符號;
d. 從符號表和字符串表査出需要修改的符號的原始偏移;
e. 計算該符號的實際運行地址;
f. 將符號的實際運行地址填充到目標程序。
其中,步驟a在對目標程序的解析過程中,可以將目標程序分成若干段: 代碼段、數據段等。拷貝到內存時,段內的數據在內存空間上必須是連續的;而 段與段之間在內存空間上可以不連續。這種處理方式可以減少應用程序對內存空 間尤其是大塊連續的內存空間的需求。另外,當系統的其他應用程序再次調用已 經加載了的子程序時,如果該子程序屬于全局模塊,那么代碼段和數據段均可以 共享。
對于多模塊的應用程序的動態加載,上述的步驟d,步驟e和步驟f可以延遲 到程序運行時才執行,不需要在程序的加載過程中就執行。
而應用程序的卸載只需要釋放在該程序加載過程時分配的資源和模塊的映 像空間內存就可以了。
本發明的應用,大大減少了系統對內存的需求,無需基于有虛擬內存技術的 操作系統支持。此外,每個應用程序也只需關注自身的開發和測試,升級后的應 用程序直接覆蓋原文件即可啟用;而不同的應用程序間僅通過接口來耦合,有效 地提高了開發效率,降低了開發的復雜度。
圖1為應用程序動態加載過程的示意圖。
具體實施例方式
下面結合圖1對本發明的實現過程做具體闡述。<formula>formula see original document page 5</formula>
使用GCC編譯器將上述源碼編譯成ELF目標模塊A.so。
以下是目標程序的加載過程 a.解析目標程序的格式,計算并分配該模塊中代碼段和數據段所需要的內存大 小;
(1)首先解析目標模塊A.so文件,分析出它的節表分布信息
凡是編譯成公開標準的ELF目標文件,不管編譯器是開源的GCC還是商業化 的ADS,這些目標文件總是會大體如表l所示 表l目標文件格式表-
Win32 PEUnix ELF
DOS頭ELF頭
PE頭程序頭
格式節表節表
節l數據節l數據
節N數據節N數據
在解析ELF目標文件時,首先察看它的ELF頭是否匹配標準定義的內容,然 后從程序頭中獲知該目標模塊的代碼存放在目標文件的那個偏移位置和總長度。 接著讀取節表。 一般目標文件的節表會指出該文件內容中存在多少個節,每個節 存放的是什么內容,該節從何處偏移開始,到何處偏移結束。通過解析這個節表 數據,可以得到目標模塊A. so的節表信息如下
假設模塊的源碼為A.c:
gb_d3tal = 9; gb一bssl;
t- t表2目標模塊A. SO的節表:
Sections:
Idx BN3附 -hashSize 00,他cFile off 0,0094
C0",150
2.dynstt*B 50,0310
3 rel -got
-fel -pit 朋,B咖8
■ pit
6-text0 C咖003e0
-d3ta 肌,鵬2c
8 got00,530
9.dynamic 48
10.bss,005110
11-St3Cl<
140B,200,哪30
15 .str ,00的c M,aa0
說明
表2中表頭Size表示該節的數據長度,File off表示某個節的數據內容在 目標文件中何處開始偏移,
.hash表示模塊內引用的各種符號的一個hash索引表數據節; .dynsym, sym都是表示模塊內各種符號信息的數據節; ' .dynstr, str都是表示模塊內各種符號的名字字符串的數據節; .rel. got, . rel. pit都是模塊內各種符號或數據重定位信息的數據節; .plt, . text都是模塊的代碼數據節; .data, .bss都是模塊的數據節;
.got是存放模塊引用的各種符號的實際地址的一個數據節;
6.dynamic是表示模塊內部一些動態信息的數據節。
其中本發明需要用到的代碼段對于A.so而言包括.pH, .text, data, .got 4個節表;數據段包括.bss l個節表;
(2) 由表2中的信息可以計算出
代碼段的長度=0x20+0x4c+0x4+0xl8=0x88 數據段的長度=0x4
(3) 動態分配代碼段內存和數據段內存,長度分別為0x88和0x4, 假設分配的內存地址分別為code_addr和bss_addr.
b. 拷貝代碼段和數據段到該內存中;
把.plt, .text, .data, . got節的內容拷貝到代碼段內存;把.bss節的內 容拷貝到數據段內存。拷貝到內存時,段內的數據在內存空間上必須是連續的; 而段與段之間在內存空間上可以不連續,這樣可以減少應用程序對內存空間尤其 是大塊連續的內存空間的需求。
另外,當系統的其他應用程序再次調用已經加載了的子程序時,如果該子程 序屬于全局模塊,那么代碼段和數據段均可以共享。
c. 根據目標文件的重定位信息,確定需要修改地址的符號;
對于A. so而言重定位信息包括.rel.got, . rel. pit 2個節表,' 從表2中可以得知,這兩個節表的開始位置分別位于偏移0x3a8和0x3b8,從目 標文件A. so拷貝這些偏移位置的數據示意,其中最右側的數據是左側二進制內 容的匯編解析可讀文本,內容如表3所示,這2個節表內容的數據存放格式都是 一樣的,每個重定位信息包括8個字節,前4個字節指的是目標程序中對應的哪 個地址的數據需要修改,后4個字節指的是該需修改地址對應的內容是哪個符 號。
如表3所示,其中一個重定位信息3a8: 00000544和3ac :00001115包括 8個字節,前4個字節3a8: 00000544,指的是目標程序中對應00000544這個地 址的數據需要修改,后4個字節,比如3ac :00001115,指的是該需修改地址對 應的內容的符號為00001115。 表3重定位信息節表00000338 <-rel—got>: 3a8: 44 33C: ,01115 3b0: ,005110 3b": ,01b1S
B80003b8 <-r~el-plt>: 3b8: 咖BB53c 3bc: ,01916
下面對這表3中的2個節表.rel. got和.rel. pit各分析一個重定位信息為例。
表4. rel. got節表
,柳38 <-rel-got>: 3a8:
33C: ,01115
表4中,該重定位信息表示目標程序偏移0x544處內容需修改,該內容,即 目標文件中偏移為0x544處的數據,應該填充節表.dynsyra中的第0x11個符號 解析后的實際運行地址。
說明3ac: 00001115;只用其中前6個比特位000011。 表5 . rel. pit節表
0,咖8《rel-plt>: 3b8: BB,53c 3bc: 0,1916
表5中,該重定位信息表示目標程序偏移0x53c處內容需修改,該內容,即 目標文件中偏移為0x53c處的數據,應該填充節表.dynsym中的第0x19個符號 解析后的實際運行地址。
i兌明:3bc: 00001916;只用其中前6個比特位000019。
d.從符號表和字符串表査出需要修改的符號的原始偏移;
符號表和字符串表分別指的是.dynsym和.dynstr,符號表.dynsym的內容如 表6所示
表6. dynsym符號表
8260 264 268 26c
2e0: 2e4: 2e8: 2ec:
,08029 000順e0
00070012
表6中,每個符號信息,比如260: 00000031 264: 000005b0 268: 00000004 26c: OOObOOll,第一個4字節00000031表示它的字符串索引,第二個4字節 000005b0表示它的實際地址偏移,第四個4字節OOObOOll中前2個字節000b 表示該符號所在的節表。
因為該目標模塊中每個符號信息的長度為0x10,
所以第0x11個符號的位置=0x150+0x11*0x10=0x260,其中,0x150表示 第0x11個符號在目標文件中0x150處開始偏移,該值可以從表2的符號 表.dynsym對應的File off字段值獲得。對應表6可以査出,第0x11個符號的 實際地址偏移為0x5b0。根據000b,從表2中可以看到從0算起,第0x0b個節 表是.bss節,所以該符號屬于.bss段。
第0xl9個符號的位置=0xl50+0xl9*0xl0=0x2e0,對應表6可以査出,該 符號的實際地址偏移為0x3e0,根據0007,從表2中可以看到從0算起,第0x06 個節表是.text節,所以該符號屬于.text段。
表7. dynstr字符串表 00000310《dynstr>:
0000031011: 00 5F 44 5941 49 43 00 5F 47 42 41 ; .一DYN.AHIC ,一GLOBA
00000320h: 4C 5F 46 46 53 45 54 5F 54 " 42 4C 45 5F 00 ; L一OITSET T:BLE—.
00000330h: 67 62 5F 64 61 74 61 31 00 6D 79 66 75 6E 63 31 : gb—datal§rny:euncl
00000340h: 00 6"7 62 5F 62 "73 73 31 00 76 6D 65 5F 6D 61 69 ; . gb—bssl .vrne—肺i
00000350h: 6E 00 5F 65 74 65 78 74 00 5F 65 64 61 74 61 00 J n. etext. edsta.
由表7得出第Oxll個符號對應的字符串是gb一bssl,第0x19個符號對應的 字符串是myfuncl。e. 計算該符號的實際運行地址;
根據前面步驟a所分配的內存地址,可以解析出符號的實際地址, 符號gb—bssl實際地址=0x5b0+bss_addr 符號myfuncl實際地址=0x3e0+code—addr
f. 將符號的實際運行地址填充到目標程序; 根據步驟a,對于
偏移0x544處應填充第Oxll個符號gb—bssl的實際運行地址, 偏移0x53c處應填充第0x19個符號myfuncl的實際運行地址, 這些偏移實際上位于.got節,如表8所示; 表8.got節表
B,053tl《got>: 530: ,00548
53c: 咖003cO
最終的修改是
地址0x544+code—addr處內容修改為Ox5bO+bss—addr 地址0x53c+code—addr處內容修改為Ox3eO+code—addr
g. 解析導出符號的實際運行地址;
從符號表和字符串表導出API函數的地址,它們的內容如表9所示-表9. sym節表
OOOOOBaO《sym>:
alO: bl)i)00045
al4: 00000420
al8: 0001000c
ale: 00070012
其中,每個符號信息中第一個4字節表示它的字符串索引,第二個4字節表 示它的實際地址偏移,第4個字節中前2個字節表示該符號所在的節表。
遍歷符號表和字符串表,査詢導出函數vmejnain符號,如表10所示,得出第0x17個符號對應的是vme_main,該符號偏移為0x420,且根據0007,可以從 表2查出該符號屬于.text段。 表10 . str表
<formula>formula see original document page 11</formula>
428: eaffffe8 b 3d8 <ni(f|unc1-0x18>
最后由表11得出該符號的運行實際導出地址- 0x420+code—addr。 h.運行模塊函數;
由于已經導出了接口函數vme_main的實際運行地址,可以運行模塊函數。
本發明對于多模塊的應用程序的動態加載,上述的步驟d,步驟e和步驟f可 以延遲到程序運行時才執行,不需要在程序的加載過程中就執行。.
而應用程序的卸載只需要釋放在該程序加載過程時分配的資源和模塊的映 像空間內存就可以了。
權利要求
1、一種基于微核操作系統的應用程序動態加載方法,其特征在于,它包含以下步驟a. 解析目標程序的格式,計算并分配該模塊中代碼段和數據段所需要的內存大小;b. 拷貝代碼段和數據段到該內存中;c. 根據目標文件的重定位信息,確定需要修改地址的符號;d. 從符號表和字符串表查出需要修改的符號的原始偏移;e. 計算該符號的實際運行地址;f. 將符號的實際運行地址填充到目標程序。
2、 根據權利要求1所述的一種基于微核操作系統的應用程序動態加載方法, 其特征在于,所述的步驟a中,在對目標程序的解析過程中,先將目標程序分成 若干段,拷貝到內存時,段內的數據在內存空間上必須是連續的,而段與段之間 在內存空間上不連續。
3、 根據權利要求2所述的一種基于微核操作系統的應用程序動態加載方法, 其特征在于,當系統的其他應用程序再次調用已經加載了的子程序時,如果該子 程序屬于全局模塊,那么代碼段和數據段均可以共享。
4、 根據權利要求l所述的一種基于微核操作系統的應用程序動態加載方法, 其特征在于,對于多模塊的應用程序的動態加載,所述的步驟d,步驟e和步驟f 延遲到程序運行時才執行,不需要在程序的加載過程中就執行。
全文摘要
本發明公開了一種基于微核操作系統的應用程序動態加載方法,包括以下步驟解析目標程序的格式,計算并分配該模塊中代碼段和數據段所需要的內存大小;拷貝代碼段和數據段到該內存中;根據目標文件的重定位信息,確定需要修改地址的符號;從符號表和字符串表查出需要修改的符號的原始偏移;計算該符號的實際運行地址;將符號的實際運行地址填充到目標程序。本發明大大減少了系統對內存的需求,無需基于有虛擬內存技術的操作系統支持。此外,每個應用程序也只需關注自身的開發和測試,升級后的應用程序直接覆蓋原文件即可啟用;而不同的應用程序間僅通過接口來耦合,有效地提高了開發效率,降低了開發的復雜度。
文檔編號G06F9/445GK101470619SQ20081000371
公開日2009年7月1日 申請日期2008年1月15日 優先權日2007年12月29日
發明者張木軍, 胡勝發, 藍彩萍, 趙俊化 申請人:安凱(廣州)軟件技術有限公司