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