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