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