中國科學(xué)院軟件研究所 李彥峰 李麗穎山東農(nóng)村信用社聯(lián)合社 韓廣志金陵科技學(xué)院 閔 建
?
VxWorks實(shí)時操作系統(tǒng)模塊加載分析與加載速度優(yōu)化
中國科學(xué)院軟件研究所 李彥峰 李麗穎
山東農(nóng)村信用社聯(lián)合社 韓廣志
金陵科技學(xué)院 閔 建
【摘要】通過分析VxWorks系統(tǒng)符號表的生成過程發(fā)現(xiàn),整個系統(tǒng)的符號表生成是自動進(jìn)行的,這就導(dǎo)致系統(tǒng)會生成一些額外的符號信息。這些符號信息不僅會使得系統(tǒng)變得臃腫,而且會增加系統(tǒng)符號哈希表的沖突概率,從而降低模塊加載時符號解析的速度。本文主要介紹利用減小VxWorks實(shí)時操作系統(tǒng)符號表提高模塊加載速度。由于利用tornado環(huán)境編譯VxWorks系統(tǒng)的時候會自動生成系統(tǒng)的全部符號信息,會導(dǎo)致系統(tǒng)變得臃腫。同時也會使得downloadable型應(yīng)用程序在加載的時候符號解析過程時間復(fù)雜度提高。
【關(guān)鍵詞】符號表;downloadable;模塊加載;符號解析
隨著應(yīng)用程序?qū)?shí)時操作系統(tǒng)的需求越來越復(fù)雜,傳統(tǒng)的將所有的應(yīng)用程序編譯到大內(nèi)核的方式已不能滿足系統(tǒng)的需求。為了實(shí)現(xiàn)實(shí)時系統(tǒng)的靈活型,實(shí)時系統(tǒng)需要具備從外部加載模塊的功能;而加載過程涉及到模塊外部引入符號的解析。這就要求系統(tǒng)符號提供為模塊解析符號的功能,而系統(tǒng)符號表正是為實(shí)現(xiàn)這個功能而存在的。系統(tǒng)符號表用于建立符號名稱、類型和值之間的關(guān)系。其中,符號名稱為NULL結(jié)尾的任意字符串;類型為標(biāo)志各種符號的正數(shù);值是一個字符指針,用于保存符號在內(nèi)存中的地址。在模塊加載的時候,如果模塊中出現(xiàn)外部引入的符號,則可以通過模塊中外部引入的模塊名稱來查找與該符號對應(yīng)的實(shí)現(xiàn)地址。而系統(tǒng)符號表則提供符號名稱和符號地址的解析的橋梁,VxWorks正是通過符號表為downloadable型應(yīng)用程序提供API調(diào)用的實(shí)現(xiàn)以及系統(tǒng)全局變量使用。
1.1 符號表的作用
VxWorks系統(tǒng)的全局模塊加載函數(shù)loadModule函數(shù)實(shí)現(xiàn)加載VxWorks系統(tǒng)下可執(zhí)行的二進(jìn)制文件。在loadModule函數(shù)的調(diào)用流程中symFindByName函數(shù)用于downloadable型應(yīng)用程序的符號解析。每個downloadable型應(yīng)用程序中包含符號數(shù)據(jù)結(jié)構(gòu),在此數(shù)據(jù)結(jié)構(gòu)中包含外部引入符號以及這些符號在程序中被使用的地址,symFindByName函數(shù)根據(jù)外部引入符號的符號名稱查找該符號在內(nèi)存中的地址。符號表的每個符號項(xiàng)包含符號名稱、類型和值,符號項(xiàng)的值就是符號在內(nèi)存中的地址。因此,符號項(xiàng)的符號名稱經(jīng)過散列函數(shù)生成解析符號的關(guān)鍵字,解析成功之后,loadModule函數(shù)會根據(jù)downloadable型應(yīng)用程序自身包含的符號信息,將對應(yīng)的符號值填充到程序中對應(yīng)的地方。如果,解析不成功則會報錯,不過程序不會終止運(yùn)行。
symFindByName函數(shù)的實(shí)現(xiàn)在符號表函數(shù)庫symLib.c文件中,在這個文件中,定義sysSymTbl管理符號的哈希表。sysSymTbl符號哈希表實(shí)現(xiàn)對系統(tǒng)符號表的存儲管理,所以symFindByName的搜索過程依賴sysSymTbl系統(tǒng)符號哈希表中的哈希查找。symFindByName函數(shù)查找時,以符號項(xiàng)的符號名稱經(jīng)過哈希散列函數(shù)操作生成關(guān)鍵字搜索整個sysSymTbl哈希表。如果在哈希表中出現(xiàn)沖突,就會對沖突的哈希表項(xiàng)進(jìn)行鏈?zhǔn)剿阉?,直到找到符號?xiàng)或者到達(dá)鏈表的表尾。如果到達(dá)表尾還沒有找到符號項(xiàng)則會報錯,但是不會退出。
1.2 系統(tǒng)符號哈希表的建立
VxWorks系統(tǒng)先由bootRom完成,該部分完成VxWorks系統(tǒng)的加載。在bootRom將系統(tǒng)加載到內(nèi)存之后,整個系統(tǒng)的控制權(quán)轉(zhuǎn)交給VxWorks系統(tǒng)。VxWorks主要完成系統(tǒng)的初始化,這些操作都是在Root任務(wù)中實(shí)現(xiàn)的。Root任務(wù)調(diào)用函數(shù)usrRoot進(jìn)行系統(tǒng)的初始化,初始化過程通過調(diào)用symLib. c文件中的相應(yīng)函數(shù)對系統(tǒng)符號哈希表sysSymTbl的建立過程。建立過程中,符號名稱經(jīng)過哈希散列函數(shù)生成關(guān)鍵字。此關(guān)鍵字作為索引找到系統(tǒng)符號哈希表sysSymTbl中,并將符號項(xiàng)插入到索引到的系統(tǒng)符號哈希表項(xiàng)之后。如果在哈希表的建立過程中發(fā)生沖突,則以拉鏈法將所有的沖突符號項(xiàng)鏈接到索引到的關(guān)鍵字的系統(tǒng)符號哈希表項(xiàng)后面。
在系統(tǒng)符號哈希表sysSymTbl建表過程中,添加到的sysSymTbl中的符號項(xiàng)的生成依賴于編譯器的支持。如果在編譯VxWorks系統(tǒng)的時候添加了符號表的支持,那么在編譯的時候會利用makeSymTbl.exe工具生成symTbl.c文件。該文件當(dāng)中包含四個部分:第一個是包含的頭文件,第二個是利用編譯器提供的IMPORT語句,第三個是一個符號數(shù)組standTbl,第四個是第三個符號數(shù)組的數(shù)目standTblSize。其中,第二部分的IMPORT指令用于得到相應(yīng)的符號的地址,這些地址由編譯器在編譯時確定,并填充到第三部分的符號數(shù)組standTbl中的符號項(xiàng)的value成員變量中。系統(tǒng)符號哈希表正是通過standTbl中的符號項(xiàng)的符號名稱和value成員變量實(shí)現(xiàn)符號地址和符號名稱的對應(yīng)關(guān)系。如果系統(tǒng)符號哈希表中沒有添加相應(yīng)的符號項(xiàng),那么對該符號的解析過程就會失敗。但是,由于符號項(xiàng)在編譯的時候會放到生成的系統(tǒng)文件中的.data段中,所以過多符號項(xiàng)的存在會導(dǎo)致編譯出來的VxWorks系統(tǒng)文件變得臃腫。同時過多的符號項(xiàng)會增加系統(tǒng)符號哈希表sysSymTbl沖突發(fā)生的概率。而當(dāng)系統(tǒng)符號哈希表查找沖突時,就會以鏈表的形式進(jìn)行遍歷。整個系統(tǒng)的哈希表大小為2的8次冪,也就是256個哈希表項(xiàng)。這樣,當(dāng)出現(xiàn)大量的哈希表項(xiàng)時,就很容易引起沖突而進(jìn)行順序查找。
1.3 符號數(shù)組standTbl的生成
在tornado集成開發(fā)環(huán)境下編譯VxWorks時,新建bootable型工程會自動生成對應(yīng)makefile文件,該文件會引用rule.VxWorks文件中的生成規(guī)則生成符號表文件symTbl.c文件。在系統(tǒng)初始化時,系統(tǒng)會調(diào)用相關(guān)的函數(shù)將這個文件中的standTbl數(shù)組填充到系統(tǒng)的全局符號哈希表sysSymTbl中。然而,由于自動生成的符號數(shù)組standTbl中的符號項(xiàng)包含多余的符號信息,這樣就會增加系統(tǒng)符號哈希表的沖突概率。而downloadable型應(yīng)用程序在加載時需要解析自身從外部引入的符號,如果沖突就會導(dǎo)致搜索符號項(xiàng)的速度降低,從而間接導(dǎo)致downloadable型應(yīng)用程序加載速度過慢。
經(jīng)過上面的分析,減小符號表需要分三步進(jìn)行實(shí)施。第一,需要了解downloadable型應(yīng)用程序需要哪些外部的符號;第二,利用一些手工操作將symTbl.c文件中的不必需的符號項(xiàng)給刪除掉;第三,需要阻止在編譯VxWorks的時候自動生成symTbl.c的過程。以下是具體的實(shí)施過程:
首先利用tornado環(huán)境自動生成symTbl.c文件,該文件作為篩選的符號超集。自動生成的符號數(shù)組standTbl包括所有系統(tǒng)實(shí)現(xiàn)的符號的信息,把符號超集中刪除downloadable型應(yīng)用程序不必需的符號即可以實(shí)現(xiàn)減少系統(tǒng)符號哈希表的大小。然后利用生成的VxWorks系統(tǒng)目標(biāo)平臺下的nm程序的-u命令,導(dǎo)出downloadable型應(yīng)用程序的未定義符號。操作步驟為:nm –u application(application為downloadable型應(yīng)用程序的名稱),由于nm命令只是將結(jié)果輸出到控制臺上面,可以利用系統(tǒng)提供的重定位功能將其輸出重定位到特定文件中(約定文件名為a.txt)。這一步主要實(shí)現(xiàn)生成一個包含downloadable型應(yīng)用程序必需的符號名稱的文件。由于nm –u僅僅輸出符號的符號名稱,所以還需要一個修改過程。當(dāng)symTbl.c文件中的符號數(shù)組standTbl中的符號項(xiàng)的符號名稱出現(xiàn)在a.txt文件中時,則保留在原symTbl. c文件中,否則刪除standTbl中的符號項(xiàng),并且刪除symTb.c第二部分中與該符號項(xiàng)對應(yīng)的生成符號地址的語句,同時symTbl.c文件的第四部分符號數(shù)項(xiàng)計(jì)數(shù)自減1。經(jīng)過該操作后,symTbl.c文件僅包含downloadable類型應(yīng)用程序所必需的符號項(xiàng)。
經(jīng)過上面的修改之后,symTbl.c文件僅包含加載downloadable型應(yīng)用程序所必需的符號信息。為了阻止tornado編譯環(huán)境生成系統(tǒng)時將修改后的symTbl.c覆蓋掉,還需要找到自動生成symTbl.c文件的那條規(guī)則,并將其刪除。找到targethmake ules.VxWorks文件中控制生成symTbl.c文件的規(guī)則:
symTbl.o:partialImage.o
- @ $(RM) $@
$(CP) partialImage.o tmp.o
$(LDOUT_SYMS) tmp.o
$(MKSYMTBL) tmp.o > symTbl.c
- @ $(RM) tmp.o
$(COMPILE_SYMTBL) symTbl.c -o $@
將上面的生成規(guī)則改成:
symTbl.o:
$(COMPILE_SYMTBL) symTbl.c -o $@
由于上訴規(guī)則并沒有禁止將symTbl.c文件編譯生成symTbl.o文件;所以在鏈接成VxWorks系統(tǒng)時,不會影響將symTbl.o鏈接到VxWorks系統(tǒng)文件中。重新編譯生成VxWorks系統(tǒng),此時VxWorks系統(tǒng)當(dāng)中的符號僅僅包含downloadable型應(yīng)用程序所必需的符號信息。系統(tǒng)的符號信息保存在standTbl數(shù)組中,而數(shù)組不僅需要占用系統(tǒng)文件的內(nèi)存,在系統(tǒng)加載到內(nèi)存時也需要一部分系統(tǒng)內(nèi)存來保存該數(shù)組。因此,減小系統(tǒng)的符號可以減小編譯生成的VxWorks的大小,還可以減少VxWork系統(tǒng)占用的內(nèi)存空間。同時,standTbl數(shù)組變小,會減小掛載到系統(tǒng)符號哈希表的符號項(xiàng),從而間接達(dá)到提高downloadable型應(yīng)用程序加載的目的。
VxWorks系統(tǒng)的符號表中僅包含downloadable型應(yīng)用程序所必須的符號,可以達(dá)到間接裁剪內(nèi)核的目的,同時使得VxWorks系統(tǒng)符號哈希表的256個表項(xiàng)較符號數(shù)組standTbl的項(xiàng)多,從而大大降低哈希表查找過程沖突發(fā)生的可能性。同時,在模塊加載時,加載過程的符號解析部分最好將會在O(1)時間復(fù)雜度完成,最差也不會比原來包含全部的符號表差。本文主要通過更加靈活的符號表裁剪手段,靈活控制系統(tǒng)符號表的大小,從而達(dá)到裁剪系統(tǒng)和加快downloadable型應(yīng)用程序加載速度的目的。
參考文獻(xiàn)
[1]方箭,魯俊,朱穎,李芃芃.全球數(shù)字紅利頻譜釋放現(xiàn)狀及展望[J].電訊技術(shù),2015(12).
[2]王文儉.2015CISPR年會主要技術(shù)內(nèi)容CISPR/H[J].安全與電磁兼容,2015(06).
[3]方箭,李景春,黃標(biāo),馮巖.5G頻譜研究現(xiàn)狀及展望[J].電信科學(xué),2015(12).
李彥峰(1982-),山東德州人,碩士研究生,中級職稱,研究方向:軟件工程嵌入式系統(tǒng)。
作者簡介: