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