




已阅读5页,还剩59页未读, 继续免费阅读
(电路与系统专业论文)嵌入式控制器系统平台研究与实现.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 随着计算机技术的发展,尤其是嵌入式技术的突飞猛进,工业控制器领域的 智能化也取得了很大进步。在工业控制领域,目前主要还是使用传统的p ig 、d c s 、 工控模块等方式。在控制网络、信息技术高速发展的今天,迫切需要新一代的工 业控制器来推动自动化控制系统的发展,同时也对嵌入式控制器系统软件平台提 出更高的要求。随着计算机技术尤其是嵌入式技术的发展,嵌入式l i n u x 的系统 平台越来越符合工业控制领域提出的新要求,现已成为发展的主流体系和应用热 点。 本文研究了嵌入式控制器的软件开发技术,针对工业控制需求特点,完整实 现了适合应用的以嵌入式l i n u x 为核心的系统软件平台,包括了b o o t l o a d e r 程序 加载、内核的移植、驱动程序的开发、文件系统定制等。实践表明该系统软件平 台具有灵活性、可伸缩性和可剪裁性等显著优点,满足了对系统功能、可靠性、 成本、体积功耗的严格要求。该控制系统的研究,对嵌入式l i n u x 在嵌入式控制 系统的应用,对嵌入式系统软件平台的快速开发和功能性、适应性的研究具有重要 的应用价值。 关键词:嵌入式控制器嵌入式系统软件平台b o o t l o a d e r 内核移植 驱动开发文件系统 a b s t r a c t w i t ht h ed e v e l o p m e n to ft h ec o m p u t e rt e c h n o l o g y ,e s p e c i a l l yt h er a p i d l y d e v e l o p m e n to ft h ee m b e d d e dt e c h n o l o g y ,t h ei n t e l l e c t u a l i z a t i o no ft h ee m b e d d e d c o n t r o l l e ri n d u s t r yo b t a i n e dg r e a tp r o g r e s s i nt h ee m b e d d e dc o n t r o l l e ri n d u s t r y ,i t ss t i l l m a i n l yu s i n gt r a d i t i o n a lp l c 、d c sa tp r e s e n t i nt o d a yw i t ht h ec o n t r o ln e t w o r ka n d i n f o r m a t i o nt e c h n o l o g y sh i g hs p e e dd e v e l o p m e n t ,i t sn e c e s s a r yt h a tt h en e w g e n e r a t i o no fi n d u s t r yc o n t r o l l e rt oi m p e lt h ed e v e l o p m e n to ft h ea u t o m a t i o nc o n t r o l s y s t e m ,w i mt h ed e v e l o p m e n to f t h ec o m p u t e rt e c h n o l o g y ,t h ee m b e d d e dl i n u xs y s t e m p l a f f o n ni sm o r ea n dm o l e :c o n f o r mt ot h en e wr e q u i r e m e n tw h i c ht h ee m b e d d e d c o n t r o l l e ri n d u s t r yp r o p o s e d ,a n da l r e a d yb e c a m et h em a i ns t r e a ms y s t e ma n dt h e a p p l i c a t i o nh o ts p o tt od e v e l o p e t l l i sa r t i c l eh a ss t u d i e dt h es o f t w a r ed e v e l o p i n gt e c h n o l o g yo ft h ee m b e d d e d c o n t r o l l e r ,a n dc o m p l e t e l yr e a l i z e dt h es o f t w a r ep l a t f o r mw h i c hh a ss u i t e dt h ea p p l i c a t i o na n dt a k e t h ee m b e d d e dl i n u xa st h ec o l es y s t e m ,i n c l u d i n gb o o t l o a d e r ,k e r n e lt r a n s p l a m ,d r i v e r d e v e l o p m e n t ,f i l es y s t e mc u s t o m - m a d e t h ep r a c t i c ei n d i c a t e dt h a tt h i ss y s t e ms o f t w a r ep l a t f o r mh a s t h ef l e x i b i l i t y 、t h ee x p a n da b i l i t ya n dt h ec u s t o m - m a d ea n ds oo i l a n dh a ss a t i s f i e dt ot h es y s t e m f u n c t i o n 、r e l i a b l e 、t h ec o s t t h es i z e a n d p o w e r l o s ss t r i c tr e q u e s t t h er e s e a r c h o f t h i sc o n t r o ls y s t e m h a st h ei m p o r t a n ta p p l i c a t i o nv a l u et ot h ea p p l i c a t i o no ft h ee m b e d d e dl i n u xi nt h ee m b e d d e d c o n u - o ls y s t e m , a n dt ot h ef a s td e v e l o p m e n ta n dt h ef u n c t i o no ft h ee m b e d d e ds y s t e ms o f t w a r e p l a t f o r m k e y w o r d :e m b e d d e d c o n t r o l l e r e m b e d d e d s y s t e m s o f t w a r ep l a f f o m b o o t l o a d e rk e r n e lt r a n s p l a n td r i v e rd e v e l o p m e n tf i l es y s t e m 创新性声明 本人声明所呈交的论文是我个人在导师指导下进行的研究工作及取得的研究 成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论文中不 包含其他人已经发表或撰写过的研究成果;也不包含为获得西安电子科技大学或 其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做 的任何贡献均已在论文中做了明确的说明并表示了谢意。 申请学位论 本人签名: 不实之处,本人承担一切相关责任。 日期z 固:2 :2 生 关于论文使用授权的说明 本人完全了解西安电子科技大学有关保留和使用学位论文的规定,即:研究生 在校攻读学位期间论文工作的知识产权单位属西安电子科技大学。本人保证毕业 离校后,发表论文或使用论文工作成果时署名单位仍然为西安电子科技大学。学 校有权保留送交论文的复印件,允许查阅和借阅论文;学校可以公布论文的全部 或部分内容,可以允许采用影印、缩印或其它复制手段保存论文。( 保密的论文在 解密后遵守此 本人签名: 导师签名: 日期翊:! :蛩 日期盘z :缉 有 一 鞴址 欤皱 文 一 第一章绪论 第一章绪论 1 1 本课题研究的目的和意义 在工业控制领域,目前主要还是使用传统的p l c 、d c s 、工控模块等方式。在 控制网络、信息技术高速发展的今天,迫切需要新一代的工业控制器来推动自动 化控制系统的发展,同时硬件性能的提升需要更高效、更实时的系统管理,因此,对 嵌入式系统软 牛的需求也变得迫切。随着计算枫技术尤其是嵌入式技术豹发展, 嵌入式l i n u x 的系统平台越来越符合工业控制领域提出的新要求,现已成为发展 的主流体系和应用热点。本课题针对工业控制系统的要求以及嵌入式系统技术在 工业控制中的应用情况,总结了基于嵌入式l i n u x 的嵌入式系统平台的开发技术, 并给出了案例实现。通过项目实践揭示了该系统平台的灵活性、可伸缩性以及可 裁减性等显著优点,适应嵌入式控制器系统对功能、可靠性、成本、体积、功耗 的严格要求。该控制系统的研究,对嵌入式l i n u x 在嵌入式控制系统的应用,对嵌 入式系统软件平台的快速开发和功能性、适应性的研究具有重要的应用价值。 1 2 嵌入式系统及其在工业控制领域的应用 厣要雾霉薯霪鬻羹雾篓鬻蠹鬻露雾薹歹 袋黪鬻霹蘩霁攀缨麓鹫繁群黧攀爹 瑷囊霉霉+ 气广 器4 以徽燃店随晦曙为瞽沁的硬i 牛平台喜 , l ,j ,”一一一二,4 j 一! 4 9 盏墨- 寓一一# 图 图1 1 嵌入式系统的构成 嵌入式系统( e m b e d d e ds y s t e m ) 是一种用于控制、监测或协助特定机器和设备 正常运转的计算机。它通常由3 个部份组成:嵌入式处理器为核心的硬件平台、 嵌入式软件系统、以及应用软件,如图1 1 所示。 嵌入式系统早在上世纪六十年代就被用于对电话交换进行控制,当时被称为 2嵌入式控制器系统平台研究与实现 “存储式过程控制系统”( s t o r e dp r o g r a mc o n t r o ls y s t e m ) 。真正意义上的嵌入 式系统是在上世纪七十年代出现的,发展至今已经有3 0 多年的历史,它大致经历 了以下4 个发展阶段: 第一阶段是以单芯片为核心的可编程控制器系统,同时具有检测、伺服、指 示设备相配合的功能。这一类型的系统大部分用于专业性极强的工业控制系统中, 一般没有操作系统支持,通过汇编语言对系统进行直接控制。这一阶段系统主要 的特点是:结构和功能相对单一、效率较低、存储容量较小、几乎没有用户接口。 由于这种嵌入式系统使用简单、价格便宜,以往在工业领域中应用较为普遍。但 是,它们已经远远不能适应高效的、需要大容量存储介质的现代化工业控制和后 p c 时代新兴的信息家电等领域的要求。 第二阶段是以嵌入式中央处理器( c p u ) 为基础,以简单操作系统为核心的嵌入 式系统。这一阶段系统的主要特点是:c p u 种类繁多、通用性较弱、系统开销小、 操作系统只具有低度的兼容性和扩展性、应用软件较为专业、用户界面不够友好。 这种嵌入式系统的主要任务是用来控制系统负载,以及监控应用程序的运行。 第三阶段是以嵌入式操作系统为标志的嵌入式系统。这一阶段系统的主要特 点是:嵌入式操作系统能够运行于各种不同类型的处理器之上,操作系统内核精 小、效率高、模块化程度高、具有文件和目录管理、支持多任务处理、支持网络 操作、具有图形窗口和用户界面等功能、具有大量的应用程序接口、开发程序简 单、并且嵌入式应用软件丰富。但是在通用性、兼容性和扩展性方面仍不理想。 第四阶段是以基于网络操作为标志的嵌入式系统,这是一个正在迅速发展的 阶段。随着网络在人们生活中的地位日益重要,越来越多的应用需要采用支持网 络功能的嵌入式系统,所以在嵌入式系统中使用网络操作系统将成为今后的发展 趋势。 嵌入式处理器是嵌入式系统中的核心部件,按照功能和用途划分,它可以进 一步细分为以下几种类型:嵌入式微控制器( e m b e d d e dm i c r o c o n t r o l l e r ) ,嵌入式微 处理器( e m b e d d e dm i c r o p r o c e s s o r ) 和嵌入式数字信号处理器( e m b e d d e dd i g i t a l s i g n a lp r o c e s s o r ) 。 l i n u x 为嵌入操作系统提供了一个极有吸引力的选择,它是个和u n i x 相似、 以核心为基础的、完全记忆体保护、多任务多进程的操作系统。支持广泛的计算 机硬件,包括x 8 6 ,a l p h a ,s p a r e ,m i p s ,p p c ,a r m ,n e c ,m o t o r o l a 等现有的大部分蕊 片。程式源码全部公开,任何人可以修改并在g n u 通用公共许可证( g n ug e n e r a l p u b l i cl i c e n s e ) 下发行,这样,开发人员可以对操作系统进行定制,再也不必担 心像微软i n d o w s 操作系统中“后门”的威胁。同时由于有g p l 的控制,大家开发 的东西大都相互兼容,不会走向分裂之路。l i n u x 用户遇到问题时可以通过 i n t e r n e t 向网上成千上万的l i n u x 开发者请教,这使最困难的问题也有办法解决。 第一章绪论 3 l i n u x 带有u n i x 用户熟悉的完善的开发工具,几乎所有的u n i x 系统的应用软 件都己移植到了l i n u x 上。l i n u x 还提供了强大的网络功能,有多种可选择窗口管 理器( x w i n d o w s ) 。其强大的语言编译器g c c 、g + + 等也可以很容易得到。不但成 熟完善、而且使用方便。 从当前的嵌入式系统的发展方向我们可以看出,a 跚代表单片机的发展方向: l i n u x 代表操作系统的发展方向;c c + + 代表了嵌入式开发语言的发展方向。从事 这个方面相关开发必将是未来嵌入式系统的发展热点。 工业控制系统的对嵌入式系统的要求就是必须满足工业过程控制的特点,它 具有以下六个方面的要求: 1 高可靠性,工业控制的控制器控制着生产过程,要求工业环境连续稳定运 行。也就是说要求能够在具有粉尘、高温、震动和电磁干扰的环境中长时间连续 可靠地工作。 2 简单方便的操作性能,具有人机联系功能,以便实现人机对话,及时地对 生产过程进行必要的干预。 3 可维护性,这是工业过程控制本身的要求,一旦控制系统发生故障将影响 生产的正常操作。要求工业控制系统结构便于维修,软硬件故障诊断功能强,以 利于快速查找故障,缩短维修时间。 4 网络扩展性能好,通用性强,具有良好的开放性能以便进行扩展。 5 控制系统的分散性,以及部分控制现场级数据的交互性。尤其在工业控制 系统内,由于对系统可靠性和灵活性的更高要求,控制面向多元化,系统面向分 散化:即负载分散、功能分散、危险分散和地域分散,为了能够实现设备之间大 量数据的充分共享,有效地支持分布式控制和实时控制,单纯依靠传统的串行通 信口,已不能满足需求。 6 工业生产过程进行实时在线检测与控制,对工况变化给予快速响应,及时 进行采集和输出调节,把各种操作分成不同的优先级处理,保证被控系统的正常 运行,特别是网络通信的实时性能的要求。当系统处在分散控制位置的时候,必 须要求部分通信具有很高的实时性。 嵌入式系统从一问世就应用于工业控制系统中,但进展得非常的缓慢。不过 随着人们对工业控制系统的开放性、互操作性、安全性、可靠性以及系统成本等 方面不断提出新的要求,基于嵌入式l i n u x 操作系统的嵌入式控制系统逐渐在工 业控制系统应用中发展成熟起来。它将在一定程度上取代现有的工业p c 控制系 统,在微型d c s 系统、现场总线系统、p l c 控制系统、智能化仪表等领域得到广 泛的应用。因此,对嵌入式控制器领域基于嵌入式l i n u x 的系统平台的研究与实 现就具有重要的实用意义。 嵌入式控制器系统平台研究与实现 1 3 本文的主要研究内容 嵌入式控制器的总体设计包括硬件、软件、驱动。 硬件包括s o c 芯片,比如基于a r m 9 2 0 t 的s a m s u n g 的s 3 c 2 4 l o 芯片;扩展的 s d r a m 存储器;扩展的固态存储器,比如n o r 型或n a n d 型f l a s h 芯片;调试开发 使用的2 3 2 串口和j t a g 下载口;扩展的以太网络接口;扩展的u s b 接口或s d 卡 接口;必要的传感器模块等。这为整个系统提供了硬件支持。一般开发过程为, 确定需求,芯片选型,画原理图,画电路图,布局布线,制作印制电路板,焊接 元件,调试。 软件包括b o o t l o a d e r 的定制和移植,内核的移植,文件系统的定制,这为嵌 入式多任务环境提供了系统软件的支持。 针对开发板所扩展的硬件,需要在内核中开发相应的驱动程序,支持应用层 对硬件功能的使用。通过硬件手册,了解硬件控制芯片的工作原理,编写驱动程 序中相应的功能部分的代码;针对操作系统的要求,实现驱动的框架和系统接口。 最后在硬件平台上进行功能测试。 本文所作的工作包括软件部分的定制和移植,还有驱动程序的开发。 论文的结构安排如下: 第一章,介绍了嵌入式技术的特点和工业控制器的发展趋势和要求,阐述了 本文的目的和意义。 第二章,简要介绍了b o o t l o a d e r 的概念和基本,并介绍了u - b o o t 在项目开发 板上的移植。 第三章,对嵌入式l i n u x 的特点进行了分析,并和其它的嵌入式操作系统进行 了比较研究,最后总结了基于2 4 1 8 内核的a r m l i n u x 在项目开发板上的移植过 程。 第四章,介绍了驱动程序的概念,重点分析了字符设备驱动程序的开发,包 括重要的数据结构和内核函数,最后总结了项目开发板上典型的驱动设计和移植 案例。 第五章,介绍了文件系统的概念和特点,分析了基于f l a s h 的嵌入式文件系统 结构和特点以及主要技术,最后总结了两种常用的文件系统在开发板上的移植过 程。 第六章,对整个研究工作进行了总结和展望。 第二章启动程序b o o t , l o a d e r 的分析与移植 5 第二章启动程序b o o t l o a d e r 的分析与移植 2 1 引言 引导加载程序是系统加电后运行的第一段软件代码。回忆一下p c 的体系结构 我们可以知道,p c 机中的引导加载程序由b i o s ( 其本质就是一段固件程序) 和位于 硬盘m b r 中的启动程序b o o t l o a d g r ( 比如,l i l o 和g r u b 等) 一起组成。b i o s 在完成硬件检测和资源分配后,将硬盘m b r 中的b o o t l o a d e r 读到系统的r a m 中, 然后将控制权交给b o o t l o a d e r 。b o o t l o a d e r 的主要运行任务就是将内核映像从硬 盘读到r a m 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像b i o s 那样的固件程序,因此整个系统的加 载启动任务就完全由b o o t l _ d a d e r 来完成。比如在一个基于a r m 9 2 0 te 1 ) r e 的嵌入 式系统中,系统在上电或复位时通常都从地址0 x 0 0 0 00 0 0 0 处开始执行,而在这 个地址处安排的通常就是系统的b o o t l o a d e r 程序。 b o o t l o a d e r 依赖于c p u 的体系结构,不同的体系结构需要不同的b o o t l o a d e r 程序。有些b o o t l o a d e r 也支持多种体系结构的c p u ,比如u - b o o t 就同时支持a r m 体系结构和m i p s 体系结构。另外,b o o t l o a d e r 也依赖于具体的嵌入式板级设备的 配置。就是说对于两块不同的嵌入式板而言,即使它们是基于同一种c p u 而构建 的,要想让运行在一块板子上的b o o t l o a d e r 程序也能运行在另一块板子上,通常 也要修改或重新配置b o o t l o a d e r 的源程序。 本章将从b o o t l o a d e r 的概念、主要任务、框架结构以及移植等四个方面来讨 论嵌入式系统的b o o t l o a d e r 。 2 2b o o t l o a d e r 的主要任务与典型框架结构 由于r o m 或f l a s h 运行速度相对较慢,在嵌入式系统中内核映像与根文件系 统映像一般是不在这样的固态存储设备中直接运行,而是都被加载到r a m 中运 行。从操作系统的角度看,b o o t l o a d e r 的最终目的就是正确地调用内核来执行。 另外,由于b o o t l o a d e r 的实现依赖于c p u 的体系结构,因此大多数b o o t l o a d e r 都分为s t a g e l 和s t a g e 2 两大部分。依赖于c p u 体系结构的代码,比如设备初始化 代码等,通常都放在s t a g e l 中,而且一般用汇编语言来实现,以达到短小精干的 目的。而s t a g e 2 则一般用c 语言来实现,这样可以实现更复杂的功能,并且代码 会具有更好的可读性和可移植性。【l l 以b o o t l o a d e r 的s t a g e l 执行的先后为顺序,其通常包括以下步骤: 1 硬件设备初始化。 2 为加载b o o t l o a d e r 的s t a g e 2 准备r a m 空间。 6嵌入式控制器系统平台研究与实现 3 拷贝b o o t l o a d e l 的s t a g e 2 到r a m 空间中。 4 设置好堆栈。 5 跳转到s t a g e 2 的c 入口点。 以执行的先后顺序,b o o l l o a d e r 的s :t a g e z 通常包括以下步骤: 1 初始化本阶段要使用到的硬件设备。 2 检测系统内存映射( m e m o r ym a p ) 。 3 将k e r n e l 映像和根文件系统映像从f l a s h 上读到r a m 空间中。 4 为内核设置启动参数。 5 调用内核。 2 2 1b o o t l o a d e r 的s t a g e l ( 一)基本的硬件初始化 这是b o o t l o a d e r 一开始就执行的操作,其目的是为s t a g e 2 以及随后的k e r n e l 的执行准备好一些基本的硬件环境。以执行的先后顺序,它通常包括以下步骤: 1 屏蔽所有的中断。为中断提供服务通常是操作系统中设备驱动程序的责任, 因此在b o o t l o a d e r 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写 c p u 的中断屏蔽寄存器或状态寄存器( 比如a r m 的c p s r 寄存器) 来完成。 2 设置c p u 的速度和时钟频率。 3 r a m 初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内 存库控制寄存器等。 4 初始化l e d 。典型地,通过g p i o 来驱动l e d ,其目的是表明系统的状态 是o k 还是e r r o r 。如果板子上没有l e d ,那么也可以通过初始化u a r t 向串口打 印b o o t l o a d e r 的l o g o 字符信息来完成这一点。 5 关闭c p u 内部指令和数据c a c h e 。 ( 二)为加载s t a g e 2 准备r a m 空间 为了获得更快的执行速度,通常把s t a g e 2 加载到r a m 空间中执行,因此必须 为加载b o o t l o a d c r 的s t a g e 2 准备好一段可用的r a m 空间范围。 由于s t a g e 2 通常是c 语言执行代码,因此在考虑空间大小时,除了s t a g e 2 可 执行映像的大小外,还必须把堆栈空间也考虑进来。此外,空间大小最好是m e m o r y p a g e 的大小( 通常是4 k b ) 的倍数。一般而言,1 m 的r a m 空间已经足够了。具体 的地址范围可以任意安排,比如b l o b 就将它的s t a g e 2 可执行映像安排到从系统 r a m 起始地址0 x c 0 2 00 0 0 0 开始的1 m 空间内执行。但是,将s t a g e 2 安排到整个 r a m 空间的最顶i m b ( 也即( r a m e n d 一1 m b ) 一r a m e n d ) 是一种值得推荐的方法。 为了后面的叙述方便,这里把所安排的r a m 空间范围的大小记为: s t a g e 2 一s i z e ( 字节) ,把起始地址和终止地址分别记为:s t a g e 2s t a r t 和s t a g e 2 一e n d ( 这 两个地址均以4 字节边界对齐) 。因此: 第二章启动程序b o o t l o a d e r 的分析与移植 7 s t a g e 2e a n d = s t a g e 2 一s t a r t + s m g e 2 一s i z e 另外,还必须确保所安排的地址范围的确是可读写的r a m 空间,因此,必须 对所安排的地址范围进行测试。具体的测试方法可以采用类似于b l o b 的方法。也 即:以m e m o r yp a g e 为被测试单位,测试每个m e m o r yp a g e 开始的两个字节是否 是可读写的。为了后面叙述的方便,我们记这个检测算法为:t e s tm e m p a g e ,其具 体步骤如下; 1 先备份m e m o r yp a g e 起始地址处的开始两个字节的内容。 2 向这两个字节中写入任意的数字。比如:向第一个字节写入0 x 5 5 ,第2 个 字节写入0 x a a 。 3 然后,立即将这两个字节的内容读回。显然,我们读到的内容应该分别是 0 x 5 5 和o x a a 。如果不是,则说明这个m e m o r yp a g e 所占据的地址范围不是一段有 效的洲空间。 4 再向这两个字节中写入任意的数字。比如:向第一个字节写入o x a a 。第2 个字节中写入o x 5 5 。 5 然后将这两个字节的内容立即读回。显然,我们读到的内容应该分别是o x a a 和0 x 5 5 。如果不是,则说明这个m e m o r yp a g e 所占据的地址范围不是一段有效的 r a m 空间。 6 恢复这两个字的原始内容,测试完毕。 为了得到段干净的r a m 空间范围,我们也可以将所安排的r a m 空间范围 进行清零操作。 ( 三)拷贝s t a g e 2 到r a m 中 拷贝时要确定两点: 1 s t a g e 2 的可执行映像在固态存储设备的存放起始地址和终止地址; 2 r a m 空间的起始地址。 ( 四)设置堆栈指针s p 堆栈指针的设置是为了执行c 语言代码作好准备。通常我们可以把s p 的值设 置为( s t a g e 2 _ e n d - 4 ) ,也即之前所安排的那个1 m b 的r a m 空间的最顶端( 堆栈向 下生长) 。 此外,在设置堆栈指针s p 之前,也可以关闭l e d 灯,以提示用户我们准备 跳转到s t a g e 2 。 经过上述这些执行步骤后,系统的物理内存布局应该如图2 1 所示。 8嵌入式控制器系统平台研究与实现 i l l p l 力f h ,2 n l t k f l 州l t l t 6 酋咖蟪嘲太小:岫 a m 地址空间 : f : m 蛐 n n n d k k t 彻吐畸 l a s h 地址空间 内柱映象 如i 曲 l l h , o t k , s d k , r 帕i 姆2 可执行映重 硝蕾蝉喝曩蜘:彻 m o 矗- d h 国,t 学t 可执舶瞳 姘:i 皿 图2 1b o o t l o a d e r 的s t a g e 2 可执行映象刚被拷贝到r a m 空间时的系统内存布局 ( 五) 跳转到s t a g e 2 的c 入口点 在上述一切都就绪后,就可以跳转到b o o t l o a d e r 的s t a g e 2 去执行了。比如, 在a r m 系统中,这可以通过修改p c 寄存器值为合适的地址来实现。 2 2 2 b o o t l o a d e r 的s t a g e 2 正如前面所说,s t a g e 2 的代码通常用c 语言来实现,以便于实现更复杂的功 能和取得更好的代码可读性和可移植性。但是与普通c 语言应用程序不同的是, 在编译和链接b o o t l o a d e r 这样的程序时,我们不能使用g l i b c 库中的任何支持函数。 原因显而易见。一般是直接把m a i n 0 函数的起始地址作为整个s t a g e 2 执行映像的 入口点。但是这样做有两个缺点:1 ) 无法通过m a i n ( ) 函数传递函数参数;2 ) 无法 处理m a i n 0 函数返回的情况。一种更为巧妙的方法是利用t r a m p o l i n e ( 弹簧床) 的概 念。也即,用汇编语言写一段t r a m p o l i n e 小程序,并将这段t r a m p o l i n e 小程序来作 为s t a g e 2 可执行映像的执行入口点。然后我们可以在t r a m p o l i n e 汇编小程序中用 c p u 跳转指令跳入m a i n ( ) 函数中去执行,而当m a i n ( ) 函数返回时,c p u 执行路径 显然再次回到我们的t r a m p o l i n e 程序。简而言之,这种方法的思想就是:用这段 t r a m p o l i n e 小程序来作为m a i n ( ) 函数的外部包裹。 下面给出一个简单的t r a m p o l i n e 程序示例( 来自b l o b ) : t e x t g l o b lv a m p o l i n e 第二章启动程序b o o t l o a d e r 的分析与移植 9 _ t r a m p o l i n e : b lm a i n | 卑i f m a i n 0e v e rr e t u r n s ,w e j u s t c a l li ta g a i n 鼻 b _ t r a m p o l i n e 可以看出,当m a i n ( ) 函数返回后,我们又用一条跳转指令重新执行t r a m p o l i n e 程序当然也就重新执行m a i n 0 函数,这也就是t r a m p o l i n e ( 弹簧床) 一词的意 思所在。 ( 一)初始化本阶段要使用到的硬件设备 这通常包括: 1 初始化至少一个串口,以便和终端用户进行i o 输出信息。 2 初始化计时器等。 在初始化这些设备之前,也可以重新把l e d 灯点亮,以表明我们已经进入 m a i n ( ) 函数执行。 设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。 ( 二)检测系统的内存映射( m e m o r ym a p ) 所谓内存映射就是指在整个4 g b 物理地址空间中有哪些地址范围被分配用来 寻址系统的r a m 单元。比如,在s a - 1 1 0 0c p u 中,从o x c 0 0 00 0 0 0 开始的5 1 2 m 地址空间被用作系统的r a m 地址空间,而在s a m s u n g s 3 c 4 4 b o xc p u 中,从 o x o c 0 00 0 0 0 到o x l 0 0 00 0 0 0 之间的6 4 m 地址空间被用作系统的r a m 地址空间。 虽然c p u 通常预留出一大段足够的地址空间给系统r a m ,但是在搭建具体的嵌 入式系统时却不一定会实现c p u 预留的全部r a m 地址空间。也就是说,具体的 嵌入式系统往往只把c p u 预留的全部r a m 地址空间中的一部分映射到r a m 单 元上,而让剩下的那部分预留r a m 地址空间处于未使用状态。由于上述这个事实, 因此b o o t l o a d e r 的s t a g e 2 必须在它想干点什么( 比如,将存储在f l a s h 上的内核映 像读到r a m 空间中) 之前检测整个系统的内存映射情况,也即它必须知道c p u 预 留的全部r a m 地址空间中的哪些被真正映射到r a m 地址单元,哪些是处于 “u n u s e d ”状态的。 1 内存映射的描述 可以用如下数据结构来描述r a m 地址空间中的一段连续的地址范围: t y p e d e f s t r u c tm e m o r y _ a r e as t r u c t u 3 2s t a r t :+ t h eb a s ea d d r e s so f t h em e m o r yr e g i o n + 7 u 3 2s i z e pt h eb y t en u m b e ro f t h em e m o r yr e g i 0 1 1 | i n tu s e d : ) m e m o r y _ a r e at ; 这段r a m 地址空间中的连续地址范围可以处于两种状态之一: 1 0 嵌入式控制器系统平台研究与实现 ( 1 ) u s e d = l ,说明这段连续的地址范围已被实现,也即真正地被映射到r a m 单元上。 ( 2 ) u s e d :o ,说明这段连续的地址范围并未被系统所实现,而是处于未使用状 态。 基于上述m e m o r y _ a r e a _ t 数据结构,整个c p u 预留的r a m 地址空间可以用 一个m e m o r y _ a r e a _ t 类型的数组来表示,如下所示: m e m o r y _ a r e a _ tm e m o r y _ m a p n u mm e m _ a r e a s = 【0 ( n u m _ m e m _ a r e a $ - 1 ) 】2 ( s t a r t ;0 , s i z e = 0 , u s e d = 0 , ; 2 内存映射的检测 下面我们给出一个可用来检测整个r a m 地址空间内存映射情况的简单而有 效的算法: 详见附录1 。 在用上述算法检测完系统的内存映射情况后,b o o t l o a d e r 也可以将内存映射 的详细信息打印到串口。 ( 三)加载内核映像和根文件系统映像 1 规划内存占用的布局 这里包括两个方面: 夺内核映像所占用的内存范围; 根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地 址和映像的大小两个方面。 对于内核映像,一般将其拷贝到从( m e ms t a r t + 0 x 8 0 0 0 ) 个基地址开始的 大约i m b 大小的内存范围内( 嵌入式l i n u x 的内核一般都不超过1 m b ) 。为什么要 把从m e m _ s t a r t 到m e m _ s t a r t + 0 x 8 0 0 0 这段3 2 k b 大小的内存空出来呢? 这 是因为l i n u x 内核要在这段内存中放置一些全局数据结构,如启动参数和内核页表 等信息。 而对于根文件系统映像,则一般将其拷贝到m e ms t a r t + 0 x 0 0 1 00 0 0 0 开始 的地方。如果用r a m d i s k 作为根文件系统映像,则其解压后的大小一般是1 m b 。 2 从f l a s h 上拷贝 由于像a r m 这样的嵌入式c p u 通常都是在统一的内存地址空间中寻址f l a s h 等固态存储设备的,因此从f l a s h 上读取数据与从r a m 单元中读取数据并没有什 第二章启动程序b o o t l o a d e r 的分析与移植 1 l 么不同。用一个简单的循环就可以完成从f l a s h 设备上拷贝映像的工作: w h i l e ( c o u n t ) + d e s t 什= o s 卅:pt h e ya l ea l la l i g n e dw i t hw o r db o u n d a r y , c o u n t 一一4 :严b y t en u m b e r + , ) ; ( 四) 设置内核的启动参数 应该说,在将内核映像和根文件系统映像拷贝到r a m 空间中后,就可以准备 启动l i n u x 内核了。但在调用内核之前,应该作一步准备工作,即:设置l i n u x 内 核的启动参数。 l i n u x 2 4 x 以后的内核都期望以标记列表( t a g g e dl i s t ) 的形式来传递启动参 数。启动参数标记列表以标记a t a g c o r e 开始,以标记a t a g n o n e 结束。每 个标记由标识被传递参数的t a g _ h e a d e r 结构以及随后的参数值数据结构来组成。数 据结构t a g 和t a g _ h e a d e r 定义在l i n u x 内核源码的i n e l u d e a s m s e t u p h 头文件中: 详见附录2 。 在嵌入式l i n u x 系统中,通常需要由b o o t l o a d e r 设置的常用启动参数有: a t a q c o r e 、a t a g _ m e m 、a t a q c m d l i n e 、a t a q r a m d i s k 、a t a g i n i t r d 等。 比如,设置a t a q c o r e 的代码如下: p a r a m s = ( s t r u c tt a g4 惜o o t _ p a r a m s ; p a r a m s - h d r t a g = a t a q c o r e ; p a r a m s - h d r s i z e = t a g _ s i z e ( t a g _ e o r e ) ; p a r a m s - u c o r e f l a g s 2 o : p a r a m s - u c o r e p a g e s i z e 2 o : p a r a m s - u c o r e r o o t d e v 2 o : p a r a m s = t a g _ n e x t ( p a r a m s ) ; 其中,b o o tp a r a m s 表示内核启动参数在内存中的起始基地址,指针p a r a m s 是一个s t n l c t t a g 类型的指针。宏t a gn e x t 0 将以指向当前标记的指针为参数,计算 紧邻当前标记的下一个标记的起始地址。注意,内核的根文件系统所在的设备i d 就是在这里设置的。 下面是设置内存映射情况的示例代码: 详见附录3 。 可以看出,在m e m o r y _ m a p 数组中,每一个有效的内存段都对应一个 a t a gm e m 参数标记。 l i n u x 内核在启动时可以以命令行参数的形式来接收信息,利用这一点我们可 以向内核提供那些内核不能自己检测的硬件参数信息,或者重载内核自己检测到 嵌入式控制器系统平台研究与实现 的信息。比如,我们用这样一个命令行参数字符串“c o n s o l e = t t y s 0 ,1 1 5 2 0 0 n 8 ”来 通知内核以t i y s o 作为控制台,且串口采用“1 1 5 2 0 0 b p s 、无奇偶校验、8 位数据位” 这样的设置。下面是一段设置调用内核命令行参数字符串的示例代码: 详见附录4 。 请注意在上述代码中,设置t a g _ h e a d e r 的大小时,必须包括字符串的终止符 o ,此外还要将字节数转换成字,因为t a g _ h e a d e r 结构中的s i z e 成员单位是字。 下面是设置a t a g _ i n i t r d 的示例代码,它告诉内核在r a m 中的什么地方可 以找到i n i t r d 映象( 压缩格式) 以及它的大小: p a r a m s - h d r t a g = a t a gi n i t r d 2 ; p a r a m s - h d r s i z e = t a g _ s i z e ( t a g _ i n i t r d ) : p a r a m s - u i n i t r d s t a r t2r a m d i s k _ r a m _ b a s e ; p a r a m s - u i n i t r d s i z e 2 i n i t r d _ l e n : p a r a m s = t a g _ n e x t ( p a r a m s ) : 下面是设置a t a g _ r a m d i s k 的示例代码,它告诉内核解压后的r a m d i s k 有 多大( 单位是k b ) : p a r a m s - h d r t a g 2 a t a g _ r a m d i s k : p a r a m s h d r s i z e = t a g _ s i z e ( t a g _ r 锄d i s k
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车队运输时效保障合同范本模板
- 餐饮加盟商信息保密合同范本
- 餐饮业店铺租赁合同及食品安全责任书
- 芯片销售保密协议书范本
- 中草药购销协议书范本
- 餐饮店股东合作协议及知识产权保护
- 甜品店品牌授权及区域代理合同
- 生态环保项目拆旧房屋搬迁与补偿协议范本
- 古董拍卖委托授权合同模板
- 餐饮业股权并购及品牌授权与经营合同
- 2025年数学中考专题复习课件:7.30 尺规作图
- 人教部编版五年级下册语文期末复习现代文阅读(含课内、课外)专项训练(三)(含答案)
- 育苗基地可行性研究报告
- 植物拓染教学课件
- 访谈保密协议书范本
- 医务人员职业暴露预防及处理课件
- 2025-2030年中国地效飞行器行业市场运行态势及发展前景研判报告
- 房地产市场报告 -2025年第一季度天津写字楼和零售物业市场概况报告
- 2025年全国中小学生安全知识网络竞赛试题及答案(共150题)
- 【中兴通讯】2025年AI RAN白皮书
- 输血管理委员会2024年工作总结
评论
0/150
提交评论