基于嵌入式的网络视频监控系统研究_第1页
基于嵌入式的网络视频监控系统研究_第2页
基于嵌入式的网络视频监控系统研究_第3页
基于嵌入式的网络视频监控系统研究_第4页
基于嵌入式的网络视频监控系统研究_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要近年来,视频监控系统已经在生产管理、平安防盗和远程教学等领域得到了广泛的应用。随着网络技术,图像压缩技术和嵌入式技术的快速开展,视频监控系统正在向着网络化,数字化和小型化的方向开展,目前基于嵌入式的网络视频监控系统已经成为监控系统研究的热点。考虑到稳定性、可靠性和扩展性的要求,特别是实用性的要求,本文设计了一种新型的基于嵌入式Linux的网络视频监控系统的实现方案。该方案是以嵌入式Linux系统和嵌入式控制器S3C2410为核心平台,通过嵌入式平台建立Web效劳器Boa和视频效劳器。利用TCP/IP协议技术实现了网络通信,把USB数字摄像头采集到的图像进行JPEG压缩,然后通过网络传输到远程计算机的客户端。客户端方采用JavaApplet技术实现图像的接收并完成显示功能。客户端的用户可以通过具有Java插件的浏览器实现监控的目的。实验证明了该方案取得了较好的实验效果。针对该方案所涉及到的关键技术进行了深入的分析和研究,取得了以下主要研究成果。在嵌入式Linux系统移植方面,深入的分析了嵌入式Linux系统的运行机理,并比较了Linux2.4和Linux2.6内核的区别,选用最新的Linux内核作为移植的目标。完成了Linux系统在ARM平台NandFlash的启动代码设计,接着主要针对ARM平台完成BootLoder的移植,Linux内核的配置,Ya®s文件系统的移植,根文件系统的设计与实现。在视频采集方面,深入分析了USB驱动和v4l视频设备驱动原理,并向Linux内核加载了USB驱动。比较了视频采集的两种方式的优缺点,舍弃了原始的Read直接从内核缓冲区来读取数据的方式,而采用Mmap共享内存的方式将设备映像到内存,使得进程从共享内存中获取视频数据,提高了通信的速度和效率。在网络监控方面,比较当前流行的几种Web效劳器,选择移植了面向嵌入式领域的Boa效劳器,并采用C语言设计实现了用户验证的CGI程序。网络通信效劳器的设计是采用面向连接的可靠的TCP通信方式,客户端的设计是利用JavaApplet完成的,使用新的Swing类集合完成窗口界面的设计,并设计实现了JApplet完成与效劳器的通信,到达远程网络监控的目的。关键词:嵌入式Linux;web效劳器;视频监控;TCP/IP;JavaApplet第一章绪论1.1课题的背景和意义视频监控系统以其能够实时、形象、真实地反映被监视控制对象的特性广泛应用于生产管理、银行监控和交通安防等重要领域。特别当今社会生活水平的不断提高以及计算机的普及,家庭小型监控系统的需求量也越来越大。传统的模拟信号监控系统存在着诸多局限性:模拟图像信息容易受损,图像质量不高;布线工程大,传输距离受限;数据存储量大,查询不便。虽然数字监控系统克服了上述缺点,但本身也存在一些问题:稳定性可靠性不高,视频前端采集复杂,图像压缩传输不便等。随着网络技术、图像压缩技术和数字信息技术的不断开展,监控系统也在快速变化和开展中。目前这几种技术结合嵌入式技术催生了全新的基于嵌入式技术的网络视频监控系统。该监控系统是把摄像机输出的模拟视频信号通过嵌入式视频编码器直接转换成IP数字信号。嵌入式视频编码器具备视频编码处理、网络通信、自动控制等强大功能,直接支持网络视频传输和网络管理,使得监控范围到达前所未有的广度。基于嵌入式技术的网络视频监控系统克服了传统的模拟信号监控系统和数字监控系统的缺点,这种系统的硬件是一个同嵌入式处理器和操作系统捆绑较为紧密、功能专一、专门设计的独立的设备,不像插卡系统那样受通用计算机系统中其它软件硬件的影响,因此性能上更稳定,且便于安装、维护,易于实现系统的模块化设计,便于管理、维护。该监控系统是目前研究的主要方向。本课题是基于这种背景下建立的,其目的是设计实现一套基于嵌入式Linux的网络视频监控系统,针对网络视频监控系统的各项关键技术展开研究,包括嵌入式Linux技术、网络视频的压缩传输和用于客户端的JavaApplet技术等。该系统充分利用了网络资源,不需要为监控系统增加额外设备,轻而易举地实现远程视频监控功能,具有良好的扩展性和灵活性,本钱低,且便于安装、维护和管理。该系统不仅适用于智能小区、银行、校园和重点实验室的监控,还可用于医疗设备的维护管理、工业生产过程的实时监控、环境与安保集中监控以及水利系统的监控和电力系统的监控等。其设计本钱也将随着技术的开展和网络的普及而大大降低,具有较强的实际应用价值和借鉴意义。1.2国内外开展现状和开展趋势国外监控系统起步较早,它几乎是随着黑白电视机的诞生就出现。近年来,随着半导体工艺、视频压缩技术、网络传输技术的突飞猛进,监控系统得到了飞速的开展,出现了一大批生产监控系统的专业公司以及附带提供监控产品的公司。如美国的Digitalsemiconductor公司、MediaCybernetics公司、加拿大Picpo公司、Coreco公司和德国Mir公司等等。其产品多为单路的图像采集卡或压缩卡。其中的Digitalsemicon-ductor的21230编解码系统由于其较高的性价比和灵活性〔支持H.261和MPEG-1〕,己被广泛用于监控领域。一些厂家己开始研制多路监控系统,典型的代表是韩国L.G公司的LDVR2000/3000系列监控系统。该系统有4-6个通道,压缩格式为M-JPEG,由于采用主机软件压缩,所以效率不高。另外如美国Sensormatic公司型号为INTELLEP的监控系统,它有16个通道,由于采用模拟视频合成,存储仍采用录像带的方式,因而在系统性能以及灵活性上受到限制。国内在监控领域起步较晚,九十年代前期采用国外的进口矩阵控制主机,为了适应当时计算机普及化的需求,监控公司纷纷开发利用计算机对矩阵主机进行系统控制的软件,实现电脑对监控系统图像切换、音频切换、报警处理、图像抓拍等多媒体控制。此时的计算机多媒体监控实际上仅仅作为监控系统的一个辅助控制键盘使用,可以说是中国数字化监控开始的雏形。九十年代中、后期是图像处理技术、计算机技术、网络技术飞速开展的时期。中国国内公司在完成矩阵主机、解码器、多媒体控制系统、云台等外部设备产业化生产后,发现台湾地区和国外监控公司开始将他们基于传统电子制造业的监控生产线转移到中国进行生产,这促进了监控系统的在中国的普及应用。2000年以后,随着图像压缩技术的进步,特别是MPEG-I、MPEG-II图像压缩芯片的大量推广应用,2000年至今,数字监控产品进入了一个快速开展时期。伴随着中国国内监控系统数字化、网络化需求日益增大,使许多传统的IT企业、网络企业、家电企业纷纷看好这一市场,投入资金、人力、开发数字监控产品,数字监控市场在中国呈现空前繁荣的景象。如北京的微视公司。其主要视频监控产品如MV9920实时压缩卡、MV99-G海量硬盘录像智能监控系统、SmartVideo解码系统、以及代销的美国AV-8专业视频压缩卡,但其性能与国外的大公司相比还有相当的差距。视频监控系统的开展经历了三个不同阶段[1][2][3][4]:模拟视频监控,数字化图像监控,基于嵌入式视频效劳器的网络化数字视频监控。模拟监控系统开展较早,目前常称为第一代监控系统,系统特点:视频、音频信号的采集、传输、存储均为模拟形式,质量最高经过几十年的开展,技术成熟,系统功能强大、完善。存在的问题是:只适用于较小的地理范围与信息系统无法交换数据监控仅限于监控中心,应用的灵活性较差不易扩展。随着计算机存储和计算能力的不断增强,图像监控迎来了一场技术革命。慢慢从过去的模拟处理方式转向数字处理方式,开始使用PC处理图像信号。利用计算机的数据处理能力与显示器的高清晰度,将视频信号通过视频采集卡采集到计算机中,在显示器上显示,大大提高了图像的画质,但是控制与切换仍采用传统的方式,只是计算机串口与之相连,完成控制工作。尽管它有良好的人机界面和较好的稳定性,但它不能称为真正的数字图像监控系统。其根本原因在于系统设计的出发点不是基于计算机,而是基于传统模式。只是在原有的根底上加以改良,大局部时间里,计算机只是充当一个外部监视器的角色。通信协议的多样化与专用化很难统一,导致己有的计算机资源远远满足不了多种设备的要求。随着信息处理技术的不断开展,基于嵌入式视频效劳器的网络化数字视频监控近几年异军突起。全数字化网络监控系统以网络为平台,采用全新的设计理念,集成当今最先进的网络技术、计算机技术以及数字处理技术。全数字化网络监控系统以IP地址来识别所有的监控设备,采用TCP/IP协议来进行图像、声音和数据采集传输能够实现:更广阔地理远距的布局;无限的可扩展能力;庞大的网络监控。前端一体化、视频数字化、监控网络化、系统集成化是视频监控系统公认的开展方向,而数字化是网络化的前提,网络化又是系统集成化的根底,所以,视频监控开展的最大两个特点就是数字化和网络化也是监控系统开展的必然趋势。网络数字视频监控系统与上述第一、二代系统相比具有明显的优势:利用现有的网络资源,轻而易举地实现远程视频监控;系统扩展能力强,只要有网络的地方增加监控点设备就可扩展新的监控点;维护费用低,网络维护由网络提供商维护,前端设备是即插即用、免维护系统系统功能强大、利用灵活、全数字化录像方便于保存和检索;网络中的任意一台计算机,只要安装了客户端的软件,给予相应的权限就可成为监控工作站。1.3嵌入式系统概述嵌入式系统的定义嵌入式系统是以应用为中心,以计算机技术为根底,并且软硬件可裁剪,适用于应用系统对功能、可靠性、本钱、体积、功耗有严格要求的专用计算机系统[5]。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个局部组成,用于实现对其他设备的控制、监视或管理等功能。嵌入式系统具有软件代码少、高度自动化、响应速度快等特点,特别适合于要求实时和多任务处理的情况。与通用型计算机系统相比,嵌入式系统功耗低、可靠性高;功能强大、性能价格比高、实时性强,支持多任务;占用空间小,效率高;面向特定应用,可根据需要灵活定制。嵌入式系统特点嵌入式系统是将先进的计算机技术、半导体技术以及电子技术与各个行业的具体应用相结合的产物,与通用的计算机系统相比有如下特点[6][7][8]:(1)技术密集、资金密集、高度分散、不断创新的知识集成系统。通用计算机行业中,占整个计算机行业百分之90的个人电脑产业,绝大局部采用的是Intel的x86体系结构,而芯片厂商那么集中在Intel,AMD,Cyrix等几家公司,操作系统方面更是被微软占居垄断地位。但这样的情况却不会在嵌入式系统领域出现。这是一个分散的,充满竞争、机遇与创新的工业,没有哪个公司的操作系统和处理器能够垄断市场。(2)嵌入式系统通常是面向用户、面向产品、面向特定应用的。嵌入式系统中的CPU与通用型CPU的最大不同就是前者大多工作在为特定用户群设计的系统中。通常,嵌入式系统CPU都具有低功耗、体积小、集成度高等特点,能够把通用CPU中许多由板卡完成的任务集成在芯片内部,从而有利于整个系统设计趋于小型化。在对嵌入式系统的硬件和软件进行设计时必须重视效率,去除冗余,针对用户的具体需求,对系统进行合理配置,才能到达理想性能。与此同时,系统设计还受市场供求关系的影响。嵌入式处理器的开展也表达出稳定性,一个体系一般要存在810年的时间。一个体系结构及相关的片上外设、开发工具、库函数、嵌入式应用产品合在一起,可以构成一套复杂的知识系统。(3)嵌入式系统和具体应用有机地结合在一起,其升级换代也是和具体产品同步进行的。因此嵌入式系统产品一旦进入市场,就具有较长的生命周期。(4)为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机中,而不是存贮于磁盘等载体中。由于嵌入式系统的运算速度和存储容量仍然存在一定程度的限制,另外,由于大局部嵌入式系统必须具有较高的实时性,因此对程序的质量,特别是可靠性,有着较高的要求。(5)嵌入式系统本身并不具备在其上进行进一步开发的能力。在设计完成以后,用户如果需要修改其中的程序功能,也必须借助于一套开发工具和环境。(6)通用计算机的开发人员通常是计算机科学或者计算机工程方面的专业人士,而嵌入式系统开发人员却往往是各个应用领域中的专家,这就要求嵌入式系统所支持的开发工具易学、易用、可靠、高效。嵌入式系统开展历程与趋势嵌入式系统的出现至今已经有30多年的历史,近几年来,计算机、通信、消费电子的一体化趋势日益明显,嵌入式技术已成为一个研究热点。纵观嵌入式技术的开展过程,大致经历四个阶段。嵌入式技术的开展,大致经历了四个阶段[9]:第一阶段是以单芯片为核心的可编程控制器形式的系统,同时具有与监测,伺服,指示设备相配合的功能.这种系统大局部应用于一些专业性极强的工业控制系统中,一般没有操作系统的支持,通过汇编语言编程对系统进行直接控制,运行结束后去除内存。第二阶段是以嵌入式CPU为根底,以简单操作系统为核心的嵌入式系统.这一阶段的操作系统具有一定的兼容性和扩展性,但用户界面不够友好。第三阶段是以嵌入式操作系统为标志的嵌入式系统.这一阶段系统的主要特点是:嵌入式操作系统能运行于各种不同类型的微处理器上,兼容性好;操作系统内核精小,效率高,并且具有高度的模块化和扩展性;具备文件和目录管理,设备支持,多任务,网络支持,图形窗口以及用户界面等功能;具有大量的应用程序接口(API),开发应用程序简单;嵌入式应用软件丰富。第四阶段是以基于Internet为标志的嵌入式系统,这是一个正在迅速开展的阶段.目前大多数嵌入式系统还孤立于Internet之外,但随着Internet的开展以及Internet技术与信息家电,工业控制技术等结合日益密切,嵌入式设备与Internet的结合将代表着嵌入式技术的真正未来。嵌入式系统的开展对嵌入式操作系统提出了更高的要求.因此,对嵌入式操作系统的结构,设计,用户界面等诸多方面进行深入研究,将有助于嵌入式系统的应用和开展。其开展的趋势如下[8][10][11]:(1)低功耗的嵌入式系统。为满足高可靠性要求,低功耗的系统将应运而生。(2)Java虚拟机与嵌入式Java开发的嵌入式系统希望有一个方便的、跨平台的语言与工具,Java正是用Java虚拟机实现Java程序独立于各机种的平台。一个支持嵌入式系统开发的、足够小、足够快、又有足够确定性的嵌入式Java程序包已经出现,Java虚拟机与嵌入式Java将成为开发嵌入式系统的有力工具。(3)嵌入式系统的多媒体化和网络化。随着多媒体技术的开展,视频、音频信息的处理水平越来越高,为嵌入式系统的多媒体化创造了良好的条件,嵌入式系统的多媒体化将变成现实。它在网络环境中的应用已是不可抗拒的潮流,并将占领网络接入设备的主导地位。(4)嵌入式系统的智能化。嵌入式系统与人工智能、模式识别技术的结合,将开发出各种更具人性化、智能化的嵌入式系统。嵌入式Linux系统开发的优势Linux系统作为一个嵌入式操作系统具有许多的优点,如系统稳定、功能强大、支持多种硬件平台、应用软件多、简单易用。以下几点就具体说明了本系统选择嵌入式Linux作为操作系统的原因[12],所有的这些,都是现有的嵌入式操作系统所无法比较的。(1)使用本钱低。几乎所有的商业用操作系统如Microsoft公司的Windows98/NTSERVER/NTWorkstation系列,都需要为每一个拷贝支付相当数量的费用,在其下的应用软件每一个都需要大量的支出来获得。商用操作系统下建立了一个开发工具链,用户除了要为操作系统本身付费之外,还要为组成工具链的应用软件工具包支付大量的费用。但是Linux是免费软件,只要遵守GPL的规定,就可以免费获得拷贝。Linux下有同样遵循GPL规定的C、C++、Java等等一系列的软件工具开发包,从功能角度上看并不亚于商用开发包,同时可以极大的降低开发本钱。(2)源码公开。Linux可以随意地配置不需要任何的许可证或商家的合作关系,任何人可以修改并在GPL下发行。开发人员可以对操作系统进行定制,由于有GPL的控制,大家开发的东西大都相互兼容,不会走向分裂之路。Linux用户遇到问题时可以通过Internet向网上成千上万的Linux开发者请教,即使最困难的问题也有方法解决。Linux带有Unix用户熟悉的完善的开发工具,几乎所有的Unix系统的应用软件都已移植到了Linux上。其强大的语言编译器gcc、g++等也可以很容易得到,不但成熟完善,而且使用方便。(3)支持多种硬件平台。Linux因为有了一个大的支持者群体,其中许多人都编写驱动程序和其它的更新程序并且免费的通过Internet网络进行分发,这意味着对新硬件的Linux驱动程序甚至比用于其它的UNIX系统的驱动程序还来得及时。现在Linux已经被移植到多种硬件平台,支持包括X86、MIPS、PowerPC、ARM等现有的绝大局部微处理器体系结构。这对受开销、时间限制的研究与开发工程是很有吸引力的,原型可以在标准平台上开发然后移植到具体的硬件上,加快了软件与硬件的开发过程。(4)文档技术支持完善。Linux有非常多的文档支持,从为初学者准备的各种教程到非常详细的联机帮助文档。Linux是互联网充分开展的产物,许多关于Linux的文档都可以在Internet上找到和下载。LinuxDocumentProject是为Linux提供系统化的文档支持的工程,在世界上许多程序员和用户的帮助下,它已经收集了非常详细的系统文档和使用文档。而且,各种关于Linux的书籍和杂志正如雨后春笋般地出现,大量的英文资料也正在翻译成中文,方便中文使用者。用户还可以通过Linux新闻组得到很好的支持。对Linux的支持绝大局部是通过用户团体在Usenet新闻组上提供的。这上面广泛收集有大量的FAQ,其内容包括Linux安装、配置和故障定位的方方面面。(5)强大的网络功能。Linux操作系统突出的是网络局部,根本上所有的网络协议和网络接口都可以在Linux上找到,Linux内核比标准的UNIX更加高效地处理网络协议,系统的网络吞吐性能非常好,这也是为什么Linux在网络效劳器市场上占据越来越大市场份额的一个原因。(6)微内核模块化体系结构。Linux操作系统本身的微内核体系结构相当简单,网络和文件系统以模块形式置于微内核的上层,驱动程序和其它部件可在运行时作为可加载模块编译到或者是添加到内核,这为构造定制的嵌入系统提供了高度模块化的构件方法,使添加部件非常容易。(7)系统小巧。一个功能完备的Linux内核要求大约1M内存。而Linux微内核只占用其中很小一局部内存,包括虚拟内存和所有核心的操作系统功能在内,只需占用系统的100K内存。只要有50OK的内存,一个有网络协议栈和根本实用程序的完全的Linux系统就可以在一台8位总线〔SX〕的Intel386微处理器上运行的很好了。由于内存要求常常是根据需要的应用所决定的,Linux系统甚至可以仅使用256KBROM和512KBRAM进行工作,完全适合于资源有限的嵌入式硬件平台。1.4论文的主要工作和内容安排本文在广泛了解视频监控的开展现状和开展趋势的根底上,结合嵌入式系统、网络数据传输技术,数字图像压缩技术,提出一种基于嵌入式Linux的网络视频监控系统设计方案。重点介绍了系统软件设计环境的搭建和系统软件的实现过程。整个论文的结构安排如下:第一章主要介绍课题的背景和意义和视频监控系统的国内外开展现状和开展趋势。嵌入式系统的定义,嵌入式系统的特点以及嵌入式开展历程与趋势,引出本系统选择嵌入式Linux系统作为系统平台的原因所在。最后引出本论文设计的主要工作和内容安排。第二章介绍网络视频监控系统的软件设计环境的搭建,首先给出了系统的总体结构设计,接着说明本系统的硬件平台选择ARM开发板的原因,以及简单介绍ARM9开发板S3C2410的硬件资源,最后给出主机开发环境的搭建。第三章主要涉及到一些移植工作,首先给出了整个系统的启动过程,然后对各个启动的各个环节进行分析,并把这些环节移植到ARM平台上。这些移植的环节包括BootLoad的移植,Linux内核的移植,YAFFS文件系统的移植和用BusyBox版本制作根文件系统。第四章涉及到网络视频监控终端软件的设计。首先给出图像采集的一些知识,包括驱动的加载和设计,基于video4linux的图像采集的实现过程。然后涉及到图像的网络传输设计,包括web效劳器的构建,CGI用户验证,视频效劳器端设计和客户端JavaApplet的设计以及HTML网页的设计等。第五章给出系统设计方案的实验测试,并对研究工作进行了总结,给出了论文的缺乏之处和对下一步的研究工作提出了展望。第二章系统开发环境的建立2.1系统总体结构设计本文本着稳定性、可靠性和实用性以及性价比高的原那么,运用当前的网络技术、视频压缩技术和嵌入式技术等设计的基于嵌入式Linux系统的网络视频监控系统。该系统是以嵌入式Linux系统和嵌入式控制器S3C2410为核心平台,在这个平台上建立web效劳器和视频效劳器。利用TCP/IP协议技术实现了网络通信,把USB数字摄像头采集到的图像进行JPEG压缩,然后通过网络传输到远程计算机的客户端。客户端方采用JavaApplet技术实现图像的接收并完成显示功能。客户端的用户可以通过具有java插件的浏览器实现监控的目的。如图2.1所示的系统总体结构图。图2.1系统整体结构图整个系统分为以下四个局部:图像采集局部。该局部利用USB摄像头完成视频图像的采集的工作,USB摄像头使用的是中星微的zc301p芯片的高清晰摄像头,该芯片具有JPEG视频图像的硬件压缩功能。嵌入式平台局部。嵌入式平台包括嵌入式ARM处理器和移植到ARM的Linux操作系统。并移植web效劳器到该平台,利于超文本文档传输。网络传输局部。该局部负责把采集到的图像通过网络传输到客户端,包括视频效劳器程序设计等。客户端浏览局部。该局部主要把接收的图像显示到浏览器上,便于监控。利用JavaApplet完成客户端的程序设计。下面就是针对提出的方案做具体的设计工作。2.2系统硬件的选型本系统使用的硬件平台是由广州友善之臂科技开发的一款基于ARM9的开发板SBC2410,其中央处理器采用韩国三星电子公司生产的S3C2410X。这是一款基于ARM920T内核的16/32位RISC嵌入式微处理器,带有MMU功能,其主频可以到达203MHz,同时采用了AMBA的新型总线结构,实现了MMU、AMBABUS、Harvard的高速缓冲体系结构,同时支持Thumb16位压缩指令集,从而能以较小的存储空间要求获得32位的系统性能。S3C2410X处理器简介S3C2410X处理器[13][14][15]提供了丰富的资源:16KB指令Cache和16KB数据Cache,以及MMU虚拟内存管理;LCD控制器;支持NANDFlash系统引导;SDRAM控制器;3通道的UART;4通道的PWM定时器;I/O端口;8通道的10位ADC和触摸屏接口;IIC总线接口;IIS总线接口;USB主机和USB设备控制器;SD和MMC卡接口;2通道的SPI;处理器还集成了RTC功能和具有PLL的芯片时钟发生器。S3C2410X支持从NANDFlash启动,NANDFlash具有容量大,价格低等优点。系统采用NANDFlash与SDRAM组合,可以获得很高的性价比。处理器采用1.8V/2.0V内核供电,3.3V存储供电,3.3V外部I/O供电,FBGA封装,共274个引脚。处理器还支持大小端模式存储字数据,其寻址空间可以到达1G,每个Bank为128MB,对于外部I/O设备的数据宽度,可以是8/16/32位,所有的存储器Bank都具有可编程的操作周期,而且支持各种ROM引导方式,其结构框图如2.2所示。图2.2S3C2410X结构功能框图核心模块介绍1.S3C2410内存控制器S3C2410内存控制器提供了对外部存储器访问的一些机制。如图2.3所示,将其外部寻址空间划分为8个区,其中6个区用于挂载ROM,SRAM等,其余两个区用于挂载ROM,SRAM,SDRAM等。从图中可以看出每个区的最大寻址空间为128M。对应启动方式的不同内存布局也是不一样的,从NorFlash启动的内存布局如图2.3(2)所示,而图2.3(1)为从NandFlash启动的内存分布图。值得注意的是S3C2410内部集成了4KSRAM,当从NandFlash启动的时候,其被映射到0x00000000-0x00001000地址空间,从NorFlash启动时,其映射的地址段为:0x40000000-0x40001000。这个4K的SRAM空间对于注册和建立中断效劳历程〔ISR〕是非常有用的,中断向量表位于0x00000000-0x00000020空间内。系统上电或从新启动时可以将bootloader从Flash内部拷贝到该4K空间内,从而可以执行中断效劳历程程序段,当控制权转到嵌入式操作系统,系统就可以很容易的改变中断效劳历程函数,原因在于SRAM为内部内存,其读写速度较外部内存有极大的优势,并且不会改变Flash内部存储的中断效劳历程设置代码。核心板使用的存储器有以下几种:AMD公司的AM29LV8000B(NorFlash,1MB),还有SumSung公司的K9F1208U0B(NandFlash,64MB),以及不是太经常使用的现代公司的HY57V561620CTP(SDRAM,32*2MB)。NorFlash是挂载在bank0上的,其连线方式与S3C2410A手册的16bit线宽连线方式一致。S3C2410内部集成了NandFlash控制器,所以其不挂载在任何一个区,其读写功能均由控制器完成。按照Bank6和Bank7两个区必须挂载相同内存大小的RAM的规定,分别将两个32M的SDRAM挂载在两个区,其硬件连接方式可以参考S3C2410手册[16],其寻址空间为0x30000000-0x37ffffff。图2.3S3C2410X内存映射图2.NandFlash控制器Flash存储器技术可以说是EPROM和EEPROM非易失性存储器技术的综合,但是它们又有区别,比方:Flash存储器可以按块进行擦除操作,而EEPROM只能按位擦除,显然flash存储器在擦除速度方面有优势。Flash存储器是一个成熟的技术,其相对其它非易失性存储器如EPROM和EEPROM有很多优势,因此在嵌入式系统用常常使用Flash存储器代替EPROM和EEPROM,市场上大局部嵌入式产品都是使用Flash存储器作为固化存储器。Flash存储器通常有NorFlash和NandFlash两种,在核心板上两者均有使用,由于价格因素NorFlash容量采用1M,而NandFlash使用了64M,鉴于NandFlash容量较大,此次采用的嵌入式系统启动方案为NandFlash启动。为支持NandFlash启动,在S3C2410内部集成了4k内部SRAM缓冲区〔称为"Steppingstone"〕,当目标板上电或被复位重新启动时,NandFlash最前4KB内容将会被拷贝至SRAM中执行。此局部程序运行后,将会把NandFlash中其它编译过的程序,如Linux内核和根文件系统拷贝到SDRAM(bank6和bank7扩展的外部内存)运行。由于NandFlash本身的缺陷,这些拷贝的数据均要经过数据有效检查〔ECC〕。图2.4展示NandFlash控制器的主要功能模块及其模块之间的联系。图2.4NandFlash控制器图2.5NandFlash操作模式从图2.5我们可以看出,对于NandFlash控制器,当嵌入式系统从NandFlash,启动时有两种操作模式:一种是自动启动模式(AutoBootMode),另外一种是NandFlash模式(NandFlashMode)。自动启动模式是在嵌入式系统对NandFlash进行读写前自动由其相关存放器〔SFR〕将nandFlash前面4KB代码自动拷贝至内部SRAM〔Steppingstone〕然后自动运行,在启动启动模式中,是按照以下四个步骤进行的[16].1〕重新启动完成。2〕当自动启动模式被使能,NandFlash最前4KB数据被拷贝到内部SRAM缓冲区中。3〕内部SRAM缓冲区被映射到Bank0区,地址为0x00000000-000000020。4〕CPU执行内部SRAM中的代码。值得注意的是:在自动启动模式中,ECC功能被禁止,为此NANDFlash存储器的最开始的4KByte空间必须是连续没有坏块的。SBC2410硬件资源SBC2410开发板是基于三星公司的ARM处理器S3C2410X,采用6层板设计。开发板集成了64MSDRAM、64MNandFlash、1MBootFlash、RJ-45网卡、音频输入与输出、USBHost、USBslave、标准串口、SD卡插座、用户按键和一些用户灯等设备接口,并且引出CPU的大局部信号引脚。核心板上同时具有NorFlash和NandFlash,可以通过调线BOOTSEL选择启动方式(NorFlash启动或NandFlash启动),对应的硬件资源[8]如表2.1所示。表2.1SBC2410硬件资源表2.3主机开发环境的搭建进行嵌入式开发,首先要搭建一套完善的开发环境,这套开发环境包括操作系统以及连接器、编译器和调试器在内的软件开发工具。由于在嵌入式开发板上资源有限,不能在开发板上运行开发工具和调试工具,因而采用一种交叉编译调试环境,即在宿主机〔通常是PC主机〕上建立交叉编译调试环境,生成可执行文件,然后下载到目标板上运行。系统开发环境的搭建方法如图2.6所示:图2.6系统开发环境搭建图图中宿主机是指X86结构的计算机,在宿主机上安装的操作系统有RedHatEnter-priseLinuxAS4和WindowsXP。嵌入式目标板就是友善之臂SBC2410开发板,宿主机与目标板的通信方式有JTAG并口通信、串口通信、USB接口通信和通过网线通信的方式。JTAG口主要下载vivi可执行代码到目标板,串口主要用来控制vivi命令和调试系统,有时也用来下载vivi可执行代码。Linux内核映像和根文件系统映像是由串口控制的通过USB接口下载的,网口主要负责把应用程序的可执行代码下载到标板。串口环境的搭建串口环境的搭建是通过设置超级终端参数建立的,主要设置可用串口,波特率等。Xp系统下串口环境的设置相对来说很简单,只需要翻开超级终端设置可用串口为COM1,波特率为115200就行了。Linux环境下的串口的设置是通过设置minicom实现的,minicom是Linux下常用的终端仿真程序,它类似windows下的超级终端。设置如下列图2.7所示:图2.7minicom设置Minicom窗口的翻开是通过命令#minicom-s实现的,图中/dev/ttyS0表示使用的是串口1。Exit退出后,设置文件就保存到/etc/minirc.df1文件中。设置完毕,翻开目标板上上的电源开关,就可以看到vivi的启动信息了。USB接口环境的搭建USB接口环境的搭建是在windows环境下建立的,USB接口主要负责Linux内核映像文件和根文件系统映像文件的下载到开发板上,这种下载的速度快,节约了开发时间。这种下载方式与超级终端协作完成。首先翻开超级终端进入vivi指令,然后按照vivi的命令下载。内核映像的下载命令:vivi>loadflashkernelu根文件系统的下载命令:vivi>loadyaffs-erootu然后出现USBhostisconnected.Waitingadownload提示符,翻开USB下载界面,选择要下载的映像文件。串口打印出下载的过程,如下所示下载根文件系统串口的打印过程:Now,Downloading[ADDRESS:30000000h,TOTAL:38162266]Downloadedfileat0x30000000,size=38162256bytesFlashparams:oobsize=16,oobblock=512,erasesize=16384,partitionsize=64667648ErasingandprogrammingNANDwithyaffsimageBlockerasing(addr/count)---Blockbad(addr/count)---Allcount-------------------------------------------------------------0x01348000/010860x00ef0000/0000101087NFS环境的搭建网络文件系统NFS最早是SUN开发的一种文件系统。NFS允许一个系统在网络上共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统的文件。Linux系统支持NFS,使用NFS的这种功能,就能很轻松地将宿主机上地文件挂载到嵌入式开发系统上去,这样不仅方便了嵌入式开发板对主机上文件地访问,而且极大地提高了嵌入式开发系统中应用程序地开发和调试效率。配置NFS,需要添加/etc/exports文件。/etc/exports文件格式以及说明如下:#共享目录主机名称1〔参数1,参数2〕主机名2〔参数3,参数4〕共享目录:是宿主机上要向外输出的以后目录主机名称:是允许按照指定的权限访问这个共享目录的远程主机参数:是定义了各种港问权限exports配置文件参数说明如表2.2所示:在我的开发板上exports配置如下:表2.2exports配置文件参数说明/FriendlyARM/root*(rw,sync,no_root_squash)这种配置表示输出共享/FriendlyARM/root目录,并且所有的IP都可以访问。在完成/etc/exports这个配置文件后就可以启动NFS效劳了,用service命令启动。#serviceportmapstart#servicenfsstart#serviceiptablesstop开发板要共享宿主机上的文件/FriendlyARM/root,只需要运行文件的挂载命令就可以了。和挂载本地文件系统时唯一不同的地方在于要挂载的文件系统的描述前加上远程文件系统的主机名或IP地址。挂载语法如下:#mount-tnfs20:/FriendlyARM/root/mnt挂载成功后,就可以把要调试的应用程序拷贝到宿主机/FriendlyARM/root下进行挂载调试,调试成功后就可以下载到开发板上永久保存。交叉编译工具的搭建交叉编译工具的搭建是整个系统很关键的一个步骤,这种工具的搭建是在宿主机Linux系统下完成的,主要给交叉编译工具指定路径,使其在编译代码时能够工作。本系统针对ARM平台的,现在有不少站点可以免费下载到针对ARM体系结构的交叉编译器。当前交叉编译器有多种版本,本系统使用的交叉编译工具版本的arm-linux-gcc,为了使用方便把这些工具路径参加到环境变量PATH中,只需要修改/etc/profile文件,修改如下:#Pathmanipulationif[`id-u`=0];thenpathmunge/sbinpathmunge/usr/sbinpathmunge/usr/local/sbinpathmunge/usr/local/arm//bin最后一行使把编译器路径参加到PATH,还有在系统中使用了和版本的交叉编译工具,版本主要用来编译vivi源代码,而本系统使用的Linux内核版本使Linux的,需要高版本的交叉编译器,主要用于编译busybox1.4以上版本的而设置的,其他版本的编译器在编译busybox的时不通过。交叉编译工具的搭建完毕就可以针对ARM平台进行本系统的移植工作,包括vivi的移植,Linux内核的移植,根文件系统的制作等。2.4本章小结本章主要完成了系统的整体设计方案,针对这个方案的需求完成硬件的选型,并简单的介绍了硬件的资源和结构。重点介绍了主机开发环境的搭建,包括串口,USB接口、网络接口和交叉编译工具的搭建,这是系统开发所必需的,随后的移植工作和用户应用程序的开发都是在这个环境下设计并完成的。第三章嵌入式Linux操作系统的移植嵌入式Linux操作系统能够有效的管理复杂的系统资源,同时提供了库函数、驱动程序、工具集和根本的应用程序,为设计工作带来诸多方便。为了能使用Linux自带的资源还需要把Linux操作系统移植到本系统使用的ARM开发平台上。目标板上Linux系统的运行需要经过几个步骤才能出现系统提示符或运行用户应用程序。系统加电后。首先从0x00地址开始取的BootLoader程序,然后判断系统是否要启动Linux内核映像,如果不启动那么进入BootLoader命令操作,如果启动内核,那么载入内核映像,内核对各种硬件设备进行初始化,挂载根文件系统,执行init进程,并从/etc/inittab取得配置文件,最后提示用户登陆或执行用户应用程序。目标板上Linux系统的启动过程如图3.1所示。图3.1目标板上Linux系统的启动流程嵌入式Linux系统从软件的角度看通常可以分为4个层次[17](1)引导加载程序。包括固化在固件〔¯rmware〕中的启动代码和Bootloader两大局部。(2)内核。特定于嵌入式板子的定制内核以及控制内核引导系统的参数。(3)文件系统。文件系统包括根文件系统和建立于Flash内核设备上的文件系统。通常用RAMDISK作为根文件系统。它是提供管理系统的各种配置文件以及系统执行应用程序的良好环境的载体。(4)用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核之间可能还会包括一个嵌入式图形用户界面。从软件分层的角度来看,本系统完成的主要工作有:BootLoader的移植,这里移植的是VIVI;Linux内核的移植,这里采用的是Linux.1;文件系统的移植,这里移植的是yaffs文件系统;根文件系统的建立,这里用Busybox1.5定制系统运行的根本应用程序。用户应用程序的设计在下一章完成。下面就从这个角度展开具体的移植工作。3.1BootLoader移植实现BootLoader的简介BootLoader(引导加载程序)是系统加电后运行的第一段代码。一般它只在系统启动时运行非常短的时间,对嵌入式来说,这是一个非常重要的系统组成局部。整个系统的加载启动任务由BootLoader来完成。在一个基于ARM的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader,通过这段小程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬环境带到一个适宜的状态,以便为最终调用操作系统内核准备好正确的环境。图3.2就是一个同时装有BootLoader、内核启动参数、内核映像和根文件系统的典型固态存储设备的空间分配结构示意图。图3.2空间分配结构图大多数BootLoader都包含两种不同的操作模式:启动加载模式和下载模式[18]。启动加载模式是从目标机上的某个固态存储设备上将操作系统加载到RAM中运行。在下载模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机〔Host〕下载文件。BootLoader是严重依赖于硬件而实现的,每种不同的体系结构的处理器都有不同的BootLoader。不过BootLoader的开展也趋于支持多种体系结构。比方U-Boot从最初支持PowerPC到目前同时支持PowerPC,ARM,MIPS,X86等多种体系结构。除了依赖处理器体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备的配置,也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种处理器而构建的,要想让其运行在一块板子上的BootLoader也运行在另一块板子上,通常都需要对BootLoader进行移植工作。所以在嵌入式世界里要想建立一个通用的BootLoader几乎不可能,于是出现了多种引导加载程序,如Blob、RedBoot、VIVI、U-Boot等。本节要做的工作就是移植适合自己板上的BootLoader,即VIVI的移植。VIVI的启动分析VIVI是由MIZI公司为ARM处理器系列设计的一个bootLoader,可用于ARM9处理器的引导。VIVI利用串行通信为用户提供接口,为连接VIVI,首先利用串口电缆连接宿主机和目标板,然后在主机上通过串口通信程序,并在目标板上正确设置VIVI以支持串口。VIVI也有前面说过的两种工作模式,启动模式和下载模式。启动模式可以在一段时间后自行启动Linux内核,这是VIVI的默认方式。下载模式是在出现上述信息后,按任意键即可。在下载模式下,VIVI为用户提供了一个命令接口,通过该接口可以使用VIVI提供的一些命令。VIVI常用命令如下表3.1所示:表3.1vivi的常用命令VIVI作为一种BootLoader,其运行过程大概分成两个阶段[20]。第一阶段的代码是在vivi/arch/s3c2410/head.s中定义,大小不超过10KB,它包括的内容是从系统上电后在0x00000000地址开始执行的局部。这局部代码运行在Flash中,它包括对S3C2410一些存放器、时钟等初始化并跳转到第二阶段执行。第二阶段的代码在vivi/init/main.c中,主要进行一些开发板初始化、内存映射和内存管理单元初始化等工作,最后会跳转到bootorvivi()函数中,接收命令并进行处理。如图vivi阶段1和阶段2的运行过程。VIVI代码执行完毕后,内存的分布情况如下列图3.4所示。VIVI的移植实现VIVI已经提供了对于S3C2410CPU系列开发板的根本设置,因而VIVI的移植相对简单。下载一个VIVI的源代码[21]到当前目录下,一般是一个压缩包,然后解压到本地目录下。〔1〕设置编译环境。进入解压的VIVI目录下,翻开Make¯le,修改如下。图3.3VIVI阶段1和阶段2的运行流程图〔2〕修改NANDFLASH分区。修改NANDFLASH分区目的是满足VIVI,内核和文件系统所占据分区大小要求。修改arch/s3c2410/smdk.c,将defaultmtdpartitions[]分区修改如表3.2所示。束ivi()阶段1开始阶段2开始图3.3vivi阶段1和阶段2的运行流程〔2〕修改NANDFLASH分区。修改NANDFLASH分区目的是满足VIVI,内核和文件系统所占据分区大小要求。修改arch/s3c2410/smdk.c,将defaultmtdpartitions[]分区修改如表3.2所示。表3.2defaultmtdpartitions[]分区信息图3.3VIVI执行完毕后内存划分情况〔3〕修改vivi的启动参数。本系统使用的内核版本是Linux2.6系列的,目前vivi代码不支持Linux2.6系列的内核启动,因而还需要在vivi代码中修改Linux内核的启动参数,修改arch/s3c2410/smdk.c。charlinux_cmd[]="noinitrdroot=/dev/mtdblock/3init=/linuxrcconsole=ttySAC0";也可以通过串口用paramset命令设置,设置如下:paramsetlinux_cmd_line"noinitrdroot=/dev/mtdblock/3init=/linuxrcconsole=ttySAC0,115200"〔4〕配置选项和编译。一般默认即可,用make进行编译,如果编译过程顺利,将会在当前目录下生成vivi二进制映象文件。3.2Linux2.6内核的移植Linux2.6代码目录结构在Bootloader成功移植后,下面的工作就是对内核的移植,在移植Linux2.6内核之前,还应知道Linux2.6内核源码的整体分布情况。Linux2.6操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。本文要移植的Linux2.6内核的版本是Linux1,下载网址[22]。其他版本大致相同,其源码的主要目录的组成如表3.3所示:表3.3Linux源码的目录结构和含义一般目录下面都有一个Kcon¯g和Make¯le文件。这两个都是编译时用到的辅助文件,其中Make¯le文件指出了编译时候需要的编译器,也是移植内核不可缺少的。内核代码的添加和修改Linux内核版本选用Linux.1,这是因为目前的较新版本是Linux2.6系列的,它较Linux2.4版本增强了内核核心转储,支持快速互斥,改良了I/O子系统,改良和局部重写了Modules功能,使之更稳定等,特别是s3c2410处理器纳入了linux2.6.内核,移植工作量相对减少。内核代码的添加和修改主要包括处理器平台的和编译器的配置,以及根据实际要求添加和修改一些代码。〔1〕修改主目录Make¯le。修改linux-.1目录下的Make¯le,指明交叉编译器,找到ARCH和CROSSCOMPILE,修改为下面两行代码。ARCH:=armCROSS_COMPILE:=/usr/local/arm//bin/arm-linux-〔2〕修改dev.c文件。dev.c文件是要建立NANDFLASH分区表并参加NAND分区,还包含添加NANDFLASH芯片支持,以及使Linux能从NANDFLASH启动。此文件在arch/arm/mach-s3c2410目录下。添加内容如下:/***********addhere*************/#include<linux/mtd/partitions.h>#include<asm/arch/nand.h>#include<linux/mtd/nand.h>/***********endadd*************/①建立NANDFLASH分区staticstructmtd_partitionpartition_info[]={[0]={name:"vivi",size:0x00020000,//这里vivi的所占的分区大小为128Koffset:0,},[1]={name:"param",//这里param的所占的分区大小为64Ksize:0x00010000,offset:0x00020000,},[2]={name:"kernel",//这里kernel的所占的分区大小为2Msize:0x00200000,offset:0x00030000,},[3]={name:"root",//这里root的所占的分区大小为61Msize:0x03eac000,offset:0x00230000,}};②参加NANDFLASH分区structs3c2410_nand_setnandset={nr_partitions:4,//指明partition_info中的定义得分区数目partitions:partition_info,//分区信息表};③建立NANDFLASH芯片支持structs3c2410_platform_nandsuperlpplatform={tacls:0,twrph0:30,twrph1:0,sets:&nandset,nr_sets:1,};④参加NANDFLASH芯片支持到NANDFLASH驱动structplatform_devices3c_device_nand={.name="s3c2410-nand",//设备名称.id=-1,//有效的设备编号.num_resources=ARRAY_SIZE(s3c_nand_resource),.resource=s3c_nand_resource,//存放器数组首地址/*添加NANDFLASH设备*/.dev={.platform_data=&superlpplatform}};〔3〕指定启动时候的初始化。Kernel启动时依据分区信息进行初始配置,还需要修改arch/arm/mach-s3c2410/mach-smdk2410.c文件,指明初始化时包含前面所设置的FLASH分区信息。staticstructplatform_device*smdk2410_devices[]__initdata={&s3c_device_usb,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c,&s3c_device_iis,/*添加下面代码*/&s3c_device_nand,};〔4〕禁止FLASHECC校验。Linux内核是通过Bootloader写入到NANDFLASH里面的,Bootloader通过软件ECC算法产生ECC校验码,这与内核的校验不一致,内核的ECC校验码是通过s3c2410中的NANDFLASH控制器产生的,因而要禁止ECC校验。修改drivers/mtd/nand/s3c2410.c如下。staticvoids3c2410_nand_init_chip(structs3c2410_nand_info*info,structs3c2410_nand_mtd*nmtd,structs3c2410_nand_set*set){......//chip->eccmode=NAND_ECC_SOFT;chip->eccmode=NAND_ECC_NONE;}}Linux内核的定制和编译.1Linux内核的定制Linux内核的定制就是对内核进行配置。内核支持4种不同的配置命令,这几种命令只是与用户交互的界面不同,其功能是一样的,每种命令都会通过读入一个默认的根目录下的con¯g隐藏文件。这4种配置命令及其含义如表3.4所示:表3.4Linux内核配置命令及含义其中makemenucon¯g命令的配置比较广泛,是经常使用的配置方法。如图3.5所示是linux.1的配置的主界面。内核配置界面的每个选项前有个都有个括号,可以通过按空格键或者Y键包含该选项,按N键表示不包含该选项。另外,这里的括号还有3种,即中括号、圆括号和尖括号。通过空格键选择相应的选项时可以发现中括号里要么是*号,要么为空;尖括号里可以是空,*和M,分别表示不包含该选项、包含该选项和把该选项编译成模块但不编译进内核;圆括号的内容是要求用户在所提供的几个选项中选择一项。Linux内核的配置选项比较多,一般情况下,使用厂商提供的默认配置文件〔这里使用三星的smdk2410defcin¯g配置文件〕,然后根据需要再除去个别功能选项,添加自己的功能选项即可。在smdk2410defcon¯g的根底上让内核支持从NANDFlash启动需要添加如下配置选项。图3.5Linux2.6内核配置主界面Generalsetup--->(noinitrdroot=/dev/mtdblock/3init=/linuxrcconsole=ttySAC0,115200)MemoryTechnologyDevices(MTD)--->[*]MTDpartitioningsupport/*MTD分区支持*/[*]Commandlinepartitiontableparsing//支持命令行修改flash分区[*]DirectchardeviceaccesstoMTDdevices[*]CachingblockdeviceaccesstoMTDdevicesNANDFlashDeviceDrivers--->[*]NANDDeviceSupport/*提供NANDFLASH设备支持*/[*]NANDFlashsupportforS3C2410SoC[*]S3C2410NANDdriverdebug/*NANDFLASH调试支持*/.2Linux内核的编译内核的定制完成之后,编译工作就很简单,下面是和内核编译有关的几个命令:〔1〕makeclean:该命令是在正式编译内核之前去除相关依赖文件,保证没有不正确的.o文件的存在。〔2〕makedep:该命令是编译相关的依赖文件。〔3〕makezImage:该命令是最终的内核编译命令。〔4〕makeinstall:该命令是把相关文件复制到默认的目录下。嵌入式设备的编译不需要这一步。翻开终端进入到Linux.1目录下,分别执行一下命令:#makeclean#makedep#makezImage编译过程会向终端打印编译信息,等编译完成之后,就会在arch/arm/boot/目录下生成zImage内核映像文件,表示内核定制完成。下载到开发板,测试内核启动是否成功。打印出下面信息,表示内核定制成功。NOW,BootingLinux......UncompressingLinux.......................................................................................done,bootingthekernel.Linuxversion.1(root@02.)(gccversion)#225ThuSep2712:18:21CST2007CPU:ARM920Tid(wb)[41129200]revision0(ARMv4T)CPU0:DVIVTwrite-backcacheCPU0:Icache:16384bytes,associativity64,32bytelines,8setsCPU0:Dcache:16384bytes,associativity64,32bytelines,8setsMachine:SMDK2410ATAG_INITRDisdeprecated;pleaseupdateyourbootloader.Memorypolicy:ECCdisabled,DatacachewritebackCPUS3C2410A(id0x32410002)S3C2410:core200.000MHz,memory100.000MHz,peripheral50.000MHzS3C2410Clocks,(c)2004SimtecElectronicsBuilt1zonelistsKernelcommandline:noinitrdroot=/dev/mtdblock/3init=/linuxrcconsole=ttySAC0......3.3yaffs文件系统的移植嵌入式文件系统的特点与种类通常使用的文件系统都是以硬盘或者光盘作为存储介质来存储数据的,但在嵌入式开发当中一般以Flash作为存储介质,和硬盘相比,Flash有自己独特的物理特性,所以必须使用专门的文件系统。也就是通常所说的嵌入式文件系统。嵌入式文件系统对文件的操作是通过层次结构实现的。用户程序可以通过文件I/O函数操作文件。嵌入式文件系统是嵌入式操作系统的一局部,它的任务是对逻辑文件进行管理,提供对逻辑文件的操作〔复制,删除和修改等〕接口,方便用户操作文件和目录。在文件系统的内部,又根据存储设备的特点,适用不同的文件组织模式来实现文件的逻辑结构。Flash的操作过程如图3.6所示:目前支持Flash的文件系统有以下几种:图3.6Linux2.6内核配置主界面1)JFFS和YAFFS〔YAFFS2〕。这些系统可以使用在没有初始化的NANDFlash和有CFI接口的NORFlash中。2)TrueFFS。该文件系统相当于Linux中的MTD层,必须配合其他文件系统才能使用。3)RAMFS、CRAMFS和ROMFS。这些文件系统功能简单,仅提供根本接口,属于只读的闪存文件系统。适合存储空间小的系统。YAFFS文件系统的移植YAFFS文件系统[24]〔YetAnotherFlashFileSystem〕是一种类似JFFS的文件系统。和JFFS相比,它减少了一些功能,因此速度更快、占用的内存更少。此外YAFFS文件系统自带NANDFlash芯片驱动,并为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD和VFS,直接对文件进行操作。YAFFS是专门为NAND闪存设计的,它的出现使的价格低廉的NANDFlash芯片具有了高效性。YAFFS文件系统性能优越易于移植,其源代码中的相关文件及其功能描述如表3.5所示。本Linux内核里没有ya®s源代码,不支持ya®s文件系统,需要把该文件系统移植到内核中。从网上下载[25],把ya®s代码拷贝到/fs/ya®s目录下。下面是移植过程。〔1〕代码的修改。修改fs/Kcon¯g。添加下面一行到fs/Kcon¯g文件中。source"fs/yaffs/Kconfig"同时修改fs/makefile。添加下面一行到fs/makefile文件中。obj-$(CONFIG_YAFFS_FS)+=yaffs/表3.5Linux内核配置命令及含义〔2〕配置内核时选中YAFFS支持。翻开Linux内核配置界面,配置如下选项。Filesystems--->Pseudofilesystems--->[*]/procfilesystemsupport[*]/devfilesystemsupport(OBSOLETE)[*]Automaticallymountatboot[*]Virtualmemoryfilesystemsupport(formershmfs)Miscellaneousfilesystems---><*>YetAnotherFlashFilingSystem(YAFFS)filesystemsupport[*]NANDmtdsupport[*]UseECCfunctionsofthegenericMTD-NANDdriver[*]UseLinuxfilecachinglayer[*]Turnoffdebugchunkerasecheck[*]CacheshortnamesinRAM〔3〕yaffs文件系统的测试。编译添加ya®s文件系统的Linux内核,生成的内核映像文件下载到开发板,启动开发板,内核会向串口打印出内核运行的信息,如下显示说明yaffs移植成功。NANDdevice:ManufacturerID:0xec,ChipID:0x76(SamsungNAND64MiB3,3V8-bit)ScanningdeviceforbadblocksCreating4MTDpartitionson"NAND64MiB3,3V8-bit":0x00000000-0x00020000:"vivi"0x00020000-0x00030000:"param"0x00030000-0x00230000:"kernel"0x00230000-0x03eac000:"root"把添加yaffs文件系统的Linux内核映像下载到开发板上运行,此时会出现Kernelpanic-notsyncing:Attemptedtokillinit!内核恐慌信息,主要是没有建立根文件系统。3.4根文件系统的建立从上一节中看到,如果没有根文件系统,会出现内核恐慌提示,其原因是启动后内核调用的第一个进程/sbin/init不存在。如果内核启动后发现init那么执行它,init寻找它的配置文件/etc/inittab,并开始执行其中的脚本,这个脚本用来执行加载所需要的模块、初始化网络、装载fstab中列出的所有驱动器等,最后启动getty程序,完成console和ttyS之间的通信。在显示器上打印login提示符并激活login程序,完成嵌入式操作系统的启动过程。目录结构的建立为目标平台制作根文件系统,要了解根文件系统的根本结构,表3.6说明了Linux根文件系统的目录结构。表3.6Linux根文件系统的目录结构登陆主机Linux系统,创立myrootfs目录,进入该目录,创立根文件系统需要的表4-6所列的目录。创立过程如下:#mkdirbinsbindevetclibroottmpusrprocoptmnt#mkdirusr/binusr/sbin这样就在myrootfs目录下创立了以上目录,下面就是针对主要目录设计或添加文件。设备文件的建立在Linux系统中任何对象〔包括设备〕都可以视为文件,在Linux系统中所有的设备文件都放在/dev目录下面,建立设备文件通常有两种方法,一个是直接把宿主机上面的拷贝过来〔拷贝的时候需要加上-dpR或-a参数〕,另外一种方法就是自己手工用mknod创立,这里我们使用手工创立特定的设备文件。mknod方法创立格式如下:#mknod权限设备文件名设备类型主设备号次设备号创立的主要设备文件和文件信息如表3.7所示:表3.7主要设备文件信息应用程序定制标准的Linux发行版本具有功能种类比较多的应用程序,这些应用程序占用的空间也很大,这对存储容量空间有限的开发板来说就不是理想的选择,在嵌入式开发过程中,经常用BusyBox来定制应用程序。BusyBox具有shell的功能,它能提供系统所需要的大局部工具,包括编辑工具、网络工具、模块加载工具、压缩解压缩工具、查找工具、帐号密码管理工具和进程相关工具等。目前BusyBox的最新版本是BusyBox-版本[26],下载解压,切换到BusyBox的根目录下,修改Make¯le,找到ARCH和CROSSCOMPILE修改如下:ARCH?=armCROSS_COMPILE?=/usr/local/arm//bin/arm-linux-#makedefconfig#makemenuconfig在默认的选项前提之下,选项设置如下:BusyboxSettings--->BuildOptions--->[*]BuildBusyBoxasastaticbinary(nosharedlibs)//静态编译[]Buildsharedlibbusybox//动态编译InstallationOptions--->[*]Don'tuse/usrMiscellaneousUtilities--->[]taskset//选择此项编译不通过Shells--->Chooseyourdefaultshell(ash)--->在编译的过程中[*]Don'tuse/usr选中,不选的话BusyBox将默认安装到原系统的/usr目录下,这将覆盖掉系统原有的命令。在Chooseyourdefaultshell(ash)选中ash,这样在编译完成后的/bin目录下生成我们将要使用的sh,不然的话生成不了sh。[]taskset空着不选,选的话编译不通过。配置选项完成后,就开始编译,然后进行安装,采用默认安装方式,BusyBox默认是安装到根目录下的install文件夹,然后拷贝到myrootfs下相关目录下,如install/bin拷贝到/myrootfs/bin,install/sbin拷贝到/myrootfs/sbin。拷贝时带上参数-a或者-dpR。这样根本的应用程序就定制完成。系统配置文件的建立系统配置文件放在/etc目录下,为了了解系统启动时需要哪些配置文件,先分析一下BusyBox的init启动过程。在Linux内核被载入之后,机器就把控制权转交给内核,Linux的内核启动之后,做了一些工作,然后找到根文件系统里面的init程序,并执行它,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论