劉玉梅,馬文進(jìn)
哈爾濱工程大學(xué) 信息與通信工程學(xué)院,黑龍江 哈爾濱 150001
隨著物聯(lián)網(wǎng)技術(shù)的發(fā)展,嵌入式系統(tǒng)在基礎(chǔ)與應(yīng)用研究領(lǐng)域越來越重要[1]。嵌入式軟件系統(tǒng)的主要核心部件為微型嵌入式[2]處理器,硬件系統(tǒng)的框架主要包括硬件處理器、硬件存儲(chǔ)器、應(yīng)用軟件和硬件I/O。嵌入式系統(tǒng)具有強(qiáng)大的實(shí)時(shí)性、系統(tǒng)內(nèi)核小、功能專用性強(qiáng)、軟件系統(tǒng)功能精簡等優(yōu)點(diǎn),因此其應(yīng)用已經(jīng)深入到國防、科研以及日常生活等各個(gè)領(lǐng)域中[3]。
無線自組網(wǎng)按需距離矢量路由協(xié)議(Ad hoc on-demand distance vector routing,AODV)[4]是應(yīng)用于無線Ad-Hoc 網(wǎng)絡(luò)[5]中進(jìn)行路由選擇的路由協(xié)議,它能夠?qū)崿F(xiàn)單播和多播,同時(shí)該協(xié)議是Ad Hoc 網(wǎng)絡(luò)中按需生成路由方式的典型協(xié)議,目前Ad Hoc 網(wǎng)絡(luò)中的AODV 協(xié)議的性能主要利用NS2 仿真軟件在理想環(huán)境中對(duì)該協(xié)議的端對(duì)端平均時(shí)延、路由開銷等性能進(jìn)行評(píng)估,但是只依靠仿真無法反應(yīng)在實(shí)際通信場(chǎng)景中環(huán)境因素對(duì)協(xié)議通信過程中的丟包率、時(shí)延等指標(biāo)的影響,因此需要對(duì)AODV 協(xié)議在實(shí)際應(yīng)用中的性能進(jìn)行統(tǒng)計(jì)測(cè)試[6]。
AODV[7]路由協(xié)議有多種的實(shí)現(xiàn)的版本,例如 Mad-Hoc[8]、 AODV-UCSB[9]、 AODV-UU[10]、Kernel-AODV[11]和AODV-UIUC。其中,AODV-UU協(xié)議是由瑞典烏普薩拉大學(xué)(Uppsala University)聯(lián)合愛立信公司發(fā)布的一種路由協(xié)議,是一種穩(wěn)定且開源的協(xié)議實(shí)現(xiàn)[12]。
AODV-UU 源代碼能夠在Linux-2.6[13]以及Linux-3.8 的內(nèi)核版本中實(shí)現(xiàn),但與當(dāng)前主流的Linux-4.0 以上的版本不能兼容。本文在ZYNQ-7 000平臺(tái)下,研究了將AODV-UU 協(xié)議在嵌入式Linux-4.14 內(nèi)核系統(tǒng)上實(shí)現(xiàn)的關(guān)鍵技術(shù)。
1)PYNQ-Z2 開發(fā)板。為了方便上層應(yīng)用程序在功能擴(kuò)展時(shí)需要增加外圍設(shè)備的需求,在開發(fā)板的選型上選擇了由處理系統(tǒng)(processing system,PS)以及可編程邏輯(progarmmable logic,PL)共2 部分所組成的PYNQ-Z2 開發(fā)板。PYNQZ2[14]采用的是ZYNQ-7000 系列[15]的XC7Z020-1CLG400C 型號(hào)的系統(tǒng)級(jí)芯片(system on chip,SOC),內(nèi)部異構(gòu)了雙核ARM Cortex-A9 CPU 以及現(xiàn)場(chǎng)可編程門陣列(field programmable gate array,F(xiàn)PGA),具體的實(shí)現(xiàn)過程中用到了PS 部分中的USB、SD 卡、UART 以及Eth0 等接口[16],PYNQZ2 處理系統(tǒng)結(jié)構(gòu)如圖1 所示。
圖1 PYNQ-Z2 處理系統(tǒng)結(jié)構(gòu)
2)USB WiFi 網(wǎng)卡。網(wǎng)卡的選型需要與所工作的內(nèi)核系統(tǒng)相適配,由于Linux-4.14 的內(nèi)核系統(tǒng)可通過內(nèi)部驅(qū)動(dòng)支持RT5370 型號(hào)網(wǎng)卡,所以網(wǎng)卡最終選型為支持Ad Hoc 模式的RT5370。
3)Micro SD 卡。SD 作為內(nèi)核鏡像、啟動(dòng)文件、根文件系統(tǒng)以及協(xié)議可執(zhí)行文件的存放載體,因此SD 卡需要能夠進(jìn)行高速的數(shù)據(jù)讀寫并且容量最小為16 GB。
方案包括了硬件電路接口設(shè)計(jì)以及Linux 系統(tǒng)定制化設(shè)計(jì)2 個(gè)部分。使用Xilinx 公司的Vivado 軟件對(duì)硬件電路接口進(jìn)行設(shè)計(jì),Petalinux集成開發(fā)工具對(duì)Linux 系統(tǒng)內(nèi)核、根文件系統(tǒng)、設(shè)備樹等完成定制化設(shè)計(jì),避免了對(duì)各部分模塊的單獨(dú)設(shè)計(jì)與編譯。圖2 為軟件設(shè)計(jì)方案。
圖2 軟件設(shè)計(jì)方案
硬件電路接口設(shè)計(jì)中根據(jù)所需功能對(duì)PYNQZ2 開發(fā)板中的各個(gè)接口進(jìn)行用戶設(shè)計(jì)。設(shè)計(jì)過程中針對(duì)開發(fā)板自身特性對(duì)PS 端的相關(guān)接口進(jìn)行使能連通開發(fā)板中相關(guān)電路,對(duì)PL 端接口失能減少電路中的冗余部分,圖3 為最終的硬件電路設(shè)計(jì)圖。
圖3 ZYNQ 處理系統(tǒng)實(shí)現(xiàn)
在Linux 系統(tǒng)的定制化中對(duì)內(nèi)核系統(tǒng)、根文件系統(tǒng)以及設(shè)備樹進(jìn)行用戶級(jí)設(shè)計(jì)。
1)內(nèi)核系統(tǒng)。AODV 協(xié)議在實(shí)際應(yīng)用時(shí)要在無線網(wǎng)絡(luò)的環(huán)境中利用無線網(wǎng)卡進(jìn)行通信。因此在進(jìn)行內(nèi)核系統(tǒng)設(shè)計(jì)時(shí)要支持IEEE 802.11 網(wǎng)絡(luò)協(xié)議棧、無線局域網(wǎng)以及與RT5370 網(wǎng)卡相關(guān)的驅(qū)動(dòng)和網(wǎng)絡(luò)適配器。
2)根文件系統(tǒng)。根文件系統(tǒng)不僅能將初始化的進(jìn)程從內(nèi)核態(tài)引導(dǎo)入用戶態(tài)中,還可以存儲(chǔ)AODV 協(xié)議在實(shí)現(xiàn)過程中所用到的內(nèi)核鏡像、啟動(dòng)文件、網(wǎng)絡(luò)配置工具等需要永久保存的文件信息。操作系統(tǒng)默認(rèn)的啟動(dòng)方式是虛擬的根文件系統(tǒng),因此需要將根文件系統(tǒng)的啟動(dòng)位置改為由SD 卡啟動(dòng)。
3)工程設(shè)備樹。設(shè)備樹的作用是對(duì)硬件中的外設(shè)進(jìn)行驅(qū)動(dòng),設(shè)計(jì)過程中需要對(duì)開發(fā)板中的USB 接口進(jìn)行驅(qū)動(dòng)使得能夠正常地使用RT5370 網(wǎng)卡,驅(qū)動(dòng)方式選擇了利用Petalinux 中的設(shè)備樹文件對(duì)USB 接口進(jìn)行驅(qū)動(dòng)。同一個(gè)設(shè)備樹文件可根據(jù)用戶需求同時(shí)驅(qū)動(dòng)多個(gè)外圍設(shè)備,方便日后對(duì)外設(shè)驅(qū)動(dòng)的擴(kuò)展以及管理。
4)項(xiàng)目工程編譯。在軟件設(shè)計(jì)完成后對(duì)整個(gè)項(xiàng)目進(jìn)行綜合編譯生成image.ub 鏡像文件并對(duì)uboot、fsbl 等文件進(jìn)行打包生成BOOT.BIN 啟動(dòng)文件。
AODV-UU 是在Netfilter 功能框架的基礎(chǔ)上實(shí)現(xiàn)的,分為用戶層與內(nèi)核層2 部分。路由功能模塊和轉(zhuǎn)發(fā)數(shù)據(jù)包模塊分別在用戶層和內(nèi)核層實(shí)現(xiàn),用戶層與內(nèi)核層之間通過Netlink socket 套接字進(jìn)行數(shù)據(jù)的雙向交互,運(yùn)行機(jī)制如圖4 所示。
用戶層中的aodvd 守護(hù)進(jìn)程來實(shí)現(xiàn)AODVUU 協(xié)議的路由功能模塊,路由功能模塊根據(jù)路由協(xié)議算法計(jì)算出正確的路由后通過核心應(yīng)用程序接口(application programming interface,API)來維護(hù)內(nèi)核路由表??梢栽诒3洲D(zhuǎn)發(fā)功能模塊不變的情況下通過修改路由功能模塊來實(shí)現(xiàn)AODV協(xié)議。
本次實(shí)現(xiàn)的嵌入式平臺(tái)系統(tǒng)為Linux-4.14,生成的aodvd 可執(zhí)行文件需要在該系統(tǒng)中運(yùn)行,因此將用戶層Makefile 中內(nèi)核版本的路徑改為用戶所需的內(nèi)核源碼路徑,編譯工具選擇使用交叉編譯工具,修改完成后對(duì)用戶模塊進(jìn)行編譯生成aodvd 可執(zhí)行文件,修改結(jié)果如圖5 所示。
圖5 Makefile 修改后文件
內(nèi)核層的作用是對(duì)數(shù)據(jù)包進(jìn)行通信管理,在進(jìn)行發(fā)送或者轉(zhuǎn)發(fā)之前會(huì)檢查內(nèi)核路由表中是否有該數(shù)據(jù)包的目的地址,有則直接發(fā)送數(shù)據(jù),沒有則向用戶層的守護(hù)進(jìn)程發(fā)起進(jìn)行路由的查找請(qǐng)求,由守護(hù)進(jìn)程發(fā)起路由查找。
內(nèi)核層中的代碼與移植的內(nèi)核版本相關(guān),根據(jù)內(nèi)核版本的變動(dòng)對(duì)內(nèi)核層中的模塊進(jìn)行修改。與Linux-2.6 相比Linux-4.14 中負(fù)責(zé)用戶空間與內(nèi)核空間通信的libipq 模塊被刪除,在實(shí)現(xiàn)過程中使用隊(duì)列來替代該模塊功能,實(shí)現(xiàn)后內(nèi)核與用戶空間交互如圖6 所示。
圖6 通信交互機(jī)制
在代碼層級(jí)的實(shí)現(xiàn)過程中,最重要的改變是對(duì)netlink 套接字處理函數(shù)以及進(jìn)程控制函數(shù)的改動(dòng)。其中一個(gè)是使用nlmsg_put 函數(shù)來代替NLMSG_PUT 函數(shù),該函數(shù)的作用是將發(fā)送的數(shù)據(jù)放入套接字緩沖區(qū)中。另外proc_net_create 函數(shù)被proc_create 函數(shù)代替,該函數(shù)的作用是允許AODV-UU 應(yīng)用程序訪問內(nèi)核中的路由表。最后根據(jù)內(nèi)核版本的改動(dòng),刪除和替換了相應(yīng)宏函數(shù)以及宏定義等參數(shù),例如對(duì)RW_LOCK_UNLOCK宏函數(shù)中的實(shí)參做出了修改等。
為了更好地兼容使用Petalinux 工具生成的內(nèi)核鏡像與啟動(dòng)文件,在進(jìn)行內(nèi)核層模塊編譯時(shí)同樣使用Petalinux 工具對(duì)模塊進(jìn)行編譯。首先在項(xiàng)目中創(chuàng)建1 個(gè)名稱為kaodv 的模塊。將AODVUU 中l(wèi)nx 目錄中的內(nèi)核層源文件移植到kaodv 模塊的file 文件夾中,修改kaodv.bb 文件以便將內(nèi)核層中的源文件在編譯過程中加載入該模塊中,修改結(jié)果如圖7 所示。
圖7 kaodv.bb 實(shí)現(xiàn)
進(jìn)入file 文件夾中,原本AODV-UU 內(nèi)核層中的Makefile 文件與Petalinux 中動(dòng)態(tài)模塊的編譯不兼容,需要對(duì)其模塊中的Makefile 文件進(jìn)行重寫,重新定義導(dǎo)出模塊的名稱以及需要導(dǎo)出的測(cè)試源文件,修改完成后對(duì)新建模塊進(jìn)行編譯生成kaodv.ko 動(dòng)態(tài)加載模塊,文件修改結(jié)果如圖8所示。
圖8 kaodv 模塊中Makefile 實(shí)現(xiàn)
AODV 協(xié)議在實(shí)際應(yīng)用中需運(yùn)行在Ad Hoc 網(wǎng)絡(luò)中,因此以節(jié)點(diǎn)C 為例對(duì)無線網(wǎng)卡進(jìn)行以下配置:步驟1)、2)設(shè)置網(wǎng)卡模式與essid 分別為Ad Hoc 與aodv;步驟3)、4)設(shè)置網(wǎng)卡的IP 地址;步驟5)為檢測(cè)無線網(wǎng)卡能否正常工作,網(wǎng)卡具體配置步驟為:
1) iwconfig wlan0 mode ad-hoc;
2) iwconfig wlan0 essid “aodv”;
3) ifconfig wlan0 up;
4) ifconfig wlan0 192.168.6.8;
5) iwlist wlan0 scanning aodv。
本次測(cè)試在Ad Hoc 網(wǎng)絡(luò)中進(jìn)行,其中節(jié)點(diǎn)A 為虛擬機(jī),節(jié)點(diǎn)B 與節(jié)點(diǎn)C 為PYNQ-Z2 板卡。將節(jié)點(diǎn)設(shè)為同一局域網(wǎng)段后節(jié)點(diǎn)之間相互連通,此時(shí)的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如圖9 所示,由圖10、11 可知3 個(gè)節(jié)點(diǎn)互相連通,并且TTL 為64 說明節(jié)點(diǎn)之間可以經(jīng)過一跳到達(dá)。
圖9 點(diǎn)對(duì)點(diǎn)單跳節(jié)點(diǎn)間連通
圖10 節(jié)點(diǎn)A 與節(jié)點(diǎn)B、C 連通
圖11 節(jié)點(diǎn)B 與節(jié)點(diǎn)C 連通
使用iptables 工具屏蔽節(jié)點(diǎn)A 與節(jié)點(diǎn)C 的物理地址,此時(shí)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如圖12 所示,節(jié)點(diǎn)A 再次對(duì)節(jié)點(diǎn)C 發(fā)送報(bào)文,此時(shí)2 個(gè)節(jié)點(diǎn)無法連通,如圖13 所示。
圖12 點(diǎn)對(duì)點(diǎn)單跳節(jié)點(diǎn)不連通
圖13 節(jié)點(diǎn)A 與節(jié)點(diǎn)C 不連通
最后網(wǎng)絡(luò)中各節(jié)點(diǎn)都運(yùn)行AODV 協(xié)議,首先使用insmod kaodv.ko 命令加載kaodv.ko 模塊,然后節(jié)點(diǎn)運(yùn)行aodvd 程序,此時(shí)節(jié)點(diǎn)A 與節(jié)點(diǎn)C 會(huì)將鄰居節(jié)點(diǎn)B 的IP 地址加入到內(nèi)核路由表中,節(jié)點(diǎn)B 將鄰居節(jié)點(diǎn)A、C 的IP 地址加入到內(nèi)核路由表中,此時(shí)的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如圖14 所示。隨后由節(jié)點(diǎn)A 向節(jié)點(diǎn)C 發(fā)送報(bào)文結(jié)果如圖15 所示,此時(shí)節(jié)點(diǎn)A 與節(jié)點(diǎn)C 再次連通并且存活時(shí)間(time to live,TTL)值變?yōu)?3,說明由節(jié)點(diǎn)A 經(jīng)過兩跳途經(jīng)節(jié)點(diǎn)B 到達(dá)節(jié)點(diǎn)C,使用tracepath 命令進(jìn)行路由追蹤可知節(jié)點(diǎn)A 經(jīng)過節(jié)點(diǎn)B 后到達(dá)節(jié)點(diǎn)C,路由信息如圖16 所示,由測(cè)試結(jié)果可知AODV 協(xié)議在嵌入式Linux-4.14 系統(tǒng)中測(cè)試成功。
圖14 運(yùn)行AODV 協(xié)議后拓?fù)浣Y(jié)構(gòu)圖
圖15 運(yùn)行aodvd 后節(jié)點(diǎn)A 與節(jié)點(diǎn)C 連通
圖16 節(jié)點(diǎn)A 到節(jié)點(diǎn)C 的路由追蹤
在實(shí)際的通信測(cè)試中,通過上層應(yīng)用程序由節(jié)點(diǎn)C 持續(xù)不斷的向節(jié)點(diǎn)A 發(fā)送報(bào)文,在測(cè)試中每個(gè)時(shí)間段測(cè)試5 次取平均值得到網(wǎng)絡(luò)中的平均丟包率、平均往返時(shí)間以及平均吞吐量等性能指標(biāo)。
往返時(shí)延(round-trip time,RTT)指數(shù)據(jù)包由節(jié)點(diǎn)C 發(fā)送數(shù)據(jù)到節(jié)點(diǎn)C 接收到節(jié)點(diǎn)A 的確認(rèn)總共經(jīng)過的時(shí)延。圖17 顯示了節(jié)點(diǎn)之間各時(shí)間段內(nèi)的平均往返時(shí)間保持在27 ms 左右。
圖17 平均往返時(shí)間測(cè)試結(jié)果
吞吐量指節(jié)點(diǎn)A 在單位時(shí)間內(nèi)接收到節(jié)點(diǎn)C 的數(shù)據(jù)量。圖18 顯示了網(wǎng)絡(luò)中2 個(gè)節(jié)點(diǎn)之間各時(shí)間段內(nèi)的平均吞吐量保持在70 kb/s 附近。
圖18 平均吞吐量統(tǒng)計(jì)結(jié)果
丟包率指傳輸中所丟失數(shù)據(jù)包占所發(fā)送數(shù)據(jù)包的比率。圖19 顯示了網(wǎng)絡(luò)中各時(shí)間段內(nèi)的平均丟包率在500 s 之后逐漸趨近于0.4%。
圖19 平均丟包率統(tǒng)計(jì)結(jié)果
本文概述了PYNQ-Z2 平臺(tái)的軟硬件性能,介紹了Petalinux 工具在移植過程中的作用,分析了AODV-UU 協(xié)議的運(yùn)行機(jī)制并以PYNQ-Z2 為例研究了AODV 協(xié)議在嵌入式Linux-4.14 系統(tǒng)上的實(shí)現(xiàn)方案,解決了AODV 協(xié)議在當(dāng)前嵌入式Linux系統(tǒng)中的實(shí)際應(yīng)用問題,最后對(duì)協(xié)議在實(shí)際通信過程中的平均往返時(shí)間、平均丟包率等性能指標(biāo)進(jìn)行了測(cè)試,測(cè)試結(jié)果表明各性能指標(biāo)良好具備實(shí)際應(yīng)用價(jià)值。