嵌入式系统是以应用为中心,以计算机为基础,软硬件可裁剪,适用于系统对功能、可靠性、成本、功耗严格要求的专用计算机系统。实时性是嵌入式系统的基本要求,其次,还要求代码小,速度快,可靠性高。嵌入式Linux(EmbeddedLinux)是指对Linux经过裁剪小型化后,可固化在存储器或单片机中,应用于特定嵌入式场合的专用Linux操作系统。嵌入式Linux的开发和研究已经成为目前操作系统领域的一个热点。与其它嵌入式操作系统相比,Linux的特点如下:
第一,Linux系统是层次结构且内核完全开放。Linux是由很多体积小且性能高的微内核系统组成。在内核代码完全开放的前提下,不同领域和不同层次的用户可以根据自己的应用需要方便地对内核进行改造,低成本地设计和开发出满足自己需要的嵌入式系统。
第二,强大的网络支持功能。Linux诞生于因特网时代并具有Unix的特性,保证了它支持所有标准因特网协议,并且可以利用Linux的网络协议栈将其开发成为嵌入式的TCP/IP网络协议栈。
第三,Linux具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,可以跨越嵌入式系统开发中仿真工具的障碍。Linux也符合IEEEPOSIX.1标准,使应用程序具有较好的可移植性。
传统的嵌入式开发的程序调试和调试工具是用在线仿真器(ICE)实现的。它通过取代目标板的微处理器,给目标程序提供一个完整的仿真环境,完成监视和调试程序;但一般价格比较昂贵,只适合做非常底层的调试。
第四,Linux具有广泛的硬件支持特性。无论是RISC还是CISC、32位还是64位等各种处理器,Linux都能运行。这意味着嵌入式Linux将具有更广泛的应用前景。
2Linux嵌入式系统开发平台
2.1系统软件操作平台
操作系统是一种在计算机上运行的软件。它的主要任务是管理计算机上的系统资源,为用户提供使用计算机及其外部设备的接口。它存在的目的是为了管理所有硬件资源,并且提供应用软件一个合适的操作环境。
嵌入式Linux系统需要下面三个基本元素:系统引导工具(用于机器加电后的系统定位引导)、Linux微内核(内存管理、程序管理)、初始化进程。但如果要它成为完整的操作系统并且继续保持小型化,还必须加上硬件驱动程序、硬件接口程序和应用程序组。
Linux是基于GNU的C编译器,作为GNU工具链的一部分,与gdb源调试器一起工作的。它提供了开发嵌入式Linux系统的所有软件工具。
2.2系统硬件平台
在选择硬件时,常由于缺乏完整或精确的信息而使硬件选择成为复杂且困难的工作。现在比较流行的硬件平台有Intel公司的StrongARM系列,Motorola公司的DragonBall系列,NEC公司的VR系列,Hitachi公司的SH3、SH4系列等等。选定硬件平台前,首先要确定系统的应用功能和所需要的速度,并制定好外接设备和接口标准。这样才能准确地定位所需要的硬件方案,得到性价比最高的系统。
3嵌入式Linux系统开发模式
嵌入式系统通常为一个资源受限的系统。直接在嵌入式系统的硬件平台上编写软件比较困难,有时甚至是不可能的。目前,一般采用的办法是,先在通用计算机上编写程序,然后,通过交叉编译,生成目标平台上可运行的二进制代码格式,最后下载到目标平台上的特定位置上运行,具体步骤如下。
第一步,建立嵌入式Linux交叉开发环境。目前,常用的交叉开发环境主要有开放和商业两种类型。开放的交叉开发环境的典型代表是GNU工具链,目前已经能够支持x86、ARM、MIPS、PowerPC等多种处理器。商业的交叉开发环境主要有MetrowerksCodeWarrior、ARMSoftwareDevelopmentToolkit、SDSCrosscompiler、WindRiverTornado、MicrosoftEmbeddedVisualC++等。交叉开发环境是指编译、链接和调试嵌入式应用软件的环境。它与运行嵌入式应用软件的环境有所不同,通常采用宿主机/目标机模式。
第二步,交叉编译和链接。在完成嵌入式软件的编码之后,就是进行编译和链接,以生成可执行代码。由于开发过程大多是在Intel公司x86系列CPU的通用计算机上进行的,而目标环境的处理器芯片却大多为ARM、MIPS、PowerPC、DragonBall等系列的微处理器,这就要求在建立好的交叉开发环境中进行交叉编译和链接。
第三步,交叉调试。
①硬件调试。如果不采用在线仿真器,可以让CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口,发送调试命令和接收调试信息,完成调试过程。目前,ARM公司提供的开发板上使用的则是JTAG调试端口。
②软件调试。在嵌入式Linux系统中,Linux系统内核调试,可以先在Linux内核中设置一个调试桩(debugstub),用作调试过程中和宿主机之间的通信服务器。然后,可以在宿主机中通过调试器的串口与调试桩进行通信,并通过调试器控制目标机上Linux内核的运行。
//读取Table.DAT
{
FILE*tab=fopen(TABLE_FILE,"r");
//打开文件
intcount=fread(Tab,sizeof(int),TAB_SIZE,tab);
fflush(tab);
//刷新文件流
for(inti=0;i
if(Tab[i]!=-1&&Tab[i+1]!=-1)
Tab[i+1]=Tab[i+1]+Tab[i];
else
break;
returnTRUE;
}
intLoadPack()
//加载数据包
inti;
intload_packs
=0;
FILE*pack=fopen(PACK_FILE,"r");
for(i=0;i
if(Tab[to_be_load+i]!=-1&&Tab[to_be_load+i+1]!=-1)
intsize=Tab[to_be_load+i+1]-Tab[to_be_load+i];
intoffset=Tab[to_be_load+i];
if(fread(buf+i,size,1,pack)!=1)
printf("Readerror...\n\n");
exit(1);
load_packs++;
//更新变量
/*donothing*/
fflush(pack);
//刷新数据流
to_be_load+=load_packs;
returnload_packs;
//返回读取的数目
3.4.2系统中的buffer
在现实中的很多系统中,buffer是很重要的一种思想,为的就是减少读取外部存储的次数,延长设备的使用寿命。Buffer在计算机系统中,应用是很广泛的,例如,在硬盘和内存之间存在一层缓冲区,在CPU和内存之间同样也存在一层缓冲区,这层缓冲区通常被称作Cache。
在本系统中,也同样利用了Buffer思想,有着传统意义上的原因,当然还考虑到用户操作时的特殊性,系统的Buffer思想描述如下:
l
在任意时刻,Buffer内最多存储100个Package数据
刚开始,加载pack0~pack99共计100个package,当要查看pack100时,则采取的方法是:保留旧的50个package,加载新的50个package,则package编号变为:pack50~pack149,这样操作的原因是为了用户的方便,因为用户经常会查看某个报文附近的几个报文。
初始状态下,假设系统已经加载了编号为0到99的数据包,如图2.7所示:
图2.7
加载前缓冲区内容
在某一时刻,假设用户想查看编号为100的数据包,则需要重新加载,重新加载后的数据包如图2.8所示:
图2.8
加载后缓冲区内容
使用此种Buffer思想,用户操作的方便性即体现在这个方面,在对某条报文进行研究时,会经常查看它的临近报文,使用此种机制,那么便不会不断的对要查看的临近报文进行加载,减少了读取硬盘的次数。
3.4.3系统的显示问题
在控制台上,要想建造一个好的用户操作界面,是一件比较难的事情,根据我的体验,linux下著名的Sniffer工具tcpdump的操作界面也不够友好,普通用户很难操作。在window环境下的Sniffer工具Ethereal界面比较美观,方便操作,所以,建造一个好的用户操作界面成为我此次毕设的攻克重点。
本系统的显示分为两种显示模式:“detail”模式和“simple”模式,“detail”模式意为“详细显示模式”,“simple”模式意为“简单显示模式”。
在“detail”模式下,每个包得到尽可能详细的解析,解析包的每一层信息,示意如图2.9:
图2.9
详细显示模式
根据上图显示的信息,可以得知此包是一个ICMPPackage,具体内容属于pingReply,更详细得知是本主机ping本主机的一个数据包。
“simple”模式意为简单模式,所谓简单模式就是对每个Package尽可能的用一句话来描述,虽然尽可能的简短,但是一定要包含以下信息:
Package的类型
Package的作用
这种模式的重要作用是在用户对包进行检测和测量时,通常会查看相邻的几个Package,这样的模式方便用户进行“查看上一个Package”和“查看下一个Package”,只要用户在这种模式下按“N”或者“n”就可以查看下一个package,只要按“L”或“l”键就可以查看上一个Package。
“simple”模式的示意如图2.10所示:
图2.10
简单显示模式
从图中可以看出,当前正在查看的包用“蓝色”的线条标出,方面用户的操作,当用户向上或者向下进行选择时,此蓝色线条也同样会向上或向下运动,这样做的原因是是的系统显示具有动态效果。
“detail”模式的显示比较简单,只要逐层进行解析就可以了,下面我们主要讨论下“simple”模式下的显示算法。
在“simple”模式下,当前控制台最多可以显示20个Package,主要是由函数List20Packages函数实现的。什么时候应该对Package标上蓝色的线条,以下代码即说明此问题:
if(i==p_recorder%20)
//ifthepackageisthecurrent
printf(COLOR_START);
//color_start
无论示在简单显示模式还是在详细显示模式下,均支持以下三种操作:
向上操作(Prev)-----查看上一条报文
向下操作(Next)-----查看下一条报文
任意操作(Goto)-----查看任一条报文
第四章
4.1文怎样获取一个数据包?
4.1.1Libpcap方法
编程要点如下:
查找可以捕获数据包的设备
device=pcap_lookupdev(errbuf);
创建捕获句柄,准备进行捕获
p=pcap_open_live(device,8000,1,500,errbuf);
如果用户设置了过滤条件,则编译和安装过滤代码
pcap_compile(p,&fcode,filter_string,0,netmask);
pcap_setfilter(p,&fcode);
进入循环,反复捕获数据包
for(;;)
while((ptr=(char*)(pcap_next(p,&hdr)))==NULL);
对捕获的数据进行类型转换,转化成以太数据包类型
eth=(structlibnet_ethernet_hdr*)ptr;
对以太头部进行分析,判断所包含的数据包类型,做进一步的处理
if(eth->ether_type==ntohs(ETHERTYPE_IP))
if(eth->ether_type==ntohs(ETHERTYPE_ARP))
关闭捕获句柄
pcap_close(p);
4.1.2Socket方法
在Linux下编写网络包捕获程序,比较简单的方法是在超级用户模式下,利用类型为SOCK_PACKET的套接口(socket函数)来捕获链路帧。LinuxSOCK_PACKET编程要点如下:
设置套接口以捕获链路帧:在设置套接口之前,需要引用如下文件:
#include
调用socket函数的原型是:intsocket(intdomain,inttype,intprotocol);
本函数涉及3个输入参数:domain参数表示所使用的协议族;type参数表示套接口的类型;protocol参数表示所使用的协议族中某个特定的协议。如果函数调用成功,套接口的描述符(非负整数)就作为函数的返回值,假如返回值为-1,就表明有错误发生。使用socket函数捕获链路层数据帧,domain参数应指定为AF_INET协议族,表示采用Internet协议族;type参数指定为SOCK_PACKET,表示获取链路层数据,进而分析各层的协议数据单元;而protocol参数采用htons(0x0003),表示可以截取所有类型的数据帧。这里htons函数用于短整数的字节顺序转换。计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。在捕获数据包时socket函数调用形式为:
intfd;
//fd是套接口的描述符
fd=socket(AF_INET,SOCK_PACKET,htons(0x0003));
设置网卡工作模式:要使建立的套接口能够真正捕获到同一网段其它站点的数据,还必须设置网卡工作于“混杂”模式,可以使用ioctl函数,原型如下:
intioctl(intd,intrequest,&ifr),ioctl系统调用用于对套接口、网卡等软硬件设施进行底层控制,实际的操作来自各个设备自己提供的ioctl接口。设置网卡于“混杂”方式的LinuxC程序段如下:
structifreqifr;
strcpy(ifr.ifr_name,dev);
//(char*)dev标识设备名,如:eth0
i=ioctl(fd,SIOCGIFFLAGS,&ifr);//表示要求取出工作方式
if(i
close(fd);
perror("can'tgetflags\n");
exit(0);
ifr.ifr_flags|=IFF_PROMISC;
//在标志中加入“混杂”方式
i=ioctl(fd,SIOCSIFFLAGS,&ifr);
//表示要求设定工作方式
perror("can'tsetpromiscuous\n");
从套接口读取链路帧:套接口建立以后,就可以从中循环地读取链路层数据帧。因此,还需要建立数据帧的缓冲区,并把帧头结构的指针指向这一缓冲区的首地址:
charep[ETH_FRAME_LEN];structethhdr*eh;intfl;
eh=(structethhdr*)ep;
//指向帧头
fl0=read(fd,(etherpacket*)ep,sizeof(ep));
//fl0为截取的数据帧帧长
这里帧头结构类型ethhdr在/usr/include/linux/if_ether.h中
定义:structethhdr{unsignedcharh_dest[ETH_ALEN];//目标MAC地址
unsignedcharh_source[ETH_ALEN];
`
//源MAC地址
unsignedshorth_proto;
//帧中数据协议类型代码
基于上述定义,一旦ep读入帧中数据,就可以通过eh->h_dest、eh->h_source、eh->h_proto获取帧首部信息。
4.2怎样解析一个报文?
无论采用Lipcap方法,还是采用SOCK方法,都可获得以太网帧,由于在以太网帧首部中含有协议类型字段,所以可进一步实现上层协议包的首部提取,为篇幅起见,本处仅对Socket方法获得帧为例,介绍TCP/IP首部的提取的一般方法,以便今后作进一步的数据分析与处理。
IP报头首部提取
根据h_proto的值,可以确定帧数据将交由上层何种协议处理,常见的h_proto值与协议的对应关系有:
0x0800:IP协议;
0x0806:ARP协议;
0x8035:RARP协议。
因此,一旦捕获的帧中h_proto的取值为0x800,将类型为iphdr的结构指针指向帧头后面负载数据的起始位置,则IP信包首部的数据结构将一览无余。以下程序段表明这一定位过程:
charep[ETH_FRAME_LEN];
structethhdr*eh;
structiphdr*ip;
intfl;
//eh指向帧头
ip=(structiphdr*)((unsignedlong)ep+ETH_HLEN);
//ETH_HLEN为帧长
fl1=read(fd,(structerhhdr*)ep,sizeof(ep));
//fl1为捕获的数据帧长
printf("saddr:%x=>daddr:%x\n",ip->saddr,ip->daddr);//取源和目标IP地址
TCP报文段首部提取
在IP协议首部中包含协议数据单元类型标识域:_u8protocol;这一标识域的常见取值及其协议对应关系如下:
1:ICMP;
6:TCP;
17:UDP。
fl2=read(fd,(structethhdr*)ep,sizeof(ep));
//fl2为捕获的数据帧帧长
printf("source=%x,dest=%x\n",tcph->source,tcph->dest);//取源端口和目的端口号
4.3怎样把网卡置为“混杂模式”?
在以太网中,通过广播实现数据传输,在同一子网段的所有网卡都可“听”到网络总线上传输的所有数据,但不是所有数据都能被接收到。在系统正常工作时,一个合法的网络接口只响应两种数据帧:帧的目标MAC地址与本地网卡地址相符;帧的目标地址是广播地址,除此之外数据帧将被丢弃。
由于网卡有4种工作模式:广播(能够接收网络中的广播信息)、组播(能接收组播数据)、直接(只有目的网卡才能接收该数据)和混杂(能够接收一切数据)模式,所以为了能够捕获以太网所有数据包,通常需要将网卡设置成混杂工作模式。当主机连接在共享型以太网集线器上时,采用“混杂”方式可以捕获到同一冲突域上传输的数据帧;但当主机连接在交换机上时,由于交换机通常不会将数据帧广播到所有端口上(除非在其MAC地址——端口映射表内找不到相应表项),因而不能利用以太网络的广播特性进行捕获。这时,可以利用交换机的端口镜像功能实现网络数据包捕获。因为当端口A和端口B之间建立镜像关系后,流经端口A的所有信息流量将同时通过端口B输出,所以可以在端口B捕获到端口A的数据。
所以,要想运行Sniffer工具,执行“侦听”功能,就必须使得网卡处于“混杂模式”,把网卡置为“混杂模式”的代码如下:
BOOLSetPromis()
if(fd==-1)
printf("CanNotEstablishASocketToControlTheCard...\n\n");
returnFALSE;
strcpy(ifr.ifr_name,"eth0");
inti=ioctl(fd,SIOCGIFFLAGS,&ifr);
if(i<0)
printf("CanNotGetFlagsOfTheNetCard...\n\n");
printf("CanNotSetTheNetCardPromiscuous...\n\n");
printf("SetTheCardToBePromiscuous..............OK\n\n");
4.4Sniffer攻击的防范
Sniffer软件可以进行网络流量监控、拓扑发现、入侵检测,给网络管理带来了极大的便利。正由于它能被动获取网络传输的明文信息,因此,一旦被黑客利用,给网络带来的危害也是巨大的。
作为一种入侵手段,嗅探器令人防不胜防,因为它被动接受而不主动获得。它不会向网络上发出任何包,网络用户很难发现它的存在。到目前为止还没有一种比较好的防范手段。防范Sniffer攻击,只能依靠用户和网络软件设计者的安全意识。我们知道,FTP,Telnet等软件都是进行明文传输,因此,对攻击者来说,他们传输的信息就等于完全暴露出来。因此,必须对传输的数据进行加密,这也是反嗅探器的唯一途径。在Linux系统中,我们主张用SSH和openSSH来对传输数据进行加密。这样即使攻击者能得到数据流,也不能得到具体信息了。
另一种防范嗅探攻击的方式就是检查网络中有无网络接口处于混乱模式。在Linux环境下可以用ifconfig来检钡本地机器是否处于混乱模式,ifconfig是Linux自带的工具。对于子网中网络接口的检测,可以使用NEPED工具。然而该工具是利用Linux的ARP实现中的缺陷来检测这些接口口它发送一个ARP请求,一次来引起嗅探工作站的响应。然而它本身就是一个缺陷,因为它是利用了Linux的其它缺陷来实现的。随着Linux系统的越来越完善,如果ARP实现得到修补,嗅探工作站不再响应ARP请求。
另外,安全的拓扑结构也是必要的,因为嗅探器只能在当前网络段上进行数据捕获。这就意味着,将网络分段工作进行得越细,嗅探器能够收集的信息就越少。
以上讨论了目前对嗅探攻击防范的困难,对此本人作出下列两点设想:
因为以太网在局域网中进行传输是使用广播方式,如果不采用这种方式,直接使用地址解析((ARP)影射物理地址,嗅探器就无法接收数据了。或者进行双向验证,即主机对数据需要检查,数据对主机也需检查。
由于进行原始数据接收时需要将网卡设置为混乱模式,但如果网卡不
提供这种模式,嗅探器也无法工作了。另外,前面提供的两种检测网卡是否处于混乱模式的方式都有缺陷,希望以后能研究出没有缺陷的检测网卡状态的方式。
4.5Sniffer引入网络管理中的可行性
Sniffer作为能够捕获网络报文的设备,通常用来在网络上截取阅读位于OS工协议模型中各个协议层次上的数据包。Sniffer可以拦截所有的正在网络上传送的数据,通过相应的软件分析处理,对网络实时信息和历史信息进行监控和统计分析,进而分析子网的网络状态和网络整体布局。为网络性能的分析、网络故障的判断、信息流量的审计、配置管理得调整、网络安全的检测提供强有力的使用工具,对网络管理提供信息依据。
Sniffer可以在网络管理中实现的主要的功能:
①
实时网络包捕获:Sniffer能够以线速率实时捕获用户定义的网络数据包截获通信的内容。对网络上主机间的通信,通过设置过滤条件,给出一个详细的逐包的统计信息。
②
网络实时监控:Sniffer以表格、图形等形式,实时显示出网络运行情况,如协议分布、流量分布、带宽利用率、错误率等。
③
对协议进行解析:有些只能分析一种协议,而另一些能够分析几百种协议。
④
统计历史数据和发出警报:Sniffer可提供几十种长期数据报告,以便将来的历史查询和分析,并可根据预先设定的阀值发出事件警报。
⑤
报文发送:通过设置目的地址,发送次数,发送延迟和报文大小,形成报文并发送,可以实现网络流量模拟。
4.6Sniffer技术在网络管理中开发的可行性与必要性
根据以上各章节的论述,我们大致了解了网络管理技术和Sniffer技术的基本概念,在Sniffer本身所具有的抓取网络数据报的特性的基础之上,首先产生了一些简单的Sniffer的工具,其后Sniffer技术融合其他方面的技术,包括:人工智能、数据库、分布式等技术,在网络管理领域得到了极大的发展,在不同网络类型、不同操作系统中都得到了或多或少的应用,形成了各种专用的或通用的Sniffer产品,从简单捕获400字节数据包的Sniffit工具到集成的功能强到的具有Sniffer网络管理性质的TVN商业软件。从研究和实际应用上说明Sniffer技术在网络管理中是一种行之有效的技术。
由于现有网络管理工具的存在,许多人认为没有自己再开发网络管理软件的必要了。事实上,这种观念是不正确的。因为:尽管现有的网络管理工具提供了强大的网络管理功能,但它不可能包罗万象,适合于任何情况。也基于这个原因,很多的网络管理平台提供了API,可以使第三方或客户进行二次开发。这虽然使得网络管理工具的开发容易了许多,但前提是要掌握网络管理的深厚的专业知识。功能强大的网络管理工具其使用相应也较为复杂,而客户使用可能只关心自己想要实现的功能,而不迷失于相对无必要的复杂的功能环境中,同时希望减少管理负担,减少培训、操作和维护的费用。另外优秀的网络管理工具的价格也是很昂贵的,微小型企业可能无法承受。
⑥
4.7Sniffer对多协议的捕捉和分析的不足
当前Sniffer技术的应用还十分简单,对复杂多协议的捕获和分析也有很大的缺陷。从推广Sniffer技术的企业来看,Sniffer因要十分具体的应用于某个领域,因此只能做到对某个特定协议集做到精确专业的分析口而今天的网络通常由多个网段经过路由器、网桥、交换机和WAN链路组成。任何一个网段都可能运行多种网络协议。例如,TCP/IP协议与局域传输协议(如Novell的IPX)一起用于连接企业范围网络的协议。对于某些商业站点,可能同时需要运行多种协议簇—NetBEUI,IPX/SPX,TCP/IP,802.3和SNA等,每个协议簇中又包括多种具体应用协议。这时很难找到一种Sniffer帮助解决网络问题,因为许多Sniffer往往将某些正确的协议数据包当成了错误数据包,然而我们要想解决复杂的网络问题,通常需要详细地解析各协议数据包内容。
参考文献
[1]TimBerners-Lee,JamesHandler,OraLassia.Thesemanticweb[J].ScientificAmerican,2001,284(5):34-43.
[2]W3CRecommendation10February2004.OWLwebontologylanguageguide[EB/OL].2004
[3]RobertShimonski,SnifferNetworkOptimizationandTroubleshootingHandbook.SyngressMedia,2002.6.
[4]DouglasE.Comer.InternetworkingwithTCP/IP,Vol1.5thEdition.
UnitedStates:PrenticeHall,2006:90-200.
[5]W.RichardStevens.TCP/IPIllustrated,Vol1:TheProtocols.UnitedStates:Addison-Wesley,2004:70-150.
[6]李景.本体论在系统中的应用研究[M].北京:北京图书馆出版社,2005.
[7]谭思亮,监听与隐藏网络侦听揭密[M].北京:人民邮电出版社,2002.
[8]肖新峰,宋强.TCP/IP协议与标准教程.北京:清华大学出版社,2007:1-115.
[9]杨延双.TCP/IP协议分析与应用.北京:机械工业出版社,2007:60-148.
[10]兰少华,杨余旺,吕建勇.TCP/IP网络与协议.北京:清华大学出版社,2006:1-110
[11]李景.本体论在文献检索系统中的应用研究[M].北京:北京图书馆出版社,2005.70-150
[12]朱礼军,陶兰,黄赤.语义万维网的概念、方法及应用[J].计算机工程与应用,2004,40(3):79-83
[13]任彬.一种特定领域的语义网模型[D].吉林:吉林大学,2004.
[14]田春虎.国内语义Web研究综述[J].情报学报,2005,24(2):243-249.
[15]杜小勇,李曼,王大治.语义Web与本体研究综述[J].计算机应用,2004,24(10):14-16.
[16]周武,金远平.构建XML本体信息研究[J].微机发展,2003,13(10):61-64.
[17]马恒太,蒋建春.一个基于Uuix平台的分布式网络监视器系统[J].计算机研究与发展,2001,38(3):268-274.
[18]李力,肖庆.Linux下GUI网络数据包嗅探器的研究与实现[J].计算机工程与设计,2006,27(2):344-346.
关键词:S3C2410;嵌入式系统;Bootloader;内核;文件系统
中图分类号:TP316文献标识码:B
MethodofPortingontheEmbeddedLinuxSystem
LIJing,ZHAOXiaoqiang,FANJiulun
(Xi′anInstituteofPostsandTelecommunication,Xi′an,710061,China)
Abstract:Linuxisusedwidelyintheembeddedfield,itisimportanttobuildourembeddedLinuxsystem,accordingtotheproject,thispaperintroducesthemethodofbuildingtheembeddedLinuxsystem.TakingtheLinuxtransplantedontothetargetboardbasedontheprocessorofS3C2410asanexample.MethodofembeddedLinuxistransplanted,then,howtobuildupanenvironmentisdescribed,focusingontheframeworkandfunctionalityofBootloaderandtransplantofLinuxkernel.Thismethodproveshigheffective,thetransplantedLinuxintheembeddedsystemrunswellandagoodreferencetotheothersembeddedoperatorsystemisgiven.
Keywords:S3C2410;embeddedsystem;Bootloader;kernel;filesystem
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。嵌入式Linux是按照嵌入式操作系统的要求设计的一种小型操作系统,非常适合于移植到嵌入式系统中。嵌入式Linux应用最广泛的地方就是基于ARM地应用,ARM芯片是一种高性能、低功耗地RISC芯片,被广泛地应用于各个领域[1,2]。
目前,基于ARM核的处理器成为市场的主流,建立面向ARM架构的操作系统成为人们研究的热点,而Linux由于它的开源性,被广泛地应用于嵌入式系统中,任何人都可以根据自己的需要来对其进行裁减,以适应自己的系统。根据实际需要将Linux移植到基于ARM920T核的s3c2410处理器芯片上,在总结现有方法存在的问题的基础上,详细介绍了移植的原理与方法技巧,对于构建其他的嵌入式Linux有一定的参考意义。
1开发环境构建
1.1嵌入式硬件平台
系统硬件平台核心部件为三星S3C2410ARM920T芯片,其工作频率最高达200MHz。包括64MB的NANDFLASH和64MB的RAM,键盘接口、串口、CPLD译码单元、网络单元、语音单元、LCD及触摸屏等。
1.2嵌入式软件平台
软件平台一般包括Bootloader、内核、文件系统以及用户程序4大部分,它们的可执行映像存放在系统的存储设备上。在FLASH空间上存储的顺序如下:0~128kB用于存储启动代码(VIVI);128~192kB用于存储启动参数;192kB~3MB用于存储内核映像,3MB以上用于存储文件系统,其余为用户程序。FLASH存储结构如图1所示。
1.3交叉开发环境搭建
基于Linux操作系统的应用开发环境一般是由目标系统的硬件系统和宿主PC机构成。目标硬件系统用于运行操作系统和系统应用软件,而目标硬件系统所用到的操作系统的内核编译、应用程序的开发需要通过宿主PC机来编译完成。双方之间可以通过建立以太网接口、USB等来调试编译好的驱动或应用程序。当编译、调试通过后,再添加到内核中去。首先要正确安装Linux操作系统,下面介绍用Crosstool制作交叉工具链。
首先下载所需要的资源文件[3]:
Crosstol-0.4.2.tar.gz,binutils-2.15.tar.bz2,gcc-3.3.6.tar.gz,glibc-2.3.2.tar.gz,linux-lib-header-2.6.12.0.tar.bz2,glibc-linxuthreads-2.3.2.tar.gz。准备好这些资源之后需要在crosstool-0.42目录下创建配置文件arm.sh,指出工具链源码所在位置和安装的目录,再修改配置文件arm.dat和gcc-3.3.6-glibc-2.3.2.dat文件,最后执行arm.sh脚本就可以在指定目录生成所需要的交叉编译工具。
2嵌入式Linux的移植
2.1BootLoader的移植
在嵌入式系统中,BootLoader的作用与PC机上的BIOS类似,通过BootlLoader可以完成对系统板上的主要部件如CPU,SDRAM,FLASH,串行口等进行初始化,也可以下载文件到系统板上,对FLASH进行擦除与编程。当运行操作系统时,Bootloader会在操作系统内核运行之前运行,通过它可以分配内存空间的映射,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统准备好正确的环境[4]。
2.2BootLoader的架构功能
系统使用的BootLoader是VIVI,VIVI是CPU加电后运行的第一段程序,其基本功能是初始化硬件设备,建立内存空间的映射图,从而为调用嵌入式Linux内核做好准备。VIVI由2部分组成:一部分是依赖于CPU体系结构的代码,用汇编语言实现对硬件环境的初始化,并为第二部分代码的执行做好准备;另一部分是用C语言实现内存空间的映射,并将内存映像和根文件系统映像从FLASH中读取到RAM中,设置好启动参数后启动内核。
VIVI的stage1是BootLoader一开始就执行的操作,其目的是为了stage2的执行以及随后的内核的执行设置好一些基本的硬件环境。其步骤如下所示:
(1)硬件初始化:当上电或复位后,VIVI启动,位于NAND中的前4kB程序便从NANDFLASH中由S3C2410自动拷贝到SteppingStone的前4kB的内部RAM中该RAM之后被映射到地址0x00处。此时VIVI的前4kB代码开始运行,关闭Watchdog,关闭中断,初始化PLL和时钟主频设定,初始化存储器设定;
(2)配置串口:初始化串口控制器;
(3)复制自身到SDRAM中:当初始化串口结束后,VIVI开始把自身从NANDFLASH中复制到SDRAM中;
(4)跳转到stage2的入口点。VIVI的stage2阶段,包括以下步骤:
①继续初始化系统硬件;
②内存影射初始化,内存管理单元初始化;
③初始化堆栈;
④初始化mtd设备;
⑤初始化私有数据;
⑥初始化内置命令;
⑦启动VIVI。
2.3BootLoader的移植
(1)修改Malkefile,指定交叉编译:
ARCH=arm
CROSS_COMPILE=/opt/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin/arm-linux-
(2)修改/arch/s3c2410/smdk..c文件,按照上面所指定大小指定NAND分区;
(3)编译生成VIVI。
2.4Linux内核的移植
本实验系统运行的Linux版本是针对2.6.14.1进行移植,下载内核代码在/linux下,移植按照以下步骤:
(1)设置目标平台和指定交叉编译器:
在最上层的根目录/Makefile文件中,首先要指定所移植的硬件平台,以及所使用的交叉编译器。改为如下:
ARCH=armCROSS_COMPILE=/opt/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin/arm-linux-
(2)设置NANDFLASH分区:
在arch/arm/mach-s3c2410/devs.c中添加头文件:
(3)将staticstructmtd_partitionpartition_info[]中的分区和VIVI中的分区分成一样大小。
(4)加入NANDFLASH分区:
structs3c2410_nand_setnandset={nr_partitions:5,partitions:partition_info,};
(5)建立芯片支持
structs3c2410_platform_nandsuperlpplatform=
{tacls:0,twrph0:30,twrph1:0,sets:&nandset,nr_sets:1,};
(6)在NANDFLASH驱动里加入NANDFLASH芯片支持:
在s3c_device_nand中增加dev={.platform_data=&super-lpplatform}。
(7)在arch/arm/machs3c2410/machsmdk2410.c中的__initdata部分增加&s3c_device_nand,使内核启动时初始化NANDFLASH信息。
(8)去掉NADDFLASH的ECC,修改drivers/mtd/nand/s3c2410.c,在s3c2410_nand_init_chip函数里修改NAND_ECC_SOFT为NAND_ECC_NON。
(9)配置编译项,通过在终端下输入命令makemenuconfig来对Linux进行配置,配置完成后通过输入命令:make即可在/arch/arm/boot下生成所需要的内核文件zImage。
2.5制作文件系统
Cramfs被设计为简单的较小的可压缩的文件系统,它主要用于较小ROM的嵌入式系统,它是一个压缩的文件系统,本系统采用Cramfs文件系统。
可以利用工具软件Busboy和MKCRAMFS制作CRAMFS文件系统。首先在本地建立根文件系统myroot,然后在其目录下建立所需要的子目录,如bin,dev,etc,lib,mnt,proc,sbin,usr等。建立好目录之后要给各相应的目录复制相应的文件或库,可以通过BusyBox来实现。BusyBox是一个可配置的工具。通过makemenuconfig配置完成BusyBox后,修改BusyBox的Makefile内容,使用交叉编译环境。然后通过make命令进行编译,makeinstall进行安装,再将生成的目录下的相应文件复制到所构建的文件系统的相应目录下,然后编写相应的linuxrc等文件。完成这些步骤后,利用MKCRAMFS工具来制作所需要的文件系统,只需要在终端通过命令mkcramfsmyrootmyroot.crarmfs就可以把myroot制作成只读的压缩的cramfs文件系统。
2.6内核及文件系统的下载
利用VIVI通过超级终端重新下载VIVI,内核和root,在Windows下启动超级终端,或者Linux下启动Minicom设置其为(115200,8位数据,1位停止位,无奇偶校验),用串口线连接实验系统和PC机的串口。系统上电后,在VIVI命令行下操作:
下载VIVI:输入vivi>loadFLASHvivix,之后,通过xmodem协议发送vivi文件;
下载内核:输入vivi>loadFLASHkernelx,通过xmodem协议发送内核文件;
下载文件系统:输入vivi>loadFLASHrootx,通过xmodem协议发送root文件系统。
3结语
针对嵌入式Linux的构建,以S3C2410处理器为例,详细阐述整个Linux系统构建的原理框架和移植的方法,对移植中的关键技术和重要步骤给出了详细的说明。移植后的Linux系统在开发板上运行稳定,性能良好。操作过程对嵌入式Linux系统在其他处理器上的移植也具有参考意义。
[1]刘振纲,刘成安,卢剑翔.移植标准Linux到S3C2410[J].微计算机信息,2006(11):152-153.
[2]陶列骏,潘金贵.Linux的可移植性[J].小型微型计算机系统,2002(1):50-53.
[3]李亚锋,欧文盛.ARM嵌入式Linux系统开发[M].北京:清华大学出版社,2007.
[4]张杰,吴敏,曹卫华.基于S3C2410的Linux移植[J].微型电脑应用,2005(3):57-59.
[5]章晓明,杜春燕,陆建德.HHPPC8245上的嵌入式Linux移植及VPN开发[J].计算机工程,2007(1):274-276.
[6]陈峰,李滨滔,戈志华.基于S3C2410的嵌入式Linux系统构建[J].现代电子技术,2007,30(24):55-57.
[7]刘明博,邓中亮.基于ARM的嵌入式操作系统移植的研究[J].计算机系统应用,2006(11):87-88.
[8]许荣.基于AT91RM9200的嵌入式Linux系统移植[J].电子技术,2006(3):64-68.
[9]DanielP.BovelUnderstandingtheLinuxKernel[M].2ndEdition.OReilly,2002.
需求描述
海运船舶安装使用航运管理系统,必须充分考虑船舶远离陆岸,震动大、盐分高,硬件容易出故障等等因素,因此如何制订运行高效、稳定可靠、经济可行的技术方案尤为重要。系统的设计本着快速应用、适用性、先进性、开放性、技术独立性等原则,利用现有资源,提供一个高性能、低成本、安全稳定的应用系统。
中海货运决定在其所拥有的船舶上应用中标普华Linux服务器,同时使用中标普华Linux提供的postgresql数据库软件,来构筑其船舶数据库与应用服务器。该数据库服务器作为船载数据库服务器负责船只日常数据采集与管理,通过卫星无限传输采用email等方式与岸上服务器进行数据通信,每日的增量数据为50K左右。用户对Linux服务器的要求如下:
―能支持TOMCAT,支持MYSQL、甲骨文等除MSSQL外所有数据库。
―能高效运行JAVA程序。
―日增数据量50K左右。
―每天通过电邮与岸上服务器进行数据同步。
―高可靠性与高稳定性。
―抵御病毒和黑客攻击的能力强。
―提供有效数据备份和恢复方案。
―提供多种灵活易用的方式进行系统的升级与更新。
―管理方便,易于培训与使用。
―良好经济性,利于大规模部署。
应用中标普华Linux的高可用的实时数据备份与镜像方案,保证了用户应用的可持续性和连续性。
系统的设计充分考虑了航运管理系统的经济性、安全性、可维护性等多个方面,为用户提供了从系统及应用的安装、调试、运行、到系统与应用的维护支持与培训等一条龙的全面解决方案,保证了航运管理系统的顺利实施与维护。
应用特点
航运管理在海事安全方面的重要性不言而喻,系统一旦出现故障,可能产生灾难性后果,陆岸技术人员在提供技术支持、排除故障等方面也很不方便。通过应用以下方案,保证系统的稳定。主要包括:
服务器后备
两台服务器都安装中标普华inux操作系统和航运管理系统,利用中标普华Linux提供的自动热备功能,相互之间做到系统和数据的实时备份。
远程系统和数据恢复
如果主机和副机的磁介质同时损坏,用备份光盘安装操作系统和航运管理系统,公司服务器用邮件将该轮数据发送到船舶,恢复数据。
病毒防护
船舶的数据库服务器采用Linux操作系统,避免了Windows上的各种病毒造成的系统问题。
航运管理系统的维护升级
关键词Linux系统安全用户管理安全工具
中图分类号:TP316.8文献标识码:A
Linux作为一个现代的、开放源代码的操作系统,它允许用户自由的复制和修改其源代码,用户可以根据自己的环境定制Linux、向操作系统添加新部件等,正是由于软件的每个用户和开发者都可以访问其源代码,因而有许多人在控制和审视源代码中可能的安全漏洞。软件缺陷很快会被发现。一方面,这会导致这些缺陷更早被利用;另一方面,很快就会有可用的安全补丁。
当系统连接到网络并向其他计算机提供服务时,系统就会有可能成为被攻击的对象。在这种情况下,系统漏洞可能会让入侵者控制计算机。因此,从开始计划直到拆除系统的整个系统生命周期中安全都是一个最基本的问题。
那么,如何保护Linux安全呢?
1系统的用户管理
与其他UNIX操作系统一样,在进入Linux系统时需要验证账号和密码。Linux一般将密码加密之后,存放在/etc/passwd文件中,Linux系统上的所有用户都可以读到该文件,这种方法不太安全,因为一般的用户可以利用现成的密码破译工具,用穷举法猜测出密码。②比较安全的方法是设定影子文件/etc/shadow,通过影子文件允许特殊权限的用户阅读该文件。在Linux系统中,如果要采用影子文件,必须将所有的公用程序重新编译,才能支持影子文件。这种方法比较麻烦,比较简单的方法是采用插入式验证模块(PAM)。很多Linux系统都带有PAM,它是一种身份验证机制,可以用来动态地改变身份验证的方法和要求,而不要求重新编译其他公用程序。这是因为PAM采用封闭包的方式,将所有与身份验证有关的逻辑全部隐藏在模块内,因此它是影子文件的最佳帮手。
除密码之外,用户账号也有安全等级,这是因为在Linux上每个账号可以被赋予不同的权限,因此在建立一个新用户ID时,系统管理员应该根据需要赋予该账号不同的权限,并且归并到不同的用户组中。
在Linux系统中,可以在/etc/hosts.allow文件中设定允许上机人员的名单,同时在/etc/hosts.deny文件中设置不允许上机人员的名单,Linux将自动把允许进入或不允许进入的结果记录到/rar/log/secure文件中,系统管理员可以据此查出可疑的进入记录。
每个账号ID应该有专人负责。在企业中,如果负责某个ID的职员离职,管理员应立即从系统中删除该账号。很多入侵事件都是利用了那些很久不用的账号。
2安全工具
下面介绍一些可以用于Linux的安全工具,这些工具使用户的服务器运行起来更加安全,可以解决各方面的问题。
2.1nmap和nessus网络安全扫描工具
nessus是一个功能强大而又易于使用的远程安全扫描器,它不仅免费而且更新极快。安全扫描器的功能是对指定网络进行安全检查,找出该网络是否存在会导致对手攻击的安全漏洞。该系统被设计为C/S模式,服务器段负责进行安全检查,客户端用来配置管理服务器。nessus的安全检查是由大量插件完成的,其扩展性强,容易使用,功能强大,可以扫描出多种安全漏洞。
2.2弱点测试工具
(1)chkacct。chkacct是一个检查用户账号安全的工具。它能检查文件的权限并恢复到初始权限。它还能寻找那些能被所有用户可读的文件并查看以点号开头的文件。它可以被用户使用或者被系统或安全管理员专用。
3日志工具(logrotate,swatch,logcheck)
(1)logrotate。一般的Linux发行版中都自带这个工具,能够解决日志文件过大的问题。它可以自动使日志循环,删除保存最久的日志。可以把它放在crontab中,每天定期运行。这在很多Linux发行版中都是默认设置的。
4SSH和Tripwire
(1)SSH服务
传统的网络服务程序,如ftp、pop和telnet在本周上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易收到“中间人”方式的攻击。这些“中间人”冒充真正的服务器接收用户传给服务器的数据,然后冒充用户的数据传给真正的服务器。
通过使用SSH,用户可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。
(2)Tripwire
如果有人侵入了你的系统,在系统中放置了木马和后门,你怎么才能知道呢?tripwire就是这样一个对系统做完整性检查的工具,它是目前最为著名的Linux下文件系统完整性检查的软件工具,这一软件采用的技术核心就是对每个要监控的文件产生一个数字签名,保留下来。当文件现在的数字签名与保留的数字签名不一致时,那么现在这个文件必定被改动过了。
5反扫描工具Portsentry
通过防火墙可以限制自己系统中什么端口开放,什么端口不开放。对于外部的人们来说,这些信息都是保密的。黑客为了得到他人计算机中开放的端口,往往会进行各种方式的扫描,这样的扫描在互联网上也推出课件。一般的扫描活动都是进行入侵的前奏,对安全是极大的威胁。Portsentry就是这样一个反扫描工具,它可以实时发现并分析记录对本机的扫描,它通过syslog做记录,将扫描的主机加入/etc/hosts.deny,马上禁止所有通向扫描主机的网络流量,同时过滤掉所有来自扫描主机的网络流量。
从计算机安全角度来看,世界上没有百分之百安全的计算机系统,Linux系统也不例外,作为Linux系统管理员,需要保持一定的安全防范意识,对系统要定期做检查,发现问题要立即采取措施,根据实际的应用场景,灵活地综合采取以上方法和工具,才能取得较好的效果。