劉玉梅,馬文進
哈爾濱工程大學 信息與通信工程學院,黑龍江 哈爾濱 150001
隨著物聯網技術的發展,嵌入式系統在基礎與應用研究領域越來越重要[1]。嵌入式軟件系統的主要核心部件為微型嵌入式[2]處理器,硬件系統的框架主要包括硬件處理器、硬件存儲器、應用軟件和硬件I/O。嵌入式系統具有強大的實時性、系統內核小、功能專用性強、軟件系統功能精簡等優點,因此其應用已經深入到國防、科研以及日常生活等各個領域中[3]。
無線自組網按需距離矢量路由協議(Ad hoc on-demand distance vector routing,AODV)[4]是應用于無線Ad-Hoc 網絡[5]中進行路由選擇的路由協議,它能夠實現單播和多播,同時該協議是Ad Hoc 網絡中按需生成路由方式的典型協議,目前Ad Hoc 網絡中的AODV 協議的性能主要利用NS2 仿真軟件在理想環境中對該協議的端對端平均時延、路由開銷等性能進行評估,但是只依靠仿真無法反應在實際通信場景中環境因素對協議通信過程中的丟包率、時延等指標的影響,因此需要對AODV 協議在實際應用中的性能進行統計測試[6]。
AODV[7]路由協議有多種的實現的版本,例如 Mad-Hoc[8]、 AODV-UCSB[9]、 AODV-UU[10]、Kernel-AODV[11]和AODV-UIUC。其中,AODV-UU協議是由瑞典烏普薩拉大學(Uppsala University)聯合愛立信公司發布的一種路由協議,是一種穩定且開源的協議實現[12]。
AODV-UU 源代碼能夠在Linux-2.6[13]以及Linux-3.8 的內核版本中實現,但與當前主流的Linux-4.0 以上的版本不能兼容。本文在ZYNQ-7 000平臺下,研究了將AODV-UU 協議在嵌入式Linux-4.14 內核系統上實現的關鍵技術。
1)PYNQ-Z2 開發板。為了方便上層應用程序在功能擴展時需要增加外圍設備的需求,在開發板的選型上選擇了由處理系統(processing system,PS)以及可編程邏輯(progarmmable logic,PL)共2 部分所組成的PYNQ-Z2 開發板。PYNQZ2[14]采用的是ZYNQ-7000 系列[15]的XC7Z020-1CLG400C 型號的系統級芯片(system on chip,SOC),內部異構了雙核ARM Cortex-A9 CPU 以及現場可編程門陣列(field programmable gate array,FPGA),具體的實現過程中用到了PS 部分中的USB、SD 卡、UART 以及Eth0 等接口[16],PYNQZ2 處理系統結構如圖1 所示。

圖1 PYNQ-Z2 處理系統結構
2)USB WiFi 網卡。網卡的選型需要與所工作的內核系統相適配,由于Linux-4.14 的內核系統可通過內部驅動支持RT5370 型號網卡,所以網卡最終選型為支持Ad Hoc 模式的RT5370。
3)Micro SD 卡。SD 作為內核鏡像、啟動文件、根文件系統以及協議可執行文件的存放載體,因此SD 卡需要能夠進行高速的數據讀寫并且容量最小為16 GB。
方案包括了硬件電路接口設計以及Linux 系統定制化設計2 個部分。使用Xilinx 公司的Vivado 軟件對硬件電路接口進行設計,Petalinux集成開發工具對Linux 系統內核、根文件系統、設備樹等完成定制化設計,避免了對各部分模塊的單獨設計與編譯。圖2 為軟件設計方案。

圖2 軟件設計方案
硬件電路接口設計中根據所需功能對PYNQZ2 開發板中的各個接口進行用戶設計。設計過程中針對開發板自身特性對PS 端的相關接口進行使能連通開發板中相關電路,對PL 端接口失能減少電路中的冗余部分,圖3 為最終的硬件電路設計圖。

圖3 ZYNQ 處理系統實現
在Linux 系統的定制化中對內核系統、根文件系統以及設備樹進行用戶級設計。
1)內核系統。AODV 協議在實際應用時要在無線網絡的環境中利用無線網卡進行通信。因此在進行內核系統設計時要支持IEEE 802.11 網絡協議棧、無線局域網以及與RT5370 網卡相關的驅動和網絡適配器。
2)根文件系統。根文件系統不僅能將初始化的進程從內核態引導入用戶態中,還可以存儲AODV 協議在實現過程中所用到的內核鏡像、啟動文件、網絡配置工具等需要永久保存的文件信息。操作系統默認的啟動方式是虛擬的根文件系統,因此需要將根文件系統的啟動位置改為由SD 卡啟動。
3)工程設備樹。設備樹的作用是對硬件中的外設進行驅動,設計過程中需要對開發板中的USB 接口進行驅動使得能夠正常地使用RT5370 網卡,驅動方式選擇了利用Petalinux 中的設備樹文件對USB 接口進行驅動。同一個設備樹文件可根據用戶需求同時驅動多個外圍設備,方便日后對外設驅動的擴展以及管理。
4)項目工程編譯。在軟件設計完成后對整個項目進行綜合編譯生成image.ub 鏡像文件并對uboot、fsbl 等文件進行打包生成BOOT.BIN 啟動文件。
AODV-UU 是在Netfilter 功能框架的基礎上實現的,分為用戶層與內核層2 部分。路由功能模塊和轉發數據包模塊分別在用戶層和內核層實現,用戶層與內核層之間通過Netlink socket 套接字進行數據的雙向交互,運行機制如圖4 所示。
用戶層中的aodvd 守護進程來實現AODVUU 協議的路由功能模塊,路由功能模塊根據路由協議算法計算出正確的路由后通過核心應用程序接口(application programming interface,API)來維護內核路由表。可以在保持轉發功能模塊不變的情況下通過修改路由功能模塊來實現AODV協議。
本次實現的嵌入式平臺系統為Linux-4.14,生成的aodvd 可執行文件需要在該系統中運行,因此將用戶層Makefile 中內核版本的路徑改為用戶所需的內核源碼路徑,編譯工具選擇使用交叉編譯工具,修改完成后對用戶模塊進行編譯生成aodvd 可執行文件,修改結果如圖5 所示。

圖5 Makefile 修改后文件
內核層的作用是對數據包進行通信管理,在進行發送或者轉發之前會檢查內核路由表中是否有該數據包的目的地址,有則直接發送數據,沒有則向用戶層的守護進程發起進行路由的查找請求,由守護進程發起路由查找。
內核層中的代碼與移植的內核版本相關,根據內核版本的變動對內核層中的模塊進行修改。與Linux-2.6 相比Linux-4.14 中負責用戶空間與內核空間通信的libipq 模塊被刪除,在實現過程中使用隊列來替代該模塊功能,實現后內核與用戶空間交互如圖6 所示。

圖6 通信交互機制
在代碼層級的實現過程中,最重要的改變是對netlink 套接字處理函數以及進程控制函數的改動。其中一個是使用nlmsg_put 函數來代替NLMSG_PUT 函數,該函數的作用是將發送的數據放入套接字緩沖區中。另外proc_net_create 函數被proc_create 函數代替,該函數的作用是允許AODV-UU 應用程序訪問內核中的路由表。最后根據內核版本的改動,刪除和替換了相應宏函數以及宏定義等參數,例如對RW_LOCK_UNLOCK宏函數中的實參做出了修改等。
為了更好地兼容使用Petalinux 工具生成的內核鏡像與啟動文件,在進行內核層模塊編譯時同樣使用Petalinux 工具對模塊進行編譯。首先在項目中創建1 個名稱為kaodv 的模塊。將AODVUU 中lnx 目錄中的內核層源文件移植到kaodv 模塊的file 文件夾中,修改kaodv.bb 文件以便將內核層中的源文件在編譯過程中加載入該模塊中,修改結果如圖7 所示。

圖7 kaodv.bb 實現
進入file 文件夾中,原本AODV-UU 內核層中的Makefile 文件與Petalinux 中動態模塊的編譯不兼容,需要對其模塊中的Makefile 文件進行重寫,重新定義導出模塊的名稱以及需要導出的測試源文件,修改完成后對新建模塊進行編譯生成kaodv.ko 動態加載模塊,文件修改結果如圖8所示。

圖8 kaodv 模塊中Makefile 實現
AODV 協議在實際應用中需運行在Ad Hoc 網絡中,因此以節點C 為例對無線網卡進行以下配置:步驟1)、2)設置網卡模式與essid 分別為Ad Hoc 與aodv;步驟3)、4)設置網卡的IP 地址;步驟5)為檢測無線網卡能否正常工作,網卡具體配置步驟為:
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。
本次測試在Ad Hoc 網絡中進行,其中節點A 為虛擬機,節點B 與節點C 為PYNQ-Z2 板卡。將節點設為同一局域網段后節點之間相互連通,此時的網絡拓撲結構如圖9 所示,由圖10、11 可知3 個節點互相連通,并且TTL 為64 說明節點之間可以經過一跳到達。

圖9 點對點單跳節點間連通

圖10 節點A 與節點B、C 連通

圖11 節點B 與節點C 連通
使用iptables 工具屏蔽節點A 與節點C 的物理地址,此時網絡拓撲結構如圖12 所示,節點A 再次對節點C 發送報文,此時2 個節點無法連通,如圖13 所示。

圖12 點對點單跳節點不連通

圖13 節點A 與節點C 不連通
最后網絡中各節點都運行AODV 協議,首先使用insmod kaodv.ko 命令加載kaodv.ko 模塊,然后節點運行aodvd 程序,此時節點A 與節點C 會將鄰居節點B 的IP 地址加入到內核路由表中,節點B 將鄰居節點A、C 的IP 地址加入到內核路由表中,此時的網絡拓撲結構如圖14 所示。隨后由節點A 向節點C 發送報文結果如圖15 所示,此時節點A 與節點C 再次連通并且存活時間(time to live,TTL)值變為63,說明由節點A 經過兩跳途經節點B 到達節點C,使用tracepath 命令進行路由追蹤可知節點A 經過節點B 后到達節點C,路由信息如圖16 所示,由測試結果可知AODV 協議在嵌入式Linux-4.14 系統中測試成功。

圖14 運行AODV 協議后拓撲結構圖

圖15 運行aodvd 后節點A 與節點C 連通

圖16 節點A 到節點C 的路由追蹤
在實際的通信測試中,通過上層應用程序由節點C 持續不斷的向節點A 發送報文,在測試中每個時間段測試5 次取平均值得到網絡中的平均丟包率、平均往返時間以及平均吞吐量等性能指標。
往返時延(round-trip time,RTT)指數據包由節點C 發送數據到節點C 接收到節點A 的確認總共經過的時延。圖17 顯示了節點之間各時間段內的平均往返時間保持在27 ms 左右。

圖17 平均往返時間測試結果
吞吐量指節點A 在單位時間內接收到節點C 的數據量。圖18 顯示了網絡中2 個節點之間各時間段內的平均吞吐量保持在70 kb/s 附近。

圖18 平均吞吐量統計結果
丟包率指傳輸中所丟失數據包占所發送數據包的比率。圖19 顯示了網絡中各時間段內的平均丟包率在500 s 之后逐漸趨近于0.4%。

圖19 平均丟包率統計結果
本文概述了PYNQ-Z2 平臺的軟硬件性能,介紹了Petalinux 工具在移植過程中的作用,分析了AODV-UU 協議的運行機制并以PYNQ-Z2 為例研究了AODV 協議在嵌入式Linux-4.14 系統上的實現方案,解決了AODV 協議在當前嵌入式Linux系統中的實際應用問題,最后對協議在實際通信過程中的平均往返時間、平均丟包率等性能指標進行了測試,測試結果表明各性能指標良好具備實際應用價值。