Ad Hoc网络在嵌入式L inux上的实现

2011-09-25 03:24王磊谢维波
关键词:内核报文分区

王磊,谢维波

(华侨大学计算机科学与技术学院,福建泉州 362021)

Ad Hoc网络在嵌入式L inux上的实现

王磊,谢维波

(华侨大学计算机科学与技术学院,福建泉州 362021)

分析和研究嵌入式Linux系统开发中的关键技术问题及解决方法.在S3C2410处理器上成功移植适用于AdHoc网络的嵌入式Linux系统,并实现AdHoc网络的AODV路由协议.网络性能的测试表明,所移植的Linux系统各部分运行稳定可靠,Ad Hoc网络运行正常.

ARM处理器;嵌入式Linux;无线自组织网;AODV协议

嵌入式系统是以应用为中心,以计算机为基础,软硬件可裁剪,适用于系统对功能、可靠性、成本、功耗严格要求的专用计算机系统.AdHoc无线移动自组织网是一种特殊的对等式网络,使用无线通信技术,网络中的节点互相作为其邻居(在直接通信范围内的节点)的路由器,通过节点转发,实现节点之间的通信,因此又被称为多跳网络.AdHoc网络具有无中心、自组织、可快速展开、节点可移动和多跳等特点[1].这些特点使得它在战场、救灾等特殊场合的应用日渐受到人们的重视.因此,在嵌入式系统上实现Ad Hoc网络更能发挥它的作用.本文主要描述构建适用于A d Hoc网络的嵌入式系统环境,成功移植AODV路由协议及在此基础上实现的AdHoc网络.

1 嵌入式L inux系统的移植

在移植之前首先要建立交叉开发环境,安装交叉编译工具[2].目标平台采用适用于PDA等手持设备和Internet设备的,韩国Sam sung公司基于ARM 920T内核开发的一款嵌入式处理器S3C2410,其Linux内核采用较新的Linux 2.6.24内核.Boo tloader,Linux内核和文件系统共同构成了基本的、最小的嵌入式Linux系统.

1.1 配置编译引导装载程序vivi

Bootloader是在操作系统内核运行之前运行的一段小程序.它初始化硬件设备、建立内存空间的映射图,从而建立适当的软硬件环境,为调用(运行)操作系统内核做好准备.Bootloader是基于特定硬件平台的.采用韩国M IZI公司开放的源代码vivi,主要用于S3C2410处理器的开发板引导程序Bootloader.vivi的运行分为以下2个阶段[3]:

(1)第1阶段的完成包含依赖于CPU体系结构的硬件初始化代码,包括禁止中断、初始化串口、复制自身到RAM等,最后跳到Bootloader的下一阶段(main);

(2)第2阶段的完成包括8个部分,即完成打印出vivi的版本、对开发板进行初始化、内存映射初始化和内存管理单元的初始化、初始化堆栈、初始化m td设备、初始化私有数据、初始化内置命令、启动内核或进入命令行状态.

在移植vivi的过程中,要修改开发板的内存设置.在sm dk.c文件中,数组default_m td_partitions定义了存储器空间的划分.图1是vivi启动后的默认分区.通过part命令进行m td分区,但重置后需要恢复默认.分区的地址是引导程序、内核映像及文件系统下载到NandFlash的真正地址.修改smdk.c中内核启动参数为

图1 vivi的Flash分区Fig.1 Flash partition of vivi

参数为vivi启动后的默认值,也可用parm set命令进行修改,是传递给内核的启动参数,其他参数可以默认.交叉编译vivi成功后会生成一个bin文件,用Jtag下载到Nand-Flash中,启动目标板,并按着空格键,进入vivi命令行.

1.2 配置编译Linux内核

Linux 2.6内核的编译与Linux 2.4版本的内核的编译有些不同.Linux 2.6内核的编译,只需要make命令,代替了make dep,make z Image和make modules.Make menuconfig配置内核后,只要运行make命令就行.编译前要对内核代码进行一些修改,主要有如下6个步骤.

(1)修改顶层的Makefile文件.ARCH=arm CROSS_COM PILE=/usr/local/arm/3.4.1/bin/ arm-linux.

(2)修改内核M TD分区.内核M TD分区必须与vivi的分区相一致.因为vivi分区中的地址是引导程序、内核映像及文件系统下载到NandFlash的真正地址.内核启动时,内核并不是去读vivi分区中的地址,而是去读内核M TD分区设定的地址.所以,如果两者不同,将导致不能正常启动内核或根文件系统.需要注意的是,Linux 2.6.16(含)以前的内核没有分区信息,需自己添加;Linux 2.6.17(含)以后的内核文件中已含有分区信息,只需修改arch/arm/mach-s3c2410/common-smdk.c文件里的函数“m td_partition sm dk_default_nand_part[]={}”,使其地址与vivi中的分区地址一致.

(3)禁止 Flash ECC校验.内核都是通过Bootloader写到NandFlash的.Bootloader通过软件ECC算法产生ECC校验码,与内核校验 ECC码不一样.内核中的 ECC码是由S3C2410中的Nand-Flash控制器产生的.所以,要禁止内核ECC校验.修改s3c2410.c代码中“chip->ecc.mode=NAND_ ECC_NONE”.

(4)支持启动时挂载devfs.从Linux 2.6.12内核起,devfs选项从内核配置中删除.为了让内核支持devfs及在启动时/sbin/init运行之前能自动挂载/dev为devfs文件系统,应修改fs/Kconfig文件,如图 2所示.在文件 fs/Kconfig中找到 menu“Pseudo filesystem”语句,然后在其后添加图2中所示语句.

图2 修改fs/Kconfig文件Fig.2 Modify the fs/Kconfig file

(5)匹配machine ID.vivi传递给内核的machine ID必须与内核代码中的ID一致.系统中的ID为193,其他处理器的值定义在/arch/arm/tools/mach-types文件中.

(6)内核配置.在配置内核时,对需要的功能进行配置和去除不需要的模块,以此来减小内核体积.运行make menconfig进行配置,在s3c2410_defconfig默认配置基础上进行裁减.需要加入M TD分区及Nand Flash支持、文件系统ram disk支持,对于Ad Hoc网络,还需要加上无线网络、无线网卡zd1211b驱动、USB驱动、模块可加载及NetFilter等支持.

1.3 制作根文件系统

虽然Linux系统的核心是内核,但文件却是用户与操作系统交互的主要工具.根据 FHS描述Linux根文件系统的目录结构,来创建嵌入式Linux根目录结构.创建一个伪根目录,在其中/bin,/sbin下存放各种可执行程序,在/etc下存放配置文件,在/dev目录下存放常见必要的设备节点等.系统使用Busybox来创建可执行文件,若Busybox使用动态链接,还要在/lib目录下包含库文件.

主要关键的细节有:负责旧版本的设备管理系统devfs已被废除,因此是从Linux 2.6.18开始的.新版本的udev(系统中使用的是Busybox提供的mdev)是一个基于用户空间的设备管理系统,在内核启动时并不能自动创建设备节点,需要手动在dev/目录下创建各种节点,即设备文件.

涉及系统启动过程的设备有/dev/m tdblock*(M TD块设备),/dev/ttySAC*(串口),/dev/console(控制终端),/dev/null,只要建立以上设备就可以启动系统.其他设备可以当系统启动后,使用“cat/ proc/devices”命令查看内核中注册了哪些设备,然后一一创建相应的设备文件.设备号可从内核源代码的Documentation/devices.txt中获得.其他配置文件的编写不再赘述.

2 移植AODV路由协议

基于嵌入式Linux协议栈,在嵌入式ARM-Linux环境下实现AODV路由协议.目前多数已经发布的AODV实现都利用了Netfilter功能框架.Netfilter是Linux 2.4内核实现报文过滤、报文处理、报文转发等的功能框架.

采用的AODV协议是开源的aodv-uu-0.9.5,其实现方法是:AODV协议作为用户层后台程序实现的,包括两个可装载的Linux内核模块(kaodv和ip_queue_aodv);使用Netfilter来截获本地外及本地内的报文,但它是在用户层运行的.Kaodv模块使用Netfilter通过返回NF_QUEUE来缓存用户层的所有报文,ip_queue_aodv对用户层报文进行排队.将所有报文的目的地址与用户层路由缓存进行匹配,在用户层缓存需要路由请求的报文,并立刻返回己存在路由的报文[4].

Aodv路由协议移植即将aodv-uu-0.9.5移植到ARM-Linux中,主要有以下几个方面.

(1)内核的配置要求.直接编译到内核中的,也可以编译成模块ip_queue.ko,然后挂载.

(2)修改M akefile.修改内核的版本号,将 KERNEL=$(shell uname-r)改为 KERNEL=2.6.24;修改内核的源码路径,文中的内核源码路径为/adhoc/linux-2.6.24,即将 KERNEL_D IR=/lib/modules/$(KERNEL)/build改为 KERNEL_D IR=/adhoc/linux-2.6.24.

(3)修改参数.Linux 2.6的内核中的函数ip_route_me_harder多了1个参数,所以在调用的时候要增加1个参数.即将ip_route_me_harder(skb)改为ip_route_me_harder(skb,RTN_UNSPEC).

(4)编译后,将在当前目录下生成aodvd的可执行文件,在lnx目录中将生成kaodv.ko模块.

3 组建Ad Hoc无线网络及网络性能测试

图3 网络的拓扑结构Fig.3 Topology of network

使用802.11b/g无线网卡ZD1211b作为传输设备,Linux 2.6内核版本加入了对该网卡的支持.设置essid和rate,运行aodvd,将无线网卡改成AdHoc模式.网络采用1台PC机作为A节点(192.168. 1.3),两台目标平台分别作为节点B(192.168.1.5)和节点C(192.168.1.7).其网络的拓扑结构,如图3所示.

3.1 连通性测试

使用Linux操作系统提供的Ping命令来完成该项测试.Ping命令提供了“-R”选项,可以记录下Ping数据包所经过的所有节点的地址.具体有如下3个主要步骤.

(1)同时打开所有节点的AODV功能.

(2)检查A节点的路由表.确定存在到B节点的路由,而没有到C节点的路由.B节点的路由是由于B节点发送“HELLO”消息来确定的.

(3)A节点与C节点通信.通过向C节点发送ping命令来发送数据分组.经过短时间的延迟,得到C节点的回复.此时检查路由表,可以发现增加了到C节点的路由,A的下一跳是B节点.开始时,节点A没有去往节点C的路由,必须先发送RREQ,启动路由发现,节点C收到RREQ后,返回RREP(由节点B转发给节点A),由此建立路由A-B-C.

在节点A执行“Ping R 192.168.1.7”,结果如图4所示.从图4可以看到,节点A发送给节点C的数据包所经过的路径是A→B→C→B→A.由此可知,经过B节点上的AODV模块的路由功能将Ping数据包转发,使得不能直接通信的节点A和节点C实现了数据传输,验证了本系统的AODV模块可以提供数据多跳传输的功能.

3.2 性能测试

在A节点上设置FTP服务器,通过 Ping命令测试端到端的延迟和路由发现时间,通过FTP下载A节点的文件以测试吞吐量.

(1)端到端的延迟和路由发现时间[5].Ping包可以记录往返时间RTT(Round Trip Times),从而反映端到端的延迟.使用Ping工具来测试单链N跳Ad Hoc网络的RTT值,N=1,2.测试结果表明:性能跳数1(B),2(C)端到端的延迟时间分别为1.6, 3.1 m s,而其路由发现时间分别为4.8,17.5 m s.

(2)端到端的吞吐量.测试吞吐量的时候,当从节点C上通过节点B中转来下载节点A上的ftp文件时,在多个时刻进行测试,每次传输时间大概10 min左右.性能跳数1(B),2(C)的吞吐量的多次测量结果,其平均值分别为150,56 kB·s-1.

图4 连通性测试结果Fig.4 Results of connectivity testing

4 结论

目前,针对A d Hoc网络路由协议的研究多是在仿真的环境中进行的.但是,由于物理层和协议的某些不恰当、不精确的模型不能正确和真实地反映节点的移动性,因此在真实的环境中实现和评估路由协议是十分必要的.更何况这也是Ad Hoc网络实际应用的必由之路.

在ARM处理器S3C2410上构建适用于A dHoc网络的嵌入式Linux系统,在所构建的嵌入式Linux系统上实现AdHoc网络的AODV路由协议,组建具有自主知识产权的嵌入式AdHoc网络.同时,针对S3C2410处理器,提出嵌入式Linux系统开发中的关键技术问题及解决方法,对于Ad Hoc网络的实现和应用,以及基于嵌入式Linux的应用开发都具有一定的参考意义.

篇幅有限,文中仅指出系统实施过程中的关键技术细节,而省略了具体的命令步骤.下一步要做的工作是,对AODV代码进行优化及对A d Hoc网络的安全性保障.

[1]郑少仁,王海涛,赵志峰,等.Ad Hoc网络技术[M].北京:人民邮电出版社,2005.

[2]宋凯,严丽平,甘岚,等.ARM Linux在S3C2410上的移植[J].计算机工程与设计,2008,29(16):4138-4140.

[3]杨水清,张剑,施云飞,等.ARM嵌入式Linux系统开发技术详解[M].北京:电子工业出版社,2008.

[4]刘焕敏.Linux平台Ad Hoc网络按需路由协议实现技术研究[D].长沙:国防科学技术大学,2005.

[5]洪家军,吴金龙.利用NS-2实现Ad Hoc网络仿真平台[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)

猜你喜欢
内核报文分区
基于J1939 协议多包报文的时序研究及应用
上海实施“分区封控”
强化『高新』内核 打造农业『硅谷』
CTCS-2级报文数据管理需求分析和实现
浅析反驳类报文要点
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
浪莎 分区而治
微生物内核 生态型农资
ATS与列车通信报文分析