1 引言
現(xiàn)今較為流行的操作系統(tǒng)Linux,本著開放、自由的精神吸引了全世界的目光,但將它應(yīng)用于嵌入式實(shí)時(shí)環(huán)境還有許多缺點(diǎn)。特別是在運(yùn)行內(nèi)核線程時(shí),Linux 關(guān)閉中斷,而且分時(shí)調(diào)度虛擬文件系統(tǒng)的時(shí)間不確定性、缺乏高精度的計(jì)時(shí)器等問題都是需要解決的,所以在Linux 上進(jìn)行實(shí)時(shí)改進(jìn),建立具有實(shí)時(shí)應(yīng)用能力的操作系統(tǒng)是現(xiàn)代嵌入式操作系統(tǒng)的解決方案,也日益成為人們關(guān)注的課題。
目前,大多數(shù)嵌入式設(shè)備都具有存儲(chǔ)容量小、處理速度慢和網(wǎng)絡(luò)應(yīng)用單一等特點(diǎn),在這樣的嵌入式系統(tǒng)中應(yīng)用傳統(tǒng)的單塊式網(wǎng)絡(luò)協(xié)議棧就存在問題:一是如果協(xié)議棧中某個(gè)子協(xié)議功能需要升級(jí),就要升級(jí)整個(gè)協(xié)議棧甚至重新編譯全部?jī)?nèi)核文件,工作流程復(fù)雜;二是協(xié)議棧不夠靈活,不能根據(jù)嵌入式系統(tǒng)對(duì)網(wǎng)絡(luò)通信的實(shí)際需求配置其內(nèi)容。
2 構(gòu)件技術(shù)介紹
早在60 年代,“軟件構(gòu)件”與“軟件組裝生產(chǎn)線”思想在國際北大西洋公約組織軟件工程會(huì)議上被提出來,從此,采用構(gòu)件技術(shù)實(shí)現(xiàn)軟件復(fù)用,采用“搭積木”的方式生產(chǎn)軟件,成為軟件業(yè)長(zhǎng)期的夢(mèng)想。然而,由于技術(shù)水平的限制,在很長(zhǎng)一段時(shí)間內(nèi),構(gòu)件技術(shù)只是作為一種思想存在,直到CORBA 、J2EE、.NET 出現(xiàn),中間件興起以后,構(gòu)件技術(shù)才逐漸走向現(xiàn)實(shí)。
構(gòu)件最大的特點(diǎn)是可以不斷復(fù)用、降低成本、縮短開發(fā)周期。從構(gòu)件技術(shù)的實(shí)現(xiàn)來看,它規(guī)定了一種普遍使用的抽象“標(biāo)準(zhǔn)”,即規(guī)定了一組相同的結(jié)構(gòu)類接口來實(shí)現(xiàn)動(dòng)態(tài)交流。通信協(xié)議引入構(gòu)件技術(shù)設(shè)計(jì),可提供代碼的可重用性,使程序開發(fā)周期縮短,分工更加明細(xì),使整個(gè)協(xié)議體系具備了更好的可配置性、高效性、可重用性、可擴(kuò)展性和可表達(dá)性。從而解決了網(wǎng)絡(luò)通信中存在的四個(gè)基本問題:基本的構(gòu)件互操作性、協(xié)議版本升級(jí)、實(shí)現(xiàn)語言無關(guān)性、透明的跨進(jìn)程互操作性。
軟件構(gòu)件技術(shù)是建立在面向?qū)ο蠹夹g(shù)之上的,它提供了比面向?qū)ο蠹夹g(shù)更為高級(jí)的抽象,通常是對(duì)一組類進(jìn)行封裝,通過固定的接口來調(diào)用該構(gòu)件所提供的方法。構(gòu)件技術(shù)成為了嵌入式操作系統(tǒng)和嵌入式應(yīng)用軟件的發(fā)展趨勢(shì)。利用構(gòu)件技術(shù)把單塊式的網(wǎng)絡(luò)協(xié)議分割成多個(gè)獨(dú)立的構(gòu)件,每一個(gè)構(gòu)件都可以被新的構(gòu)件更新、替換,一組相關(guān)的構(gòu)件提供特定的服務(wù)。因此,系統(tǒng)就可以通過選擇相應(yīng)的網(wǎng)絡(luò)協(xié)議構(gòu)件進(jìn)行組裝來通信。
3通信協(xié)議構(gòu)件化
隨著嵌入式系統(tǒng)與網(wǎng)絡(luò)的日益結(jié)合,在嵌入式實(shí)時(shí)操作系統(tǒng)中引入TCP/IP 協(xié)議棧,以支持嵌入式設(shè)備接入網(wǎng)絡(luò),成為嵌入式領(lǐng)域重要的研究方向。但是傳統(tǒng)的TCP/IP 協(xié)議實(shí)現(xiàn)存在實(shí)時(shí)性能較差,不能滿足實(shí)時(shí)性要求高的嵌入式領(lǐng)域;傳統(tǒng)TCP/IP 的實(shí)現(xiàn)過于復(fù)雜,需占用大量系統(tǒng)資源,而嵌入式應(yīng)用的系統(tǒng)資源往往都很有限;傳統(tǒng)的TCP/IP 協(xié)議系統(tǒng)是基于單塊式體系結(jié)構(gòu)的,即嵌入式實(shí)時(shí)操作系統(tǒng)中引入的協(xié)議是以單塊方式設(shè)計(jì)并加以實(shí)現(xiàn)的,隨著網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,以及一些新應(yīng)用不斷增長(zhǎng)和變化的要求,這種通用的單塊式結(jié)構(gòu)的協(xié)議往往不能滿足需求。因此,需要把傳統(tǒng)TCP/IP 在不違背協(xié)議標(biāo)準(zhǔn)的前提下加以改進(jìn)實(shí)現(xiàn),使其實(shí)時(shí)性得到提高,占用的存儲(chǔ)空間盡可能少,從而滿足嵌入式應(yīng)用的要求。
Linux 可針對(duì)用戶的需求,動(dòng)態(tài)載入和卸載操作系統(tǒng)構(gòu)件,這種模塊化機(jī)制為通信協(xié)議構(gòu)件化提供了前提條件。用戶可以根據(jù)需要,在不對(duì)內(nèi)核重新編澤的情況下,能將模塊動(dòng)態(tài)地載入內(nèi)核或從內(nèi)核移出,內(nèi)核可以僅實(shí)現(xiàn)一些基本功能,系統(tǒng)的可擴(kuò)展性功能就留給模塊來完成,從而使內(nèi)核的大小和通訊量都達(dá)到最小。因此,在Linux 中實(shí)現(xiàn)協(xié)議構(gòu)件化可以依賴模塊化機(jī)制,協(xié)議構(gòu)件由Linux 模塊來實(shí)現(xiàn),模塊能動(dòng)態(tài)地載入內(nèi)核或從內(nèi)核移出,而不需要對(duì)內(nèi)核重新編譯。
本文針對(duì)嵌入式服務(wù)器的網(wǎng)絡(luò)實(shí)時(shí)通信的應(yīng)用,以經(jīng)過實(shí)時(shí)改進(jìn)和裁剪的Linux 操作系統(tǒng)作為協(xié)議構(gòu)件化的平臺(tái),對(duì)的TCP/IP 協(xié)議棧進(jìn)行構(gòu)件化。
1 通信協(xié)議構(gòu)件化原理
2 通信協(xié)議分解
為了使協(xié)議構(gòu)件具備動(dòng)態(tài)鏈接、信息封裝、統(tǒng)一接口等特性,首先要合理分解通信協(xié)議,這關(guān)系到通信協(xié)議構(gòu)件的粒度。從粒度上來看,構(gòu)件的粒度越小,協(xié)議劃分越細(xì),協(xié)議構(gòu)件越多;構(gòu)件粒度越大,協(xié)議劃分越粗,協(xié)議構(gòu)件越少。
協(xié)議構(gòu)件粒度的大小,決定了協(xié)議構(gòu)件模塊化、信息封裝性、局部化的程度,為此必須保證協(xié)議構(gòu)件的獨(dú)立性。一旦構(gòu)件具備良好的獨(dú)立性,建立在協(xié)議構(gòu)件之上的應(yīng)用程序構(gòu)件就更容易開發(fā),接口也會(huì)簡(jiǎn)化;獨(dú)立的模塊也比較容易測(cè)試與維護(hù),修改工作量小,錯(cuò)誤傳播范圍小。如果粒度過小,雖然協(xié)議構(gòu)件獨(dú)立性增強(qiáng),但是構(gòu)件的接口就增加了,給構(gòu)件的組合、構(gòu)件的管理帶來了很多的困難。如果粒度過大,構(gòu)件的尺度增加,獨(dú)立性降低,各個(gè)構(gòu)件之間的關(guān)聯(lián)度也會(huì)增加,不利于構(gòu)件的動(dòng)態(tài)替換與更新。
粒度的大小可以用兩個(gè)定性標(biāo)準(zhǔn)來衡量,分別是內(nèi)聚和耦合。耦合衡量不同構(gòu)件彼此之間相互依賴的緊密程度;內(nèi)聚衡量一個(gè)協(xié)議構(gòu)件內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度。在對(duì)協(xié)議進(jìn)行構(gòu)件化的時(shí)候,采取的策略應(yīng)當(dāng)盡量使協(xié)議構(gòu)件之間的耦合度降低,獨(dú)立性增強(qiáng),加強(qiáng)內(nèi)聚性。
目前對(duì)構(gòu)件的粒度還沒有統(tǒng)一的要求,由于構(gòu)件是一個(gè)高內(nèi)聚的軟件包,只要符合高內(nèi)聚的原則,則構(gòu)件的粒度大小可不限。
3.1.2 通信協(xié)議構(gòu)件化方法
由上節(jié)可知,通信協(xié)議分解沒有統(tǒng)一的要求,所以,可以從多個(gè)角度對(duì)通信協(xié)議進(jìn)行構(gòu)件化。例如,按構(gòu)件的功能可進(jìn)行基本協(xié)議構(gòu)件、通用協(xié)議構(gòu)件、對(duì)各領(lǐng)域的專用協(xié)議構(gòu)件或子系統(tǒng)協(xié)議構(gòu)件化;按構(gòu)件的使用方式可進(jìn)行靜態(tài)的和動(dòng)態(tài)的構(gòu)件化;按構(gòu)件的結(jié)構(gòu)可進(jìn)行原子構(gòu)件及由多個(gè)構(gòu)件*的組合構(gòu)件化;按協(xié)議棧的分層結(jié)構(gòu)可進(jìn)行層次構(gòu)件化。本文以Linux 下的TCP/IP 協(xié)議層次結(jié)構(gòu)(如圖1 所示)為基礎(chǔ),按層次構(gòu)件化。即將ARP、IP、ICMP、UDP、TCP 協(xié)議從Linux 內(nèi)核中分離出來,按每個(gè)協(xié)議完成的功能劃分成不同的模塊,每個(gè)模塊作為一個(gè)構(gòu)件。每個(gè)構(gòu)件用一個(gè)指針函數(shù)實(shí)現(xiàn),這樣,一個(gè)基于嵌入式Linux 的應(yīng)用系統(tǒng)在內(nèi)核啟動(dòng)時(shí)可按需求動(dòng)態(tài)組裝協(xié)議功能,形成不同配置通信協(xié)議棧,顯示了系統(tǒng)網(wǎng)絡(luò)通信的靈活性。
考慮到TCP 協(xié)議是面向連接的、端對(duì)端的可靠通信協(xié)議,為保證遠(yuǎn)程客戶端與本地嵌入式系統(tǒng)服務(wù)器的正確通信,采取了相應(yīng)機(jī)制來保證它的可靠性和實(shí)時(shí)性,即連接的建立與關(guān)閉、超時(shí)重傳機(jī)制、數(shù)據(jù)包確認(rèn)機(jī)制、流量控制等。因此,將TCP 協(xié)議按應(yīng)用功能劃分成客戶端模塊和服務(wù)器端模塊,前者主動(dòng)建立連接,后者*連接,連接建立后雙方進(jìn)行數(shù)據(jù)信息的發(fā)送或接收。
相對(duì)于TCP 協(xié)議,ARP、IP、ICMP、UDP 等協(xié)議功能較簡(jiǎn)單,對(duì)它們不劃分模塊,每個(gè)協(xié)議按其完成的功能設(shè)計(jì)成一個(gè)構(gòu)件,但考慮到嵌入式系統(tǒng)的實(shí)時(shí)性,去掉了不必要的功能。UDP 協(xié)議設(shè)計(jì)時(shí)不考慮數(shù)據(jù)校驗(yàn)方法,只考慮數(shù)據(jù)的發(fā)送和接收功能。ICMP 協(xié)議設(shè)計(jì)時(shí)僅考慮了目的端不可達(dá)、源端抑制、超時(shí)、改變路由等差錯(cuò)和回送請(qǐng)求處理。IP 協(xié)議設(shè)計(jì)時(shí)主要進(jìn)行路由、向相鄰協(xié)議層傳遞數(shù)據(jù)包,而不考慮分片、重裝功能。ARP 協(xié)議主要負(fù)責(zé)將局域網(wǎng)中的32 位IP 地址轉(zhuǎn)換為對(duì)應(yīng)的網(wǎng)卡的MAC 地址,它的功能包括發(fā)送ARP 請(qǐng)求和響應(yīng)對(duì)方的ARP 請(qǐng)求,動(dòng)態(tài)維護(hù)一個(gè)ARP 高速緩存。
3.1.3 通信協(xié)議構(gòu)件組裝
通信協(xié)議構(gòu)件組裝過程如圖2 所示。通信協(xié)議構(gòu)件放在構(gòu)件庫中,系統(tǒng)運(yùn)行時(shí),嵌入式Linux 操作系統(tǒng)調(diào)度協(xié)議組裝模塊,由該模塊依據(jù)系統(tǒng)網(wǎng)絡(luò)功能需求從構(gòu)件庫中取出相應(yīng)構(gòu)件,動(dòng)態(tài)配置通信協(xié)議棧。
因此,組裝的主要功能是負(fù)責(zé)實(shí)現(xiàn)嵌入式Linux 操作系統(tǒng)和構(gòu)件庫的交互、監(jiān)控構(gòu)件的運(yùn)行狀況,并記錄構(gòu)件的特征以反饋給構(gòu)件庫。
3.2 通信協(xié)議構(gòu)件化的實(shí)現(xiàn)
本文借鑒文獻(xiàn)的思想,并結(jié)合上面提出的方法來實(shí)現(xiàn)通信協(xié)議構(gòu)件化。各協(xié)議的實(shí)現(xiàn)類似,下面以TCP 協(xié)議為例說明實(shí)現(xiàn)過程。
將協(xié)議棧初始化文件中為協(xié)議分配內(nèi)核存儲(chǔ)空間、向內(nèi)核保存TCP 協(xié)議棧的鏈表結(jié)構(gòu)、注冊(cè)、協(xié)議本身初始化的內(nèi)容移入其模塊中,在模塊開始部分完成分配存儲(chǔ)空間、注冊(cè)、初始化等,在模塊結(jié)束部分完成釋放模塊所占內(nèi)核空間、取消注冊(cè)、進(jìn)行重置等。
修改協(xié)議實(shí)現(xiàn)文件tcp.c 和tcp.h ,創(chuàng)建新的模塊文件,協(xié)議實(shí)現(xiàn)文件中僅保留被其它協(xié)議使用的變量,其它內(nèi)容放在新建的模塊文件中。
協(xié)議提供給其它協(xié)議的函數(shù)接口,由函數(shù)名調(diào)用改為函數(shù)指針調(diào)用,修改頭文件,為該新的接口實(shí)現(xiàn)添加定義及聲明,并將函數(shù)指針初始化指向一個(gè)空函數(shù)體。將其它協(xié)議中原來通過函數(shù)名調(diào)用改為相應(yīng)的函數(shù)指針調(diào)用,這些函數(shù)指針是該協(xié)議構(gòu)件的接口,可以保持不變,而接口提供的功能可以依據(jù)需要隨時(shí)修改。
修改網(wǎng)絡(luò)部分的內(nèi)核符號(hào)表文件,既包括修改之后為其它協(xié)議提供的接口,又包括模塊化之后需要的其它協(xié)議提供的接口。
修改Makeflie 文件,增加相應(yīng)的模塊化文件列表。
4 通信協(xié)議測(cè)試
構(gòu)件化的協(xié)議的運(yùn)行情況在MagicARM2200 目標(biāo)板上進(jìn)行測(cè)試,測(cè)試前需要配置軟硬件環(huán)境,配置過程如下:用串口線和簡(jiǎn)易仿真器連接PC 機(jī)和目標(biāo)板,使用兩條獨(dú)立的網(wǎng)線分別將它們連接到以太網(wǎng);在PC 機(jī)上安裝虛擬機(jī)5.5 和Red Hat Linux 9 ,將經(jīng)過實(shí)時(shí)改進(jìn)和裁剪的Linux 移植到該目標(biāo)板。
4.1 測(cè)試ARP 協(xié)議構(gòu)件
在內(nèi)核無ARP 協(xié)議支持時(shí),為了顯示ARP 緩存中的MAC、IP 地址信息,運(yùn)行arp -a 命令,結(jié)果為空,并且其它網(wǎng)絡(luò)應(yīng)用都不能工作,整個(gè)系統(tǒng)的網(wǎng)絡(luò)部分由于該底層協(xié)議的失效而癱瘓。將ARP 協(xié)議構(gòu)件用insmod 命令裝入后,網(wǎng)絡(luò)部分恢復(fù)正常。
4.2 測(cè)試ICMP 協(xié)議構(gòu)件
在內(nèi)核不加載ICMP 協(xié)議構(gòu)件時(shí),從外界ping 主機(jī),ping 命令顯示超時(shí),即ping 不通。內(nèi)核接收及處理傳來的ICMP 數(shù)據(jù)包的函數(shù)接口找不到相應(yīng)的功能實(shí)現(xiàn),不能正常返回確認(rèn)消息包。在將ICMP 協(xié)議構(gòu)件用insmod 命令裝入后,處理數(shù)據(jù)包的函數(shù)正確執(zhí)行,顯示能夠ping 通。響應(yīng)時(shí)間如表1 所示。
從表1 可以看出,當(dāng)ICMP 協(xié)議作為模塊被加載后,ping 命令的響應(yīng)時(shí)間比該協(xié)議編譯進(jìn)內(nèi)核的長(zhǎng),增長(zhǎng)的幅度為(0.668-0.611)/0.611=0.093 ,性能下降不超過1%。而且,從內(nèi)核啟動(dòng)速度來看,構(gòu)件化ICMP 協(xié)議的結(jié)果,由于構(gòu)件化的內(nèi)核在網(wǎng)絡(luò)部分啟動(dòng)過程中沒有初始化ICMP 協(xié)議部分,啟動(dòng)速度略有提高。
4.3 測(cè)試UDP 協(xié)議構(gòu)件
為了便于觀察系統(tǒng)性能的變化,本文采用Linux 網(wǎng)絡(luò)性能測(cè)試軟件Netperf 對(duì)UDP 協(xié)議構(gòu)件進(jìn)行測(cè)試,主要測(cè)試UDP 的批量數(shù)據(jù)傳輸性能、請(qǐng)求和響應(yīng)性能。測(cè)試結(jié)果如表2 所示。
從表2 可以看出,協(xié)議構(gòu)件化之后的網(wǎng)絡(luò)性能有損失,其數(shù)據(jù)傳輸性能的下降幅度為(l55.2-140.3)/155.2=0.096 ,請(qǐng)求/響應(yīng)性能的下降幅度為(620.1-*.9)/620.1=0.025 ,它們都低于一個(gè)數(shù)量級(jí)。
4.4 測(cè)試TCP 協(xié)議構(gòu)件
在目標(biāo)板和PC 機(jī)之間進(jìn)行測(cè)試,PC 機(jī)作為客戶端,目標(biāo)板作為服務(wù)器,并編寫客戶端和服務(wù)器測(cè)試程序。在內(nèi)核不加載TCP 協(xié)議構(gòu)件時(shí),運(yùn)行客戶端程序,PC 機(jī)提示不能和服務(wù)器連接;加載TCP 協(xié)議構(gòu)件后,再次運(yùn)行客戶端程序,觀察PC 機(jī),顯示連接成功,在目標(biāo)板上鍵入字符,在PC 機(jī)上可以顯示接收到的字符。
從上面的測(cè)試結(jié)果可知,對(duì)Linux 下的TCP/IP 構(gòu)件化后,盡管系統(tǒng)性能會(huì)略有損失,但損失不大,用此較小的代價(jià)可以換取升級(jí)、維護(hù)的成本大大降低、新協(xié)議開發(fā)時(shí)間大大縮短,從而說明構(gòu)件化協(xié)議的可行性和優(yōu)越性,在實(shí)際應(yīng)用中可以認(rèn)為是一種有效的方法。
5 結(jié)論
本文針對(duì)嵌入式服務(wù)器的網(wǎng)絡(luò)實(shí)時(shí)通信的應(yīng)用,將構(gòu)件技術(shù)引入Linux 的TCP/IP 協(xié)議設(shè)計(jì)中,提出了一種構(gòu)件化TCP/IP 協(xié)議棧中主要協(xié)議的方法,并對(duì)構(gòu)件化的協(xié)議進(jìn)行測(cè)試,結(jié)果表明構(gòu)件化的協(xié)議可以動(dòng)態(tài)載入實(shí)時(shí)改進(jìn)和裁剪的Linux 系統(tǒng),不僅減少了嵌入式Linux 內(nèi)核的尺寸,而且增強(qiáng)了系統(tǒng)網(wǎng)絡(luò)通信協(xié)議設(shè)計(jì)的靈活性。
評(píng)論