王磊,謝維波
(華僑大學計算機科學與技術學院,福建泉州 362021)
Ad Hoc網(wǎng)絡在嵌入式L inux上的實現(xiàn)
王磊,謝維波
(華僑大學計算機科學與技術學院,福建泉州 362021)
分析和研究嵌入式Linux系統(tǒng)開發(fā)中的關鍵技術問題及解決方法.在S3C2410處理器上成功移植適用于AdHoc網(wǎng)絡的嵌入式Linux系統(tǒng),并實現(xiàn)AdHoc網(wǎng)絡的AODV路由協(xié)議.網(wǎng)絡性能的測試表明,所移植的Linux系統(tǒng)各部分運行穩(wěn)定可靠,Ad Hoc網(wǎng)絡運行正常.
ARM處理器;嵌入式Linux;無線自組織網(wǎng);AODV協(xié)議
嵌入式系統(tǒng)是以應用為中心,以計算機為基礎,軟硬件可裁剪,適用于系統(tǒng)對功能、可靠性、成本、功耗嚴格要求的專用計算機系統(tǒng).AdHoc無線移動自組織網(wǎng)是一種特殊的對等式網(wǎng)絡,使用無線通信技術,網(wǎng)絡中的節(jié)點互相作為其鄰居(在直接通信范圍內(nèi)的節(jié)點)的路由器,通過節(jié)點轉(zhuǎn)發(fā),實現(xiàn)節(jié)點之間的通信,因此又被稱為多跳網(wǎng)絡.AdHoc網(wǎng)絡具有無中心、自組織、可快速展開、節(jié)點可移動和多跳等特點[1].這些特點使得它在戰(zhàn)場、救災等特殊場合的應用日漸受到人們的重視.因此,在嵌入式系統(tǒng)上實現(xiàn)Ad Hoc網(wǎng)絡更能發(fā)揮它的作用.本文主要描述構建適用于A d Hoc網(wǎng)絡的嵌入式系統(tǒng)環(huán)境,成功移植AODV路由協(xié)議及在此基礎上實現(xiàn)的AdHoc網(wǎng)絡.
在移植之前首先要建立交叉開發(fā)環(huán)境,安裝交叉編譯工具[2].目標平臺采用適用于PDA等手持設備和Internet設備的,韓國Sam sung公司基于ARM 920T內(nèi)核開發(fā)的一款嵌入式處理器S3C2410,其Linux內(nèi)核采用較新的Linux 2.6.24內(nèi)核.Boo tloader,Linux內(nèi)核和文件系統(tǒng)共同構成了基本的、最小的嵌入式Linux系統(tǒng).
1.1 配置編譯引導裝載程序vivi
Bootloader是在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序.它初始化硬件設備、建立內(nèi)存空間的映射圖,從而建立適當?shù)能浻布h(huán)境,為調(diào)用(運行)操作系統(tǒng)內(nèi)核做好準備.Bootloader是基于特定硬件平臺的.采用韓國M IZI公司開放的源代碼vivi,主要用于S3C2410處理器的開發(fā)板引導程序Bootloader.vivi的運行分為以下2個階段[3]:
(1)第1階段的完成包含依賴于CPU體系結(jié)構的硬件初始化代碼,包括禁止中斷、初始化串口、復制自身到RAM等,最后跳到Bootloader的下一階段(main);
(2)第2階段的完成包括8個部分,即完成打印出vivi的版本、對開發(fā)板進行初始化、內(nèi)存映射初始化和內(nèi)存管理單元的初始化、初始化堆棧、初始化m td設備、初始化私有數(shù)據(jù)、初始化內(nèi)置命令、啟動內(nèi)核或進入命令行狀態(tài).
在移植vivi的過程中,要修改開發(fā)板的內(nèi)存設置.在sm dk.c文件中,數(shù)組default_m td_partitions定義了存儲器空間的劃分.圖1是vivi啟動后的默認分區(qū).通過part命令進行m td分區(qū),但重置后需要恢復默認.分區(qū)的地址是引導程序、內(nèi)核映像及文件系統(tǒng)下載到NandFlash的真正地址.修改smdk.c中內(nèi)核啟動參數(shù)為
圖1 vivi的Flash分區(qū)Fig.1 Flash partition of vivi
參數(shù)為vivi啟動后的默認值,也可用parm set命令進行修改,是傳遞給內(nèi)核的啟動參數(shù),其他參數(shù)可以默認.交叉編譯vivi成功后會生成一個bin文件,用Jtag下載到Nand-Flash中,啟動目標板,并按著空格鍵,進入vivi命令行.
1.2 配置編譯Linux內(nèi)核
Linux 2.6內(nèi)核的編譯與Linux 2.4版本的內(nèi)核的編譯有些不同.Linux 2.6內(nèi)核的編譯,只需要make命令,代替了make dep,make z Image和make modules.Make menuconfig配置內(nèi)核后,只要運行make命令就行.編譯前要對內(nèi)核代碼進行一些修改,主要有如下6個步驟.
(1)修改頂層的Makefile文件.ARCH=arm CROSS_COM PILE=/usr/local/arm/3.4.1/bin/ arm-linux.
(2)修改內(nèi)核M TD分區(qū).內(nèi)核M TD分區(qū)必須與vivi的分區(qū)相一致.因為vivi分區(qū)中的地址是引導程序、內(nèi)核映像及文件系統(tǒng)下載到NandFlash的真正地址.內(nèi)核啟動時,內(nèi)核并不是去讀vivi分區(qū)中的地址,而是去讀內(nèi)核M TD分區(qū)設定的地址.所以,如果兩者不同,將導致不能正常啟動內(nèi)核或根文件系統(tǒng).需要注意的是,Linux 2.6.16(含)以前的內(nèi)核沒有分區(qū)信息,需自己添加;Linux 2.6.17(含)以后的內(nèi)核文件中已含有分區(qū)信息,只需修改arch/arm/mach-s3c2410/common-smdk.c文件里的函數(shù)“m td_partition sm dk_default_nand_part[]={}”,使其地址與vivi中的分區(qū)地址一致.
(3)禁止 Flash ECC校驗.內(nèi)核都是通過Bootloader寫到NandFlash的.Bootloader通過軟件ECC算法產(chǎn)生ECC校驗碼,與內(nèi)核校驗 ECC碼不一樣.內(nèi)核中的 ECC碼是由S3C2410中的Nand-Flash控制器產(chǎn)生的.所以,要禁止內(nèi)核ECC校驗.修改s3c2410.c代碼中“chip->ecc.mode=NAND_ ECC_NONE”.
(4)支持啟動時掛載devfs.從Linux 2.6.12內(nèi)核起,devfs選項從內(nèi)核配置中刪除.為了讓內(nèi)核支持devfs及在啟動時/sbin/init運行之前能自動掛載/dev為devfs文件系統(tǒng),應修改fs/Kconfig文件,如圖 2所示.在文件 fs/Kconfig中找到 menu“Pseudo filesystem”語句,然后在其后添加圖2中所示語句.
圖2 修改fs/Kconfig文件Fig.2 Modify the fs/Kconfig file
(5)匹配machine ID.vivi傳遞給內(nèi)核的machine ID必須與內(nèi)核代碼中的ID一致.系統(tǒng)中的ID為193,其他處理器的值定義在/arch/arm/tools/mach-types文件中.
(6)內(nèi)核配置.在配置內(nèi)核時,對需要的功能進行配置和去除不需要的模塊,以此來減小內(nèi)核體積.運行make menconfig進行配置,在s3c2410_defconfig默認配置基礎上進行裁減.需要加入M TD分區(qū)及Nand Flash支持、文件系統(tǒng)ram disk支持,對于Ad Hoc網(wǎng)絡,還需要加上無線網(wǎng)絡、無線網(wǎng)卡zd1211b驅(qū)動、USB驅(qū)動、模塊可加載及NetFilter等支持.
1.3 制作根文件系統(tǒng)
雖然Linux系統(tǒng)的核心是內(nèi)核,但文件卻是用戶與操作系統(tǒng)交互的主要工具.根據(jù) FHS描述Linux根文件系統(tǒng)的目錄結(jié)構,來創(chuàng)建嵌入式Linux根目錄結(jié)構.創(chuàng)建一個偽根目錄,在其中/bin,/sbin下存放各種可執(zhí)行程序,在/etc下存放配置文件,在/dev目錄下存放常見必要的設備節(jié)點等.系統(tǒng)使用Busybox來創(chuàng)建可執(zhí)行文件,若Busybox使用動態(tài)鏈接,還要在/lib目錄下包含庫文件.
主要關鍵的細節(jié)有:負責舊版本的設備管理系統(tǒng)devfs已被廢除,因此是從Linux 2.6.18開始的.新版本的udev(系統(tǒng)中使用的是Busybox提供的mdev)是一個基于用戶空間的設備管理系統(tǒng),在內(nèi)核啟動時并不能自動創(chuàng)建設備節(jié)點,需要手動在dev/目錄下創(chuàng)建各種節(jié)點,即設備文件.
涉及系統(tǒng)啟動過程的設備有/dev/m tdblock*(M TD塊設備),/dev/ttySAC*(串口),/dev/console(控制終端),/dev/null,只要建立以上設備就可以啟動系統(tǒng).其他設備可以當系統(tǒng)啟動后,使用“cat/ proc/devices”命令查看內(nèi)核中注冊了哪些設備,然后一一創(chuàng)建相應的設備文件.設備號可從內(nèi)核源代碼的Documentation/devices.txt中獲得.其他配置文件的編寫不再贅述.
基于嵌入式Linux協(xié)議棧,在嵌入式ARM-Linux環(huán)境下實現(xiàn)AODV路由協(xié)議.目前多數(shù)已經(jīng)發(fā)布的AODV實現(xiàn)都利用了Netfilter功能框架.Netfilter是Linux 2.4內(nèi)核實現(xiàn)報文過濾、報文處理、報文轉(zhuǎn)發(fā)等的功能框架.
采用的AODV協(xié)議是開源的aodv-uu-0.9.5,其實現(xiàn)方法是:AODV協(xié)議作為用戶層后臺程序?qū)崿F(xiàn)的,包括兩個可裝載的Linux內(nèi)核模塊(kaodv和ip_queue_aodv);使用Netfilter來截獲本地外及本地內(nèi)的報文,但它是在用戶層運行的.Kaodv模塊使用Netfilter通過返回NF_QUEUE來緩存用戶層的所有報文,ip_queue_aodv對用戶層報文進行排隊.將所有報文的目的地址與用戶層路由緩存進行匹配,在用戶層緩存需要路由請求的報文,并立刻返回己存在路由的報文[4].
Aodv路由協(xié)議移植即將aodv-uu-0.9.5移植到ARM-Linux中,主要有以下幾個方面.
(1)內(nèi)核的配置要求.直接編譯到內(nèi)核中的,也可以編譯成模塊ip_queue.ko,然后掛載.
(2)修改M akefile.修改內(nèi)核的版本號,將 KERNEL=$(shell uname-r)改為 KERNEL=2.6.24;修改內(nèi)核的源碼路徑,文中的內(nèi)核源碼路徑為/adhoc/linux-2.6.24,即將 KERNEL_D IR=/lib/modules/$(KERNEL)/build改為 KERNEL_D IR=/adhoc/linux-2.6.24.
(3)修改參數(shù).Linux 2.6的內(nèi)核中的函數(shù)ip_route_me_harder多了1個參數(shù),所以在調(diào)用的時候要增加1個參數(shù).即將ip_route_me_harder(skb)改為ip_route_me_harder(skb,RTN_UNSPEC).
(4)編譯后,將在當前目錄下生成aodvd的可執(zhí)行文件,在lnx目錄中將生成kaodv.ko模塊.
圖3 網(wǎng)絡的拓撲結(jié)構Fig.3 Topology of network
使用802.11b/g無線網(wǎng)卡ZD1211b作為傳輸設備,Linux 2.6內(nèi)核版本加入了對該網(wǎng)卡的支持.設置essid和rate,運行aodvd,將無線網(wǎng)卡改成AdHoc模式.網(wǎng)絡采用1臺PC機作為A節(jié)點(192.168. 1.3),兩臺目標平臺分別作為節(jié)點B(192.168.1.5)和節(jié)點C(192.168.1.7).其網(wǎng)絡的拓撲結(jié)構,如圖3所示.
3.1 連通性測試
使用Linux操作系統(tǒng)提供的Ping命令來完成該項測試.Ping命令提供了“-R”選項,可以記錄下Ping數(shù)據(jù)包所經(jīng)過的所有節(jié)點的地址.具體有如下3個主要步驟.
(1)同時打開所有節(jié)點的AODV功能.
(2)檢查A節(jié)點的路由表.確定存在到B節(jié)點的路由,而沒有到C節(jié)點的路由.B節(jié)點的路由是由于B節(jié)點發(fā)送“HELLO”消息來確定的.
(3)A節(jié)點與C節(jié)點通信.通過向C節(jié)點發(fā)送ping命令來發(fā)送數(shù)據(jù)分組.經(jīng)過短時間的延遲,得到C節(jié)點的回復.此時檢查路由表,可以發(fā)現(xiàn)增加了到C節(jié)點的路由,A的下一跳是B節(jié)點.開始時,節(jié)點A沒有去往節(jié)點C的路由,必須先發(fā)送RREQ,啟動路由發(fā)現(xiàn),節(jié)點C收到RREQ后,返回RREP(由節(jié)點B轉(zhuǎn)發(fā)給節(jié)點A),由此建立路由A-B-C.
在節(jié)點A執(zhí)行“Ping R 192.168.1.7”,結(jié)果如圖4所示.從圖4可以看到,節(jié)點A發(fā)送給節(jié)點C的數(shù)據(jù)包所經(jīng)過的路徑是A→B→C→B→A.由此可知,經(jīng)過B節(jié)點上的AODV模塊的路由功能將Ping數(shù)據(jù)包轉(zhuǎn)發(fā),使得不能直接通信的節(jié)點A和節(jié)點C實現(xiàn)了數(shù)據(jù)傳輸,驗證了本系統(tǒng)的AODV模塊可以提供數(shù)據(jù)多跳傳輸?shù)墓δ?
3.2 性能測試
在A節(jié)點上設置FTP服務器,通過 Ping命令測試端到端的延遲和路由發(fā)現(xiàn)時間,通過FTP下載A節(jié)點的文件以測試吞吐量.
(1)端到端的延遲和路由發(fā)現(xiàn)時間[5].Ping包可以記錄往返時間RTT(Round Trip Times),從而反映端到端的延遲.使用Ping工具來測試單鏈N跳Ad Hoc網(wǎng)絡的RTT值,N=1,2.測試結(jié)果表明:性能跳數(shù)1(B),2(C)端到端的延遲時間分別為1.6, 3.1 m s,而其路由發(fā)現(xiàn)時間分別為4.8,17.5 m s.
(2)端到端的吞吐量.測試吞吐量的時候,當從節(jié)點C上通過節(jié)點B中轉(zhuǎn)來下載節(jié)點A上的ftp文件時,在多個時刻進行測試,每次傳輸時間大概10 min左右.性能跳數(shù)1(B),2(C)的吞吐量的多次測量結(jié)果,其平均值分別為150,56 kB·s-1.
圖4 連通性測試結(jié)果Fig.4 Results of connectivity testing
目前,針對A d Hoc網(wǎng)絡路由協(xié)議的研究多是在仿真的環(huán)境中進行的.但是,由于物理層和協(xié)議的某些不恰當、不精確的模型不能正確和真實地反映節(jié)點的移動性,因此在真實的環(huán)境中實現(xiàn)和評估路由協(xié)議是十分必要的.更何況這也是Ad Hoc網(wǎng)絡實際應用的必由之路.
在ARM處理器S3C2410上構建適用于A dHoc網(wǎng)絡的嵌入式Linux系統(tǒng),在所構建的嵌入式Linux系統(tǒng)上實現(xiàn)AdHoc網(wǎng)絡的AODV路由協(xié)議,組建具有自主知識產(chǎn)權的嵌入式AdHoc網(wǎng)絡.同時,針對S3C2410處理器,提出嵌入式Linux系統(tǒng)開發(fā)中的關鍵技術問題及解決方法,對于Ad Hoc網(wǎng)絡的實現(xiàn)和應用,以及基于嵌入式Linux的應用開發(fā)都具有一定的參考意義.
篇幅有限,文中僅指出系統(tǒng)實施過程中的關鍵技術細節(jié),而省略了具體的命令步驟.下一步要做的工作是,對AODV代碼進行優(yōu)化及對A d Hoc網(wǎng)絡的安全性保障.
[1]鄭少仁,王海濤,趙志峰,等.Ad Hoc網(wǎng)絡技術[M].北京:人民郵電出版社,2005.
[2]宋凱,嚴麗平,甘嵐,等.ARM Linux在S3C2410上的移植[J].計算機工程與設計,2008,29(16):4138-4140.
[3]楊水清,張劍,施云飛,等.ARM嵌入式Linux系統(tǒng)開發(fā)技術詳解[M].北京:電子工業(yè)出版社,2008.
[4]劉煥敏.Linux平臺Ad Hoc網(wǎng)絡按需路由協(xié)議實現(xiàn)技術研究[D].長沙:國防科學技術大學,2005.
[5]洪家軍,吳金龍.利用NS-2實現(xiàn)Ad Hoc網(wǎng)絡仿真平臺[J].華僑大學學報:自然科學版,2008,29(3):375-378.
(責任編輯:陳志賢英文審校:吳逢鐵)
Implementation of Ad Hoc Network Based on Embedded L inux
WANG Lei,XIEWei-bo
(College of Computer Science and Technology,Huaqiao University,Quanzhou 362021,China)
The key technologies and solutions of development on the embedded Linux system are presented in this paper. An embedded Linux system applicable for the Ad Hoc network is transplanted on the ARM S3C2410 processor,and the AODV protocol of AdHoc network is implemented based on that.Testing on the Network performance shows that the Linux system is steady and the A d Hoc network runs normally.
ARM processor;embedded Linux;wireless ad hoc network;AODV protocol
TP 393
A
1000-5013(2011)02-0161-04
2009-09-03
謝維波(1964-),男,教授,主要從事信號與信息處理、嵌入式技術的研究.E-mail:xw blxf@hqu.edu.cn.
福建省廈門市科技計劃項目(3502Z20083047)