崔歡歡,霍 華,王永杰
(河南科技大學(xué)電子信息工程學(xué)院,河南洛陽471003)
近年來,Linux以其源碼開放、性能穩(wěn)定、可裁剪等優(yōu)勢成為嵌入式操作系統(tǒng)的首選。Linux可作為一種通用的操作系統(tǒng),應(yīng)用于資源受限的、針對具體應(yīng)用而設(shè)計(jì)的專用系統(tǒng)——嵌入式系統(tǒng)之前,需對內(nèi)核中不同的功能模塊進(jìn)行裁剪,根據(jù)軟硬件的實(shí)際情況定制Linux內(nèi)核[1-2]。作為RFID系統(tǒng)的核心部分,RFID讀寫器具有的很重要的技術(shù)意義和市場前景,但設(shè)計(jì)開發(fā)一款既具有專用性又具有通用性的RFID手持讀寫器是當(dāng)今的難題[3]。針對這個問題,本文將RFID技術(shù)和嵌入式技術(shù)相結(jié)合,根據(jù)需求裁剪定制內(nèi)核,得到適用于RFID手持讀寫器的內(nèi)核映像。
Linux的模塊化設(shè)計(jì)、源代碼公開和Linux內(nèi)核重編譯功能使得Linux內(nèi)核具有可裁剪性,但是龐大的內(nèi)核源代碼結(jié)構(gòu)使得分析和裁剪內(nèi)核有一定的難度[4]。目前對于Linux內(nèi)核的裁剪常用的方法有[5-6]:配置裁剪方法、基于代碼分析的裁剪方法和基于調(diào)用圖的裁剪方法。配置裁剪方法是根據(jù)Linux本身所提供的配置工具裁剪配置內(nèi)核,將信息保存供內(nèi)核編譯使用;基于代碼分析的裁剪方法是通過對內(nèi)核源代碼的分析,使用條件編譯或修改源碼、直接刪除冗余代碼(文件、實(shí)現(xiàn)函數(shù)、相關(guān)數(shù)據(jù)結(jié)構(gòu)等);基于調(diào)用圖的裁剪方法是通過分析庫函數(shù)、系統(tǒng)調(diào)用和內(nèi)核函數(shù)的調(diào)用關(guān)系,建立基于函數(shù)間調(diào)用關(guān)系的調(diào)用圖,刪除內(nèi)核中未調(diào)用到的函數(shù)。以上3種方法各有優(yōu)點(diǎn),但均存在不同程度粒度偏大問題?;诖?,本文將以上3種方法的優(yōu)點(diǎn)相融合,采用一種混合的裁剪方法來提高裁剪率,并面向RFID手持讀寫器的具體應(yīng)用對裁剪結(jié)果進(jìn)行驗(yàn)證。
嵌入式Linux的裁剪[7]是指在開放源碼、性能穩(wěn)定的Linux源代碼的基礎(chǔ)上,根據(jù)特定應(yīng)用和硬件平臺(x86,ARM等),適當(dāng)?shù)膬?yōu)化刪減代碼的過程。裁剪后的代碼符合嵌入式應(yīng)用的要求,應(yīng)用功能有所減少,規(guī)模更為精簡,體系結(jié)構(gòu)更為緊湊,可配置性有所提高。
圖1描述了RFID手持讀寫器的相關(guān)硬件模塊:主控制器是三星公司的嵌入式ARM芯片S3C2410,其內(nèi)部有4K SRAM用于Nand Flash啟動;存儲器單元(主存儲器SDRAM+輔助存儲器Nand Flash)用于存儲數(shù)據(jù);LCD和鍵盤作為人機(jī)交互工作的接口;RFID讀寫模塊用于收發(fā)射頻信息;JTAG調(diào)試模塊和用于通訊的串口和以太網(wǎng)接口。
圖2對RFID手持讀寫器的軟件系統(tǒng)進(jìn)行了層次性的描述,其中軟件層中列出了組成Linux內(nèi)核的5個部分:進(jìn)程調(diào)度(SCHED)、內(nèi)存管理(MM)、虛擬文件系統(tǒng)(VFS)、網(wǎng)絡(luò)接口(NET)和進(jìn)程間通信(IPC)。
通過對Linux內(nèi)核源碼及組成內(nèi)核的5個部分的分析,得到內(nèi)核模塊中可以裁剪的部分[8-9]:
(1)系統(tǒng)多余的進(jìn)程。Linux內(nèi)核中的一些模塊對于嵌入式系統(tǒng)并不適用,可以剔除內(nèi)核對這些進(jìn)程的創(chuàng)建和調(diào)度機(jī)制,如虛存管理模塊,同時刪除與此相關(guān)的進(jìn)程。
(2)平臺無關(guān)代碼和多余硬件相關(guān)代碼。根據(jù)硬件平臺裁剪掉內(nèi)核arch目錄下與該平臺無關(guān)的處理器支持代碼;另外,Linux內(nèi)核支持很多硬件及其周邊設(shè)備,如硬盤、鼠標(biāo)等,并不是所有嵌入式系統(tǒng)都需要,可以根據(jù)實(shí)際情況刪除那些無用的硬件驅(qū)動程序的相關(guān)代碼。
(3)異常處理函數(shù)。Linux內(nèi)核提供的一些異常處理函數(shù)是嵌入式系統(tǒng)所不需要的,如:debug、divide_error、nmi、overflow、bounds等,可以根據(jù)具體情況刪除不需要的函數(shù)代碼。
(4)內(nèi)存管理。Linux的內(nèi)存管理采用的是基于分頁式的虛擬內(nèi)存管理機(jī)制,會影響到系統(tǒng)的可確定性和響應(yīng)時間,在嵌入式系統(tǒng)中并不適用可以剔除,直接使用實(shí)際內(nèi)存。
(5)文件系統(tǒng)。Linux內(nèi)核支持ext2、vfat、jffs、yaffs等多種文件系統(tǒng),可嵌入式系統(tǒng)一般僅需要里面的幾種,可以裁剪掉不需要的文件系統(tǒng)來節(jié)省存儲空間。
(6)網(wǎng)絡(luò)協(xié)議棧。嵌入式系統(tǒng)可根據(jù)需求剔除系統(tǒng)中無需支持的網(wǎng)絡(luò)協(xié)議棧,僅保留需要的網(wǎng)絡(luò)協(xié)議棧,如僅保留TCP/IP協(xié)議棧。
配置裁剪方法雖然簡單,但裁剪的最小單元為整個功能模塊粒度過大,而且缺少與應(yīng)用程序具體需求的結(jié)合,造成目標(biāo)代碼中存在一定量的冗余代碼?;诖a分析的裁剪方法雖然可以得到比配置更小粒度的內(nèi)核,但內(nèi)核中過多條件編譯語句的使用損害了源代碼的可讀性和可維護(hù)性,并導(dǎo)致了調(diào)試和測試的復(fù)雜性,降低了裁剪率,而且內(nèi)核源碼的復(fù)雜性和軟件的不可見性,使對內(nèi)核及各子模塊結(jié)構(gòu)間的關(guān)系的分析變得困難,增加了裁剪的難度?;谡{(diào)用圖的裁剪方法的裁剪率雖然比前兩種方法有所提升,可以得到更小體積的內(nèi)核,但裁剪粒度還有提升的空間。根據(jù)以上分析,這里使用一種混合的裁剪方法來實(shí)現(xiàn)更小粒度的內(nèi)核。
此混合裁剪方法的思路為將裁剪分兩步進(jìn)行:第一步將配置裁剪方法和基于代碼分析的裁剪方法相結(jié)合;第二步將基于調(diào)用圖的裁剪方法和基于代碼分析的裁剪方法相結(jié)合。
根據(jù)對嵌入式Linux內(nèi)核的可裁剪項(xiàng)的分析,本文以文件系統(tǒng)的裁剪為例對混合的裁剪方法進(jìn)行詳細(xì)的介紹。
Linux系統(tǒng)中文件系統(tǒng)用來組織文件和設(shè)備,文件系統(tǒng)的存在使得數(shù)據(jù)和設(shè)備得到有效而透明的存取訪問,Linux程序、庫、系統(tǒng)文件和用戶文件都在其里面包含,它構(gòu)成了Linux系統(tǒng)上所有數(shù)據(jù)的基礎(chǔ),是Linux系統(tǒng)中龐大復(fù)雜而又最為基本和重要的資源。
文件系統(tǒng)的裁剪是嵌入式Linux裁剪中最重要的部分,需要進(jìn)行簡化數(shù)據(jù)結(jié)構(gòu)、優(yōu)化系統(tǒng)調(diào)用等工作。在RFID手持讀寫器硬件結(jié)構(gòu)分析中,使用Nand Flash閃存芯片來存儲應(yīng)用程序、數(shù)據(jù)信息等,這里使用Cramfs+Yaffs2聯(lián)合作為嵌入式文件系統(tǒng)。其中內(nèi)核空間使用高壓縮、只讀的Cramfs作為根文件系統(tǒng),用于節(jié)省存儲空間和保護(hù)根文件系統(tǒng);用戶空間使用可讀寫的Yaffs2文件系統(tǒng),作為系統(tǒng)啟動、普通文件被掛載后數(shù)據(jù)的存儲。Yaffs文件系統(tǒng)專為Nand Flash而設(shè)計(jì),Yaffs2在讀/寫/刪除/垃圾回收操作及內(nèi)存消耗上都優(yōu)于Yaffs。
裁剪流程圖如圖3所示,具體流程如下:
(1)第一步裁剪:先用配置裁剪方法,在文件系統(tǒng)選項(xiàng)中保留對需要文件系統(tǒng)的支持。再用基于代碼分析的裁剪方法,使用直接刪除、修改源碼的思想,刪除fs目錄下其他文件系統(tǒng)的子目錄,并在相應(yīng)數(shù)據(jù)結(jié)構(gòu)中刪除其類型支持、修改相應(yīng)系統(tǒng)調(diào)用。
(2)第二步裁剪:采用自上而下的思想,分析可能需要的文件系統(tǒng)調(diào)用。從應(yīng)用程序到庫函數(shù)再到系統(tǒng)功能調(diào)用,分析每個系統(tǒng)調(diào)用函數(shù)間的關(guān)系,找出可移除的系統(tǒng)調(diào)用和子函數(shù)。
系統(tǒng)調(diào)用是連接用戶程序和內(nèi)核的接口,Linux內(nèi)核中與文件系統(tǒng)相關(guān)的有70多個。對其裁剪不僅要考慮是否需要還要考慮此系統(tǒng)功能上下文間的調(diào)用關(guān)系,所以保留最基本的系統(tǒng)調(diào)用,對其他可以裁剪的系統(tǒng)調(diào)用使用基于調(diào)用圖的裁剪方法。
文件系統(tǒng)必須保留的調(diào)用:對文件(關(guān)閉、創(chuàng)建、打開、讀寫)、對目錄(創(chuàng)建、刪除、改變)和對文件系統(tǒng)(安裝、卸載、創(chuàng)建節(jié)點(diǎn)、刪除鏈接)等的基本操作。圖4以文件讀寫系統(tǒng)的調(diào)用關(guān)系為例,介紹了基于調(diào)用圖的裁剪方法。
圖3 文件系統(tǒng)裁剪流程圖
從圖4得出,因?yàn)榍度胧较到y(tǒng)中不需要支持文件多塊數(shù)據(jù)的傳輸,所以在庫函數(shù)中可以刪除函數(shù)readv和writev,及對應(yīng)的系統(tǒng)調(diào)用sys_readv、sys_writev和僅支持此兩個系統(tǒng)調(diào)用的子函數(shù)do_read_ write,而也被其他系統(tǒng)調(diào)用調(diào)用的函數(shù)fget和fput不能刪除。
找出可能需要的系統(tǒng)調(diào)用后,可利用基于代碼分析的裁剪方法,使用條件編譯語句對這些系統(tǒng)調(diào)用的相關(guān)代碼進(jìn)行修改。如在內(nèi)核代碼中的系統(tǒng)調(diào)用及相關(guān)函數(shù)代碼、unistd.h中的系統(tǒng)調(diào)用編號和call.S中的系統(tǒng)調(diào)用表中添加條件編譯#ifdef(CONFIG_XXX_SYS_CALL)和#endif。
圖4 文件讀寫系統(tǒng)調(diào)用關(guān)系圖
根據(jù)軟硬件分析實(shí)現(xiàn)了RFID手持讀寫器嵌入式Linux內(nèi)核的定制,對可裁剪項(xiàng)使用一種混合的裁剪方法進(jìn)行裁剪,結(jié)果和配置裁剪方法對比,如表1所示。由表1可知:無論在內(nèi)核整體還是內(nèi)存管理、文件系統(tǒng)、網(wǎng)絡(luò)等方面,裁剪率均有一定程度的提高;得到294.5 K的內(nèi)核映像,比配置裁剪方法減少了24.7%,比原始映像減少了38.6%,得到了一個更細(xì)粒度的內(nèi)核。
表1 內(nèi)核裁剪度結(jié)果分析
通過對已有裁剪方法優(yōu)缺點(diǎn)的分析,本文提出一種面向應(yīng)用的混合裁剪方法,并以面向RFID手持讀寫器的具體應(yīng)用為例,對嵌入式Linux內(nèi)核“量體裁衣”,得出可裁剪項(xiàng),以文件系統(tǒng)的裁剪為例,詳細(xì)介紹混合裁剪方法的裁剪思路。實(shí)驗(yàn)結(jié)果表明:該裁剪方法與配置方法相比,有著更小粒度、更高精度的裁剪度,得到了更小體積的內(nèi)核映像。
[1] 嚴(yán)義,左鼎.基于關(guān)系矩陣的嵌入式組件裁剪方法[J].計(jì)算機(jī)工程與應(yīng)用,2009,45(24):77-79.
[2] Karim Yaghmour.Building embedded linux system[M].New York:O'Reilly,2008.
[3] 魏登峰,田華.基于ARM的嵌入式RFID讀寫器設(shè)計(jì)[J].微計(jì)算機(jī)信息,2009,25(14):190-191.
[4] 顧詠楓,陳章龍.嵌入式Linux裁剪方法[J].小型微型計(jì)算機(jī)系統(tǒng),2003,24(9):1697-1770.
[5] 成月良,方壽海.面向應(yīng)用的嵌入式Linux裁剪方法研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(11):2684-2686.
[6] 張?jiān)迫兀跖鄸|.基于調(diào)用圖的嵌入式Linux裁剪技術(shù)研究[J].哈爾濱理工大學(xué)學(xué)報,2004,9(2):60-62.
[7] 蔡虹,沈雷,李永紅.基于覆蓋測試的嵌入式軟件自動裁剪[J].計(jì)算機(jī)工程,2010,36(1):73-75.
[8] 俞勤豐,孫涌.μC/OS-Ⅱ中內(nèi)存管理方法的分析及改進(jìn)[J].計(jì)算機(jī)工程,2009,35(11):280-282.
[9] 雷必成.嵌入式系統(tǒng)中TCP/IP協(xié)議的精簡與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息.2006,22(17):107-109.