基于ARM的嵌入式Linux平台的研究与实现_图文._第1页
基于ARM的嵌入式Linux平台的研究与实现_图文._第2页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

1、电占村技女誊硕士学位论文MASTERDISSERTATION论文题目牡于A剐切的嵌人式Linl ? x平台的昕究与实现学科专业指导教师计算机应用技术罗管教授作者姓名班学号夔丝200520604033摘要摘要作为世界上最优秀的操作系统之一,Linux不仅在服务器领域有着不可撼 动的地位,而且正在嵌入式领域发挥着越来越重要的作用。有专家预测,Lill uX将是未来最主要的嵌入式操作系统之一,将广泛应用在各种消费电子和通信设 备中。因此,产生并逐渐形成了嵌入式Linux这项技术。然而,面对嵌入式系 统多样化的硬件平台以及多样化的应用,如何更快更好地建立基于Linux的软 件平台成为一个必须解决的问题

2、。本文正是针对这个问题,以nu)【相关的基础软件为主要研究对象,在深 入分析引导加载程序、nux与处理器相关的代码、文件系统以及设备驱动的基 础上,对基于ARM的nux软件平台进行了创新性和探索性的研究。主要内容 为:在理解删体系结构的基础上,通过分析uboot源码,详细研究ARM处理 器在上电后的启动过程和加载引导nux的过程;分析并总结Linux与处理器相关的接口,法;研究nuX文件系统的内容、制作和使用;分析Linux的设备驱动体系结构以及设备驱动的调用方式;在学习和研究的基础之上,针对S TMP3 6XX这款处理器,以中断控制器、定时器以及串口为主,提出了移植nux到新型处理器的思路和

3、方设计并实现引导加载程序,完成LinuX的移植、配置、编译,解决Linux启动过程遇到的问题,然后通过制作根文件系统 和实现NandFlash、LCD的驱动,完整地搭建起以nux为核心的软件平台,并进行了应用验证。在实际应用中, 嵌入式系统会使用很多不同类型的处理器,因此迫切希望能够 找到一个准则解决移植带来的问题。本文最重要的成果就是为Linux在新型处 理器上的移植提出了一个准则,根据该准则可以更加快速、更加准确地将Linu X应用到不同的处理器上,因此具有重要的现实意义。同时,本文将项目实践贯穿 于理论研究之中,涉及到Linux平台关键技术的分析、相关工具的使用以及开 发经验的分享,对学

4、习嵌入式Linux和设计嵌入式Linux系统具有较高的 参考和指导价值。此外,成功移植的STMP36xx已经初具规模,可以通过二次开发以形成完善的嵌入式产品。关键词:嵌入式Linux,移植准则,根文件 系统,引导加载程序,驱动ABSTRACTABSTRACTAsoneofthemostexcellemop耐i ngsystem s,LinuXanotOlllyhaSaunbudgeablepositioninseWers,butalsoplaySispredictedthatLimlxwillbeusedwidelyinconsumemorealldmoreimportantroleinemb

5、eddedfield.noneoftlle maine蜘【beddedoperatingsystelnsandwil lbeandelec的mcsco舢Ilullicationd嘶ce s.Soi sametechnologyofernbeddedLinuxhaSgeneratedalldsetupadeVelopped.HoweV%itproblemmathowtoillfaceofdiVersitySOfhWarcplatfomlbaSedon nuXquicH y锄dconVellielltl yofh砌warealldapplications.aInordertosolvethispr

6、oblem,mispaperhausde印andcreatiVeresearchinLinuxmebasisofunderStandingso胁areplatfO肌basedtheonARM.nemailltasksinclude:onarchitec姗feofAI泓,explored也estartsourceprocessofprocesSorandhowtoloadandabootLinuxviaanalyzingthewllicharecodeofuboot;summarizedsetofinterfacesarelev趾twithprocessorandpmfonWardmestand

7、ardofportingLinuxtOnewprocessor;exploredtheconteIlt,creationandusageoffilesystem;allalyzedmearcllitectureandmeru nf瓠hionofdeviced ver;accordingatotlleaboVeresearch,desi印edandimplemented compileaIldb00noaderofforSTMP36)【)【,kellrel,madeupfimshedamefileporting,systern,configuration,debugLinuxrootimplem

8、enteddriverofnandflashandLCD,atlaStcompletelyalldsettheso f两areplatfon nV嘶6editwithapplicatiolls.aresoThepmcessorsusedineHlbeddedsy stemsaVersatilematdeVelopperseXpectsuccssolutionforse戗ingupmesoftwareplatfonn.ThemostiIllportantoftllisareseaurchisp眦ingfonWardastalldardaccordingtowllich nuxcanbe印plie

9、dtoCoVersanewprocessor.SothispaperhaS a缈atsi嘶f ication.山m也is1 e锄andcanpaperlotofkeytechnologyincllmed ednu)developpment,usageofrelatedThesearetools锄dexp甜cllCc.vcryvalua _ bletosodesignan耐beddedLinuxsystan.Eesides,toSTMP36)(isbeasuccessmlmatitbeimproVedthro u曲developping印plicationsperl ectproduc t.Ke

10、ywords:锄beddedLi肌x,poningp血ciple,root丘lesystem,bootload%driVerU独创性声明本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的研究 成果。据我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已 经发表或撰写过的研究成果,也不包含为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。 与我一同工作的同志对本研究所做的任何贡献均已在论文 中作了明确的说明并表示谢意。年月日关于论文使用授权的说明本学位论文作者完全了解电子科技大学有关保留、使用学位论文的规定,有权 保留并向国家有关部门或机构送交论文的复印件和磁

11、盘,允许论文被查阅和借阅。 本人授权电子科技大学可以将学位论文的全部或部分内容编入有关数据库进行检索, 可以采用影印、 缩印或扫描等复制手段保存、 汇编学位论文。(保密的学位论文在解密后应遵守此规定)签名:壹雏导师签名:日期:.蘧皆年月日第一章引言第一章引言弟一早I百1.1课题背景当今世界已经进入了后PC时代。 后PC时代的绝大多数计算机是以非计算机 的形式出现的,例如作为随身物品出现的电话、遥控开关、电子戒指、电子手杖 等,再例如作为家庭网络组成部分的电视机、电冰箱、空调等。巨大的市场需求造 就了嵌入式技术的飞速发展。 嵌入式系统主要包括硬件、 嵌入式操作系统、各种中 间件以及应用软件。其中

12、,嵌入式操作系统是核心。随着嵌入式系统功能的不断增 强和应用的推广,对嵌入式操作系统的要求也越来越高。过去,nux以性能稳定和功能强大的优势稳居服务器以及桌面操作系统领 域的龙头地位。如今,LinuX也深入到了嵌入式操作系统领域。尤其在中国, 这里有世界上最大的家用电子产品需求,中国的工业正在进行着数字化、智能化的 改造,用户对嵌入式Linux系统的需求正在迅速扩大, 其发展速度将是惊人 的。根据美国投资发展公司的统计,全球嵌入式nux产品和服务的销售额将从2000年282 0万美元增长到2 0 0 5年的3.06亿美元,这在一定程度上 反映了嵌入式LinuX系统的快速增长速度。在中国市场上,

13、嵌入式Linux系统的应用领域越来越广泛,其中最主要的应用将包括四大领域:信息电器,如机 顶盒、网络家电等;移动计算设备,如手机、PDA、掌上电脑;网络设备,如路 由器、 交换机、 网络服务器、 网络接入盒等; 工控仿真L1|o1.2嵌入式Linux的特点为什么Li肌x会在嵌入式操作系统领域取得飞速发展呢?因为嵌入式Lin ux相比其它商业嵌入式实时操作系统有以下特点。Linl1)【支持多种CPU体系和常见处理器。嵌入式系统的一个最大的 特点就是硬件的多样性,nux支持几乎所有的处理器体系,包括x86、AI W、PPC和MIPs。对于基于ARM和PPC的处理器也有很好的支持,例如支持基于ARM

14、的EP7312、AT91、s3c2410等。对于没有MMU的4 4BO和451 0也可以使用Linux的另一版本uClinuxLin uX支持各种主流硬件设备和最新硬件技术,这意味着嵌入式LinuX将电子科技大学硕士学位论文具有更广泛的应用前景。Linu)【开放源码Linux从一开始就因为开源的特性而得到全世界 程序员的喜爱,它之所以有今天的成就,也依赖于狂热的Linux爱好者的卓越 贡献。在内核代码完全开放的前提下,不同领域和不同层次的用户可以根据自己的 应用需要方便地对内核进行改造, 成本低却能开发出满足自己需要的嵌入式系统。 相对于其它昂贵的商业嵌入式操作系统,这一点具有强烈的吸引力。良

15、好的设备驱动体系并支持各种外设LiImX将所有的外部设备看作文件 来处理,提供文件操作的接口,方便使用且易于扩展。I眦源码树中包括了几乎所有的设备驱动, 即使对于新的设备, 仅仅需要按照标准实现接口函数并注册设备 就可以使用。强大的网络支持功能Linux诞生于因特网时代并具有Umx的特性,保 证了它支持所有标准因特网协议,支持IPv6,并且可以利用Linux的网络 协议栈将其开发成为嵌入式的TCP/IP网络协议栈。对于需要网络支持的应用 来说,这一点非常重要。支持多种文件系统。Linux除了支持ext2fatl6fat32等常见文件系统,还支持ROMFS、JFFS、胙FS2等嵌入式系统专用的文

16、 件系统,为开发嵌入式系统应用打下了很好的基础。支持多种GUI。nux本身包含一些功能强大的GuI,但为了满足嵌入式GUI的需要,又加入了一些专门针对嵌入式系统的GUI,如Qt和Mill iGUI,前者适合美观的手机界面,后者特别适合需要用户界面的工业控制系 统,它们的特点是简单、直观、可靠、占用资源小且反应快速。Linux具备一整套工具链的支持。基于nux容易自行建立嵌入式系统的交叉开发环境,可以跨越嵌入式系统开发中仿真工具的障碍。传统的嵌入式开发 的程序调试和调试工具是用在线仿真器(IcE)实现的,一般价格比较昂贵。使 用嵌入式LinuX,一旦软硬件能够支持正常的串口功能,即使不用仿真器,

17、也 可以很好地进行开发和调试工作, 从而节省一笔不小的开发费用。 嵌入式Linu x为开发者提供了一套完整的工具链(toolchain)。它利用GNU的g cc做编译器,用gdb做调试工具,能够很方便地实现从操作系统到应用软件各 个级别的调试。正是因为LilluX支持广泛的硬件、具有稳定高效的操作系统内核、融合 了各种强大的中间件及完善的设备驱动和开发工具,所以嵌入式LinuX得以飞 速发展。毫无疑问,LinuX将成为未来嵌入式领域最重要的操作系统之一。2第一章引言1.3嵌入式Linux发展方向当前嵌入式LiIn 1】 【系统可谓各具特色。 嵌入式Linux系统开发已 经开辟了很大的市场,出现

18、了一批新型的公司参加这方面的竞争, 他们利用自己掌 握的嵌入式Lir腿的先进技术,吸引投资, 开发出成型的产品, 如Line。 、TimeSysFsmLabs等;也有一些传统的Linux公司开辟了这方 面的研究,如RedHat、VALinux等;更值得重视的是,一些传统的大 公司如IEM、SGI、Motoro1a、II1td等也进行了nux的嵌入式方面的研究和开发; 另外还有一些开发专有嵌入式操作系统的公司,如b,m【公司从专有操作系统方向转型到嵌入式nux系统, 并且更名为咖u)w.orks。这些公司的产品主要分为三类。第一类是专门为Linu)【的 嵌入式方向而做的,如何让nux更小、更容易

19、嵌入到功能、性能要求更高的硬 件中去是他们的产品开发方向,如Montdvista的HardHatLin ux等;第二类是专门为Linu)【的实时特性设计的产品,将Linux开发 成实时系统尤其是硬实时系统, 应用于一些关键的控制场合 (不仅仅是信息电器),如Fsllllabs公司开发出来的RT-Linux产品已经用在工业 控制的很多方面,葡萄牙的Coimbra大学已经利用R-T-nuX实现了化工生产控制厂里用来控制反应和程序控制的系统; 第三类的产品就是将实时性和 嵌入式方案结合起来的方案,很多公司都这么做,并且提供集成化的开发方案,如LineOTimeSvs在盘盘莹奇专宇。综观当前嵌入式Li

20、nux系统的产品和技术情况, 要满足用户市场的需求还 有很长的一段路要走。基于LinuX的嵌入式技术走向成熟,还需要围绕下面三 个方面做进一步发展:l. Linux的实时性扩充实时性是嵌入式操作系统的基本要求。由于nu)【还不是一个真正的实时 操作系统,内核不支持事件优先级和抢占实时特性,所以在开发嵌入式Linu)【的过程中,首要问题是扩展Linux的实时性能。对Lillux实时性的扩 展可以从两方面进行:向外扩展和向上扩展。向外扩展即从范围上扩展,让实时系 统支持的范围更广,支持的设备更多。目前的开发所面向的设备仅限于较简单的有 实时要求的串/并口数据采集、 浮点数据计算等,而像实时网络这样

21、实时系统的高 级应用还需进一步发展。向上扩展是扩充Linux内核,从功能上扩充Linu x的实时处理和控制系统。如嵌入式系统RT-nux,它的基本原理是将Linux本身的任务以及Li肌x内核本身作为一个优先级最低的任务,而实时任务 作为优先级最高的任务,即在实时任务存在的情况下运行实时任务,否则就运行L inuX本身的任务。实时任务不同于Lirlux3电子科技大学硕士学位论文普通进程。它是以Linux的可装载的内核模块(LoadableKem elModule,L幻订)的形式存在的,需要运行实时任务的时候,将这个实 时任务的内核模块插入到内核中去,实时任务和nuX一般进程之间的通信通过共享内存

22、或者FIFo通道来实现。2.改变Linux内核的体系结构LinuX的内核体系采用的是Mono linlic。在这种体系结构中, 内核的所有部分都集中在一起,而且所有的部件在一起编译连接。这样虽然能使系 统的各部分直接沟通,有效地缩短任务之间的切换时间,提高系统的响应速度和C PU的利用率,且实时性好;但在系统比较大时体积也比较大,与嵌入式系统容量 小、资源有限的特点不符。而另外一种内核体系结构M icrokenlel,在 内核中只包括了一些基本的内核功能,如创建和删除任务、任务调度、内存管理和 中断处理等部分,而文件系统、 网络协议栈等部分都是在用户内存空间运行。 这种结构虽然执行效率不如Mo

23、n oliUlic内核,但大大减小了内核的体积,同 时也方便了整个系统的升级、维护和移植,更能满足嵌入式系统的特点需要。为 此,要使嵌入式Linux的应用更加广泛,若将Linux目前的Monoli thjc内核结构中的部分结构改造成M icrokemel体系结构,可使得到 的Linux既具有很好的实时性,又能满足嵌入式系统体积小的要求。另外,Linux是一个需要占用存储器的操作系统。虽然这可以通过减少一 些不必要的功能来弥补,但可能会浪费很多时间,而且容易带来很大的麻烦。许多Linu)【的应用程序都要用到虚拟内存,这在许多嵌入式系统中是没有价值 的。3.完善的集成开发环境提供完整的集成开发环境

24、是每一个嵌入式系统开发人员所期待的。一个完整的 嵌入式系统的集成开发环境一般需要提供的工具是:编译/连接器、内核调试/跟 踪器和集成图形界面的开发平台,其中的集成图形界面开发平台包括编辑器、调试 器、软件仿真器和监视器等。在Linux系统中,具有功能强大的gcc编译器 工具链,使用了基于GNU的调试器gdb的远程调试功能,一般由一台客户机运 行调试程序调试宿主机运行的操作系统内核;在使用远程开发时还可以使用交叉平 台的方式,如在Windows平台下的调试跟踪器对LinuX的宿主系统做调试。但是,nux在基于图形界面的特定系统定制平台的研究上,与WindoWS操作系统相比还存在差距。因此,要使嵌

25、入式姗X在嵌入式操作系统领域中的优势更加明显,整体集成开发环境还有待提高和完善。国外的开发如火如荼,国内的开发也不甘示弱。8 6 3重点支持项目中就有使 用Linux作为嵌入式系统开发的方向。在嵌入式系统中具有强大的生命力和利 用价4第一章引言值,很多公司和大学都不同程度的表现出对这个方面的兴趣。相信嵌入式Li nuX的发展将带领我们进入嵌入式系统的新时代11.4本文主要工作及章节安排1.4. 1主要工作本课题来源于北京科银京成技术有限公司的针对消费电子产品的一个解决方 案,该方案需要在STMP3 6XX处理器上运行Linu】(操作系统,并为应 用开发提供支持。本人承担的主要任务是研究基于AR

26、M的基础软件平台,包括bootloaderLinuX与处理器相关的代码、 文件系统和设备驱动程 序, 力求为嵌入式Lin畎系统提供一套建立软件平台的方法,研究的内容如图1.1所示。对bootloader,分析它的工作原理以及如何加载引导操作 系统,特别是为了引导Linux,如何创建启动参数,如何建立Linux的运 行环境;对内核,研究并归纳出Linux与处理器相关的一套接口,为接口定义 严格的输入输出条件和功能,这套接口称之为 移植层;对文件系统,研究文件 系统的内容、制作和使用;对设备驱动,分析设备驱动的体系结构和调用方式,研 究如何添加一个设备的驱动程序。最后,在以上研究的基础之上,通过将

27、Linl IX移植到STMP36xx这种新型处理器进行了实践和验证,具体来说主要包 括以下4个方面:1)分析课题采用的硬件平台,在理解uboot实现的基础之上,根据实际条件设计并实现一种可以引导LinWl的bootloader一kernel pre,解决了LinuX下载和更新的问题;2)根据 移植层”接口定义,实现特定于STMP36xx的接口函数,搭建 交叉开发环境,完成Linux的配置和编译,解决Linu) 【启动过程出现的 问题;3)编写sheU脚本生成根文件系统的目录结构和/deV下的设备文 件,编译bllsybox生成厂bin下的可执行程序,编写/etc下的配置文 件,编译uClibe

28、生成/lib下需要的库,制作基于r锄disk的文件系 统, 并通过脚本实现文件系统的自动更新;4)实现NalldFlaSh驱动, 在其中一个分区建立j凰2文件系统, 通过读写文件验证了驱动的正确性;实现LCD驱动,编译基于MiniGUI的应用程 序,通过应用程序在LCD上显示图形验证了驱动的正确性;5电子科技大学硕士学位论文l硬件图卜l本文研究内容本文的主要创新在于总结了移植nuX到新型AIW处理器的一套接口,并 通过实践验证了正确性。虽然嵌入式系统采用各种各样的处理器,但借助这个研究 成果,可以极大地方便LinuX在不同类型的删处理器中的移植。分析以及相关技术和工具的使用,都具有较大的指导和

29、参考价值。本文研究还 涉及到了nuX的引导加载程序、文件系统和驱动程序,对它们的综上所述,本文为嵌入式hu)【系统软件平台的开发提供了一种思路。毫 无疑问,该研究和实践具有重要的现实意义。对个人而言,将极大地提高自身的理 论和技术水平;对行业而言,必将使得应用程序的开发更加便利,推动Linux在嵌入式领域更加快速地发展。1.4.2章节安排第一章介绍嵌入式Linux的的特点和发展方向。第二章分析uboot的运行过程, 着重分析了如何创建启动参数和设置nux的运行环境,然后详细描述了k锄elpre的设计和实现,对kernel程序下载和更新的方式以及内存空间的定位也做了说明pre的项目设置、第三章详

30、细描述Linux与处理器相关的接口和移植到STMP36XX的 具体过程,同时说明了内核移植代码如何验证、调试问题如何解决以及Linux的配置和编译。第四章分析根文件系统的内容,阐述根文件系统的制作过程,并对自动生成6第一章引言和更新根文件系统的shel l脚本进行了说明,同时也涉及到应用程序的交 叉工具链、部署等问题。第五章分析设备驱动程序的体系结构和调用方式,详细描述NandFlaS h和LCD驱动的实现,对设备驱动的添加、配置、编译和测试进行了说明。第六章结束语,对本文工作的成功与不足做了总结,对未来进一步研究做了展 望。1.5本章小结本章简要地介绍了嵌入式LinuX的特点和国内外研究方向

31、。正是在这样的 背景下,本课题研究并实现了嵌入式LinuX软件平台,具有较高的研究价值和 应用价值。下面将分四章分别进行描述。7电子科技大学硕士学位论文第二章bootloader的实现本章主要介绍课题采用的硬件平台以及bootloader的实现。通常由bootloader加载并启动Linux。在对当前流行的bootload er程序进行权衡和比较后,选择了uboot作为参考对象,并结合硬件自身特 点,最终形成了针对该目标板的引导加载程序kemeljre。2.1硬件平台概述处理器为STMP36xx,它是美国Se肿aTel公司生产的第四代单芯 片数字媒体系统,主要应用在数字音频播放器、PDA、录音

32、机、手机、便携式视 频播放器等CPU核采用ARM 92 6 EJ S,该核实现了ARMv5TE指 令集,工作在小端模式,异常向量表位于OxFFFFooOO【2】(3 1。除 了8K指令cache和8K数据cache外, 该核集成了64K的RoM和25 6K的SRAM。另外通过集成的外部存储接口(EMI)可以访问外接的No RflaSh和SDRAM, 通过通用媒体接口 (GPM I)还可以访问NAND flaSh。在该处理器中,存储空间映射如表2.1所示。表21存储空间映射地址范围0 x60000000一0 x61FFFFFF0 x80000000 0 x800FFFFFOxFFFFOOOO O

33、xFFFF FFFF存储类型片上SRAMSDRAMIO空间片上ROM0 0 0 0片上ROM包含由Sc肿aTel固化的初始化代码,上电后首先从OxFFFF取指令开始执行,经过一系列基本的初始化后,然后根据不同的引导模式完成 不同的功能:如果设置为正常引导模式,则从NANDflash上加载应用程序 (如果不能从NAND上加载,则还可以从其它介质加载,这里不再深究);如果 设置为恢复模式,并且连接主机与板上的USE接口,这时就可以从主机固化新的 应用程序到NANDnaSh中,通常更新应用程序就要使用这种方式。0 x00000000.OxO003FFFF明白了目标平台的基本情况和引导方式后,为了把n

34、u)【引导起来,应该如何实现bootloader呢?bootloader如何存放?完成哪些硬 件初始化?带着这些问题,第二章bootloader的实现分析了uboot的实现方法。2.2uboot分析bootload叫引导装载程序)是嵌入式系统软件开发的第一个环节,它 把操作系统和硬件平台衔接在一起,对于嵌入式系统的后续软件开发十分重要,在 整个开发中也占有相当大的比例。与熟悉的PC技术相比而言,它相当于PC上的BIOs和引导记录两部分的功能, 即完成基本硬件初始化和操作系统的加载,并 转入操作系统引导。U.Boot, 全称UrniverSalBootLoader, 是遵循G PL条款的开放源码

35、项目, 从FADSRoM、8xxROM、PPCBooT逐 步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U.B00t源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U .Eoot源码的注释中能体现这一点。但是U .Eoot不仅仅 支持嵌入式LinuX系统的引导,它还支持NctESD、VxWbrks、Q NX,、RTEMS、ARTOS和LynXoS嵌入式操作系统。这是U .Eo ot中UI liversal的一层含义,另外一层含义则是U Boot除了支持PowerPC系列的处理器外,还能支持M IPS、x86、AI蝴、NIO SXScale等诸多

36、常用系列的处理器。这两个特点正是U .Boot项目的 开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U.Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最 完善。出于这些的考虑,在课题中首先对uboot进行分析,力求掌握bOOtloader初始化的基本过程和引导LinuX的必要准备。2.2. 1运行过程分析为了与本文使用的硬件平台尽量保持一致, 在分析uboot时主要以A1w系列的目标板进行分析。它的运行过程对ARM系列的目标板都是一样的,只是调 用的与硬件有关的底层函数不同。uboot引导Linux的过程可以分成3个 阶段:首先在F lash中运行,完

37、成硬件最基本的设置,其中就包括sD洲的初 始化,然后将自身复制到SD洲中,最后转入SD洲运行;在SDRAM中执行各 种硬件的初始化;设置内核参数的标记列表,把内核拷贝到内存,最后跳转到内核 的入口。详细描述如下:1)程序首先在F 1aSh中运行。具体工作包括:设置异常向量表;设置CPu运行模式;设置系统的主频;屏蔽中断;关闭M肌r功能;初始化SDRAM控制寄9电子科技大学硕士学位论文存器;将ubOOt自身复制到SDRAM中;设置堆栈指针;转入SDRA M执行【4】。这部分用汇编语言编写,在ub00t/cpu/)【)【X/s tan.S中,其中x)()【表示一种具体CPU的名字。2)程序跳转到S

38、DRAM中执行uboot/l:|ba册厂board.c中的stanannboot()函数。该函数依次调用各个部分的初始化函数, 包括cpuillit、bo砌in it、int锄lptjnit、cnVinjt、iniHbaudrate、s舐aljnitconsole _硒t _ fdrallollit和flashinit等等,最后进入mainlOOpomainloop主要用于设置 延时等待,从而确定目标板是进入交互操作模式还是自动引导模式。在设定的延时 时间范围内,目标板将在串口等待输入,当有输入时,系统进入交互操作模式,反 之如果没有接收到相关命令, 系统将进入自动引导模式, 完成内核的加载及

39、引导。如果程序进入交互操作模式, 则可以响应用户输入的命令, 包括内存操作命令,j fl砒操作命令, 下载命令和引导命令, 为ubOOt的使用提供了更大的灵活 性。3)加载LinuX就是把Lin畎映像文件从f lash中拷贝到sD鼬蝴 中特定的地址(注意决不能随便拷贝到某个地址,该地址是内核编译后的虚拟地址以及目标平台SDRAM的起始地址共同决定的, 后面会讲如何计算),然后跳转到LinuX的入口执行。但是与引导其它嵌入式操作系统有两点不同:l,Linux初始化 时必须要挂载根文件系统, 并且需要从这个文件系统中执行一些初始化脚本(主要 位于/etc下),最后执行/bi n下的shel l程序

40、进入命令行交互。根文 件系统的实现有多种方式,比如最常见的r锄disk。把ramdisk的映像 文件做好以后(第四章介绍如何制作基于r锄disk的根文件系统),会固化到naSh中并由bootloader在加载Linux时一起拷贝到SDRAM中,这样Linu)【才能找到这个根文件系统并挂载。对于其它类型的根文件系 统,如j凰2,不需要boonoader事先拷贝到SDRAM;2, 在引导nux前需要创建引导参数。 主要包括SDRAM的起始地址和大小,r锄disk的起始地址和大小(也可在命令行参数中指定ini仃d=)【XX,x)【)【)以及命令行参数(主要包括根设备root=/deV/Xxx,控制台

41、 及控制台参数consOle xxxXXxxXx等)。创建的方式采用标记列 表(taggedlist), 这是和LinuX约定好的。下面会详细阐述如何 使用标记列表创建参数。2.2.2创建引导参数Lillu)2.4.x以后的内核都期望以标记列表(taggedli st)的形式来传递启动参数。启动参数标记列表以标记朋rAGCORE开始, 以标记触队GNoNE结束。10第二章bootloader的实现每个标记由标识被传递参数的tag_header结构以及随后的参数值数 据结构来组成。所有这些标记都在一块连续的内存中被创建,同时必须让内核知道 它们的起始位置【5 1。数据结构tag和tagjlead

42、er定义在LinuX内核源码的inc lude/姻州semp.h头文件中:/Thelist饥dswimallATAG丿寸。NEnode.奉/蜘e血eATAG_WoNEOx00000000s仃ucttagr headeru32size;/搴注意,这里size是字数为单位的幸/u32tag;;s仃ucttagstmcttagAeaderhdr; ulionstmctta&一corecore;s仃ucttagmeI1132m锄;ramdisk;stmcttag_VideoteXtVideotex t;s白ructtagramdisks白mCtta罟Oni仃dillitrd;strumta&a

43、mp;_ sefialnrseAalnr;stmcttagresionrclVision;s仃ucttag.videolfbVideolfb;st九Jcttag.cmdlinecmdline;I奉Acomspecifichdr.tag=触rAG-上ORE;p础吼shdr.size2tagi ze(ta臣core);par锄su.core.flags=O;par锄su.core.pagesize = O;p绷msu.core.rootdeV = O;params = ta & Jext(params);其中,EooTPARAMS表示启动参数在内存中的起始基地址,指针pa rams是一个s

44、tmcttag类型的指针。宏ta缈em()将以指向当前标 记的指针为参数,计算紧临当前标记的下一个标记的起始地址。这里BAG它字段并无意义。又如设置内存映射情况的示例代码:for(i=O;i VNUI _MEMAREAS;i+ + )CoRE仅仅表示开始,其i坟memorunapi.used)(par锄shdr.tag = Al队G.MEM;par锄Shdr.size = tagsizta&J nem32);p黜amsu.m锄.stan2memo巧mapi.start;p啪s _ u.mem.size=memo巧m印【i .size;p猢sta&一next(par锄s);2可以

45、看出, 在memo巧加ap数组中, 每一个有效的内存段都对应一个ATAGMEM参数标记。Linux内核在启动时可以以命令行参数的形式来接收信息,利用这一点可 以向内核提供那些内核不能自己检测的硬件参数信息,或者重载(ove盯id e)内核自己检测到的信息。比如,用这样一个命令行参数字符串consOle仕ysO,ll52OOll8”来通知内核以第一个串口作为控制台,且串 口设置为ll52OObps、无奇偶校验、8位l2第二章bootloader的实现数据位”。下面是一段设置命令行参数的示例代码:char幸p;/木eatleadingW枉teSpace幸/for(p = comm锄dline;宰戸

46、;p+ + )产skipnon eXistemCOmmandlines宰usesomek锄elwillstillitsdefaultcommandline.Ii坟术p/Ot)r etl l加;par锄shdr.tag = ATAG_CMDLINE;p捌rams ? h(lr.size =(si. zee)坟stnlcttagjleader)+stden(p)+ l+4)2;s缸Cpy(par锄su.锄dline.cm dline,p);params =ta受卫extO跏s) 7表示的是字数。下面是设置ATAG在上述代码中,设置tag_ _ header的大小时,必须包括字符串的终止符o,此外还

47、要将字节数向上取整为4字节的倍数, 因为tag-header结构中的size成员INITlD的示例代码,它告诉内 核在RAM中的什么地方可以找到initr.d映象(就是采用ramdisk的根文件系统映像)以及它的大小:p眦II nshdmg = ATAG INITIm2;p撇shdr.size = tag size(tag illitrd);paramsu.ini仃d.sizc = INITI_ LEN;paftns = ta&_ nex姬arams);最后,设置ATAGNONE标记,结束整个启动参数列表:para瑚shdr.tag = ATAG NoNE;pal.撇shdtsize=

48、O;所有这些参数的创建都是由uboot完成的,并存放到内核映像文件之前, 可以在内核中配置具体位置(参见第三章Makefile.boot文件的内 容),也可以由bootloader传递给内核,以便让内核找到。启动参数是特定于引导nuX的。另外在转入Linux运行前,还需要设 置nux的运行环境。parBASE;amsu.illitnd.sta t =RAMDISKRAM13电子科技大学硕士学位论文2.2.3启动Linuxbootloader启动Linux的方法是直接跳转到它的第一条指令 处。在跳转前,必须满足下面3个条件:1. CPU寄存器的设置:/RO=O:/R1=机器类型ID(每种类型的开

49、发板都有一个唯一的D编号,针对/I也=启动参数标记列表在洲中起始基地址;2. CPU模式:STMP36XX可以查找1inuv4rch/踟:11/t001s/mach types,为8 6 0 );/必须禁止中断(mQ和F IQ);/CPU必须SVC模式:3.Cache和MMU的设置:/MMU必须关闭;/指令Cache可以打开也可以关闭;/数据Cache必须关闭;如果用C语言, 可以像下列示例代码这样来调用内核 【6 1:Void(宰U1eKemel)(intzero,intarch,u3 2par锄s addr) =BASE;(Void(术)(int,int,u32)KERNELR AMthe

50、Kemel(O,ARCHjWMBER,(u32)kemel p ar锄s _奠art);其中KERNELRAMBASE为LinuX入口所在的地址, 为物理地 址;ARCHNIMBER为目标平台的ID;kenlelparamsst眦 为启动参数的起始地址。注意,meKemeI这个函数调用应该永远不返回。如 果这个调用返回,则说明出错。以上通过对uboot的分析,明白了boonoader运行的基本过程、 如何创建启动参数列表以及引导Linux前需要做哪些准备,这为在sTm3 6)【)【上实现bootloader奠定了基础。2.3kemel_pre的设计与实现kemeLpre的设计2.3.1经过前面

51、的研究和分析,要实现STMP3 6XX的booUoader有两 种方式:其一,第二章bootloader的实现移植uboot以支持sTMP36xx ;其二是利用sTMP36)【)【片上ROM已有的初始化代码完成板子的初始化,然后加入为了引导Linux而必须实现的一个功能,这看起来类似于二级bootloader。单独加入的 这个功能命名为k锄el内核启动做的准备工作。pre,意思是为Linux这两种方式各有优势。对于方式1来说,这是一种最彻底最完善的方式,即让uboot真正完全支持STMP36】【)【,但毕竟要花费较长的时间。另一 个因素是因为缺少配套的烧片器,即使能够成功移植uboot,但是如

52、何固化到 片上RoM则是无法解决的问题。 而且片上RoM不同于NORflaSh, 它是 可多次擦写还是只能写一次也无从查知。方式2的优势在于无需实现基本的硬件初始化,直接利用已经有的功能完成板 子的基本初始化;并且可以利用系统的恢复模式下载kenlelpre。在这样 的情况下,最终选择了方式2。前面讲过片上Ro M启动后将根据引导模式采取不同的行为,这里以图2一l再次说明。ResetWu多图2 lSTMP3 6xx启动示意图如果是恢复模式,则BootRo M调用updater程序,完成应用程序Player(Se肿aTel提供的音频播放程序)的更新,这里的更新指的是 把主机上的新的Player程

53、序通过配套的软件程序固化到STMP36xx的Nandflash中。如果是正常模式,BootROM调用BootMana ger, 后者再把Player从NandnaSh拷贝到SDRAM,最后跳转 到Player执行,在拷贝Play盯之前,已经由BootRo M和Boot Manager完成了板子的基本初始化。15电子科技大学硕士学位论文方式2就是把kenlelpre设计为这样:用kenlelpre替换P layer,然后固化到板子上,随后板子以正常模式启动,贝U可以执行到ken lelpre。因为在转入kenlelpre之前已经完成了系统的基本初始 化,所以k锄elpre的主要功能只是把Lill

54、ux和根文件系统映像拷贝到SDRAM中,然后为Linux构建启动参数,最后跳转到LinuX入口。但 是这里又有一个问题:LinuX和根文件系统如何下载?kenlelpre怎 样知道它们的存储位置?为了处理方便, 把Linux和根文件系统的内容作为数据放到kenlel pre中,这样它们就随kenlelpre一起下载到板子上,并且k锄elp re很容易知道它们的位置。具体处理如下:把Linux映像的内容放到kem elpre的一个数组里,并且记录Linux映像的长度,根文件系统的处理相 同,然后一起编译生成一个可执行程序。这样的好处在于因为kemelpre知 道Linux和根文件系统的位置和长度

55、,所以可以方便地把它们拷贝到特定的S DRAM空间,满足加载的需要。缺点在于造成kenlel过大,编译时间比较 长。并且需要两次拷贝,第一次由BOOtMallager把kenlelpr epre(包含了Linux和根文件系统)从f lash拷贝到内存,第二次由kemelpre把Linux和根文件系统拷贝到内存中特定的地方。由于有相应的工具可以将二进制文件的内容输出到一个无符号字符类型的数组 中,所以这也不失为一种好的解决办法。综上所述,得出这样的设计方案:保留BootRO M和BootManag er,将特定于Linux引导的程序(即kemelpre)和1丑nlX内核 映像及根文件系统映像一起

56、编译成一个可下载到目标板的程序,这个程序等效于Playerokemelpre的主要功能包括:11设置启动参数;2)将内核和根文件系统拷贝到内存中指定地址;3)跳转到内核执行;2.3.2kernel_ pre的实现forARMDeVeloperSuitekemel_ pre采用ARM公司的CodeWa orl.2工具开发,没有使用任何外部库,实现的源码如下:setllptack.S一入口函数,建立堆栈并跳到主程序;illit_s丽al.p.sTMP36xx的串口初始化程序;s甜al一 .一STMP3 6)【)【的串口输出程序,这里加入串口驱动主要是为了16第二章bootloader的实现打印字符

57、串,方便调试和验证;atag.h head.h标记列表相关定义,主要从Linux源码拷贝;寄存器相关定 义,如寄存器地址、寄存器位的定义等:Lilnlx内核转换后的数组以及数组长度的定义,通过工具自pData.h 一动生成;iData.h.一一根文件系统转换后的数组以及数组长度的定义,通过工具自动生成;p猢.c一 .一主程序, 包含拷贝Linux映像和根文件系统映 像,设置启动参数,最后跳转到内核程序;kenlelje的流程如图22所示。图2 2kenlel_ pre流程为了达到目的,kenlelpre的配置也很重要。配置主要完成keme lpre程序空MMU是关闭的,因此直接以SD洲中的物理

58、地址来操作。配置的 具体操作如下:具AI己M6_omELF转换为ELF格式。2)设置运行可执行文件的处理器。把LallguageSe仕i ngs中 的AI乇MARMCAssembler、间的定位,确定生成的目标指令码以及可执行 文件的格式。注意kemelpre运行时1)首先设置输出格式为ELFoAD sl.2生成的可执行文件格式为aXf,这里通过工Com研1er和ARMC+ +Compiler的ArdlitcctIJrcorProccssor中选择为17电子科技大学硕士学位论文A彻9 2 6 eJs。3)设置只读段的起始地址RObaLse为0 x614000 00。注意执 行kenlelpre

59、时MMU是关闭的,所以操作的都是物理地址。之所以把这个地址选在0 x614000 0 0这个高端的地方,是因为nux和引导参数在低端固定的位置,必须为它 们预留。经过编译连接,生成的可执行文件以它为基地址,往后依次安排数据段和 其它4)设置映像文件入口点(hllage咖Point)为beforc S tart,表示可执行文件从before段。st砒开始执行,该函数位于s酿lpstack.s。这 也是从BootManager跳转5)在删连接器中取消所有的库,保证kem elpre不连接任何其它的库,这样会减少出错的机会。因为对于这种底层的引导程序,能提供的功能很少,使用 别的库极有可能出错。另一

60、方面也减少了冗余代码。 到kenlelpre的地 址, 它直接决定了引导的成败。6)设置映像开始位置放置的文件为s帅stack. o这个文件。因为连接 器不一定把入口函数所在的文件放在最前面,所以入口函数的地址并不一定就是0 x614 0 0 0 0 0。如果入口函数的地址不确定,那么从B00tManager跳转 就会有问题。 所以这里将s咖stack. o放到最前面,因为该文件包括入口函 数,这样就保证了入口函数的地址为0 x61400000。71最后设置输出的可执行文件的格式为elfo完成代码编写和项目配置以后,编译生成可执行文件,然后通过一定的方式下 载到目标板。这里对整个过程做一总结,详见以下几步描述,并参见图2.3。1)使用工

温馨提示

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

评论

0/150

提交评论