《RMLinux嵌入式系统的BootLoader分析与开发.doc》由会员分享,可在线阅读,更多相关《RMLinux嵌入式系统的BootLoader分析与开发.doc(70页珍藏版)》请在三一办公上搜索。
1、 毕业论文ARM+Linux嵌入式系统的BootLoader分析与开发系 别电子信息系专业名称通信工程班级学号学生姓名指导教师2010年 06 月 10 日 毕业设计(论文) 第 I 页ARM+Linux嵌入式系统的BootLoader分析与开发摘 要在计算机、互联网和通信技术高速发展的同时,嵌入式系统开发技术也取得迅速发展,嵌入式技术应用范围的急剧扩大,但是在嵌入式系统设计中,针对嵌入式处理器和操作系统的BootLoader代码的设计是一个难点,在基于ARM9核的嵌入式处理器芯片的mini2440开发板上进行设计,总结出嵌入式处理器芯片的BootLoader设计的一般模式和其中的一些关键技术
2、,并给出了BootLoader的详细设计流程。关键词:嵌入式系统,ARM,BootLoader,Linux,S3C2440The Analysics and Expoite of BootLoader base on ARM and Linux Embedded System AbstractWhen computer,Internet and telecom technology developing quickly,embedded system is also developing fast,Application of embedded system is more and more,
3、But in embedded system design,it is difficult to design a BootLoader for embedded CPU and operation system,In this paper,a design and realization of BootLoader of embedded processor chip called mini2440 based on ARM9,It gives the main framework of BootLoader and explains the key technology.Furtherno
4、re ,it shows flow chart in detail.Key Words: Embedded system, ARM, BootLoader,Linux, S3C2440 毕业设计(论文) 第 64 页目录1 绪论11.1 研究背景和研究意义11.2 主要研究内容和技术问题11.3 研究方法、论文构成和创新之处22嵌入式LINUX+ARM开发环境介绍32.1 硬件环境构建32.1.1 嵌入式Linux操作系统介绍32.1.2 Linux作为嵌入式操作系统的优势32.1.2 ARM处理器介绍42.1.2.1 ARM处理器工作状态42.1.2.2 ARM处理器模式42.1.3 ARM
5、处理器寄存器介绍52.2 交叉编译工具的基本使用62.2.1 GCC的编译流程62.3 Makefile编写62.3.1 Makefile介绍62.3.2 Makefile的规则72.3.3 Makefile的变量82.3.4 Make命令的使用92.4 ARM常用汇编指令和数据结构92.5构建嵌入式交叉编译环境103.BOOTLOADER分析部分123.1 常用的BootLoader介绍123.1.1rrload介绍143.1.2U-Boot介绍153.1.3 Blob介绍163.1.4 Vivi介绍173.2 ARM9嵌入式系统193.2.1 GPIO接口193.2.1.2 GPIO接口介
6、绍193.2.1.2 GPIO硬件接口控制寄存器设置193.2.2 存储控制器203.2.2.1 存储控制器的寄存器的设置203.2.3 内存管理单元MMU233.2.3.1 S3C2440内存管理单元MMU介绍233.2.3.2 存储管理单元的功能233.2.4 NAND Flash控制器233.2.4.1 NAND Flash访问方法231.2.4.2S3C2440 NAND Flash控制器设置243.2.5 系统时钟和定时器253.2.5.1 S3C2440时钟体系253.2.5.2 PWM定时器263.2.6 通用异步收发器UART283.2.6.1 UART工作原理283.2.6.
7、2 S3C2440 UART的操作和寄存器设置293.3 Xmodem串口传输协议分析303.4 堆初始化和实现机制313.5 内核参数传递分析324.BOOTLOADER分析部分364.1 阶段1:/M-boot/head.S364.1.1 关闭Watch Dog364.1.2 禁止所有中断364.1.3 初始化系统时钟364.1.4 初始化内存控制寄存器374.1.5 点亮所有的LED,开启蜂鸣器显示程序进度384.1.6 初始化UART0394.1.7 复制代码到SDRAM404.1.8 跳到BootLoader的阶段2(main)函数中运行424.2 阶段2:424.2.1 打印开发板
8、及其相关信息434.2.1 初始化开发板434.2.3 建立页表和启动MMU454.2.4 初始化堆栈,heap_init()464.2.5 初始化私有数据474.2.6 启动内核或进入菜单选择界面474.3 程序调试与运行484.3.1 单元模块化调试494.3.2 集成和功能调试495.结论52致 谢53参考资料54附 录55附 录A55英语原文55中文译文60附 录B63附 录C641 绪论1.1 研究背景和研究意义随着微电子技术和计算机技术的发展,微处理器芯片的功能越来越强大,嵌入式技术也越来越受到人们的关注。嵌入式系统是以应用为中心,以计算机技术为基础,软硬件均可裁剪来适应系统对功能
9、、可靠性、成本、体积、功耗要求严格的专用计算机系统。随着各种微处理器功能越来越强大以及软件商操作系统的支持,使得整个嵌入式系统拥有了完整构架。近年来各种嵌入式操作系统也是层出不穷以适应各种不同功能处理器。然而如何加载操作系统成了嵌入式系统首要技术难点。启动加载程序-BootLoader,把嵌入式硬件和嵌入式操作系统衔接起来,对于嵌入式系统后续软件的开发十分重要,在整个开发中也占有相当大的比例。嵌入式系统中目前比较流行的BootLoader有以下几种类型:德国DENX小组开发的U-boot,是一种通用的引导程序,功能非常强大,支持X86、ARM和PowerPC等体系处理器;韩国mizi公司开发的
10、vivi,适用于ARM9处理器,主要用于三星S3C2410处理器即SMDK2410开发板的引导Linux;Red Hat公司开发的以eCosw为基础的RedBoot,几乎能够支持所有的体系结构,如X86、ARM、PowerPC 和MIPS等;来自LART计划的引导程序blob,仅支持ARM系列处理器,但其代码短小精悍;以上这些BootLoader几乎都是开放源代码的;而国内除了大公司如北京中科红旗等自己开发针对相应平台的BootLoader外,其他的国内嵌入式系统是在功能强大且成熟的BootLoader如U-boot或vivi等基础上,修改或移植到相应的开发板上作为引导程序。1.2 主要研究内
11、容和技术问题1、本文介绍了嵌入式系统的开发流程以及构建嵌入式开发环境,掌握Makefile的阅读、编写和使用,掌握ARM下汇编指令和C语言常用的数据结构和算法。2、立足于国外几款优秀的开放源代码的BootLoader程序,掌握BootLoader开发的一般流程和开发过程中的一些关键技术,如串口、网络下载传输协议,掌握tag list内核参数传递技术。1.3 研究方法、论文构成和创新之处1、研究方法:通过书店 、图书馆、网络等途径进行资料的收集和整理,特别是网站的相关嵌入式论坛,这里是查找资料和学习嵌入式的一条重要的途径,这里聚集了很多嵌入式爱好者,能够提供很多的资料和他们自身的学习经验,通过借
12、鉴他们的经验和失败的教训,可以让自己避免走很多弯路。2、创新点:本文是在通过对U-boot和vivi这两款优秀的BootLoader的源代码进行分析,透彻的理解BootLoader开发原理的基础上,结合嵌入式系统硬件特点,综合了U-boot和vivi各自的优点和功能,开发自己的BootLoader程序;本文避免空谈理论, 在大量的理论分析的基础上,最后在实际的开发板上实践操作。3、论文构成:本文主要由两部分构成,第一部分是理论分析部分,主要是构建嵌入式开发环境、ARM9的硬件基础操作以及BootLoader下的各个模块的分析;第二部分是具体代码实现部分,在第一部分的分析基础上,针对各个模块功能
13、的代码实现和在具体硬件开发班上的调试运行。2嵌入式Linux+ARM开发环境介绍2.1 硬件环境构建2.1.1 嵌入式Linux操作系统介绍 Linux是一个成熟而稳定的网络操作系统。将Linux植入嵌入式设备具有众多的优点。首先,Linux的源代码是开放的,任何人都可以获取并修改,用之开发自己的产品。其次,Lirmx是可以定制的,其系统内核最小只有约134kB。一个带有中文系统和图形用户界面的核心程序也可以做到不足1MB,并且同样稳定。另外,它和多数Unix系统兼容,应用程序的开发和移植相当容易。同时,由于具有良好的可移植性,人们已成功使Linux运行于数百种硬件平台之上。 2.1.2 Li
14、nux作为嵌入式操作系统的优势Linux作为嵌入式操作系统的优势主要有以下几点: 1、 可应用于多种硬件平台。Linux已经被移植到多种硬件平台,这对于经费,时间受限制的研究与开发项目是很有吸引力的。原型可以在标准平台上开发后移植到具体的硬件上,加快了软件与硬件的开发过程。Linux采用一个统一的框架对硬件进行管理,从一个硬件平台到另一个硬件平台的改动与上层应用无关。Linux可以随意地配置,不需要任何的许可证或商家的合作关系,源代码可以免费得到。这使得采用Linux作为操作系统不会遇到任何关于版权的纠纷。毫无疑问,这会节省大量的开发费用。本身内置网络支持,而目前嵌入式系统对网络支持要求越来越
15、高。Linux的高度模块化使添加部件非常容易。 2、 Linux是一个和Unix相似、以内核为基础的、具有完全的内存访问控制,支持大量硬件(包括X86,Alpha、ARM和Motorola等现有的大部分芯片)等特性的一种通用操作系统。其程序源码全部公开,任何人可以修改并在GUN通用公共许可证(GNU General Public License)下发行。这样,开发人员可以对操作系统进行定制,适应其特殊需要。 3、 Linux带有Unix用户熟悉的完善的开发工具,几乎所有的Unix系统的应用软件都已移植到了Linux上。Linux还提供了强大的网络功能,有多种可选择窗口管理器(X Windows
16、)。其强大的语言编译器GCC,C+等也可以很容易得到,不但成熟完善,而且使用方便。 由于Linux是一个内核源代码开放、具备一整套工具链、有强大的网络支持及成本低廉的操作系统,因此嵌入式Linux自诞生起就秉承了这众多独特优势,这使它正在并越来越多地受到人们的关注。可以预见,嵌入式Linux将在未来的通信用嵌入式操作系统中占据强有力的地位。2.1.2 ARM处理器介绍ARM是Advanced RISC Machines的缩写,顾名思义,ARM处理器是一种典型的精简指令集处理器。ARM9处理器采用ARMV4T(哈佛)体系结构。这种体系结构是一种将程序指令存储器和数据存储器分开的存储器结构,是一种
17、并行体系结构。其主要特点是程序和数据存储在不同的存储空间中,即程序存储器和数据存储器。它们是两个相互独立的存储器,每个存储器独立编址、独立访问。2.1.2.1 ARM处理器工作状态ARM处理器的工作状态:ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令;第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。在程序的执行过程中,微处理器可以随时在两种工作状态之间切换,并且,处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。但ARM微处理器在开始执行代码时,应该处于ARM状态。 2.1.2.
18、2 ARM处理器模式ARM微处理器支持7种运行模式,分别为:用户模式(usr):ARM处理器正常的程序执行状态。快速中断模式(fiq):用于高速数据传输或通道处理。外部中断模式(irq):用于通用的中断处理。管理模式(svc):操作系统使用的保护模式。数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。系统模式(sys):运行具有特权的操作系统任务。定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。大多数的应用程序运行在用户模式下,当处理器
19、运行在用户模式下时,某些被保护的系统资源是不能被访问的。除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式;其中除去用户模式和系统模式以外的5种又称为异常模式,常用于处理中断或异常,以及需要访问受保护的系统资源等情况。2.1.3 ARM处理器寄存器介绍ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及6个32位状态寄存器。 关于寄存器这里就不详细介绍了,有兴趣的人可以上网找找,很多这方面的资料。异常处理当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个外部的中断请求。在处理异常之前,当前处理器的状态必须
20、保留,这样当异常处理完成之后,当前程序可以继续执行。处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。当一个异常出现以后,ARM微处理器会执行以下几步操作:进入异常处理的基本步骤:将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。将CPSR复制到相应的SPSR中。根据异常类型,强制设置CPSR的运行模式位。强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态。 2.2 交叉编译工具的基本使用2.2.1 GCC的编译流程
21、通常情况下,在嵌入式程序编译中,产生一个可执行文件程序需要经过以下4个阶段:预处理、编译、汇编和链接。其中预处理和编译阶段使用arm-linux-gcc工具来完成;汇编阶段使用arm-linux-as工具完成;链接阶段使用arm-linux-ld工具完成,具体的细节流程如下图所示。C处理器cpp主要完成三个方面的任务:头文件包含、宏替换和条件编译的处理,并将处理后的结果交给编译器进行处理。arm-linux-gcc主要功能是将源程序编译成汇编代码,此外它还具有非常丰富的命令选项,可以隐含地调用cpp、arm-linux-as或者arm-linux-ld完成程序预处理、编译、汇编和链接等各个阶段
22、的工作,可以通过这些命令选项的使用,是程序编译执行到不同的阶段停下来,从而产生相应的目标文件。arm-linux-as汇编器的主要目的就是将编译程序的输出结果汇总成目标代码格式,用于连接程序。arm-linux-ld将多个目标文件连接成一个可执行文件。2.3 Makefile编写2.3.1 Makefile介绍在Linux环境下,工程管理器make是一个功能强大的工程管理工具,用于自动编译、连接程序的使用工具,通过Make工具能够比较容易地构建一个工程,整个工程的编译只需要一个命令就可以完成编译、连接和最后的执行。它大大提高了实际项目的工作效率,几乎所有的Linux下的项目(包括Linux内核
23、本身)均涉及它。make程序的执行,需要一个配置文件-makefile,makefile文件主要描述程序文件之间的依赖关系,并提供跟新文件的命令,它规定了Make执行的动作和一切规则。一个makefile文件包含五个方面的内容:具体规则、隐含规则、定义变量、指令和注释。* 具体规则:用于阐述什么时间或怎样重新生成称为规则目标的一个或多个文件。它列举了目标所依赖的文件,这些文件称为该目标的依赖。具体规则可能同时提供了创建或更新该目标的命令;* 隐含规则:用于阐述什么时间或怎样重新生成同一文件名的一系列文件。它描述的目标是根据和它名字相同的文件进行创建或更新的一系列文件,同时提供了创建或更新该目标
24、的命令;* 定义变量:是为一个变量赋一个固定的字符串值,从而在以后的文件中能够使用该变量代替这个字符串;* 指令:是Make根据Makefile文件执行一定任务的命令。这些命令包括:读其他Makefile文件、判定(根据变量的值)是否使用或忽略Makefile文件的部分内容、定义多行变量(即定义变量值可以包含多行字符的变量);* 注释:以“#”开始的行是注释行。注释行在处理时被Make忽略,如果一个注释行在行尾是“”则表示下一行继续为注释行,这样注释可以持续多行。除在defiene指令内部外,注释可以出现在Makefile文件的任何地方,甚至在命令内部。默认情况下,当Make寻找Makefil
25、e文件时,它试图搜寻具有如下的名字的文件,“GNUmakefile”、“makefile”、“Makefile”,若用其他名字,可以在使用Make的“-f name”参数来指定Makefile的名字。2.3.2 Makefile的规则Makefile内容的核心是一系列的“规则”,这些“规则”告诉了Make程序要执行的动作,以及这些动作发生的依赖的条件。它的基本格式是:Target : dependencyCommandl Target(目标):通常是要产生的文件的名称,目标的例子可以是可执行文件或目标文件(.o)文件。目标也可以使一个执行的动作名称,如“clean”。l Dependency(
26、依赖):指用来输入从而产生目标的文件,一个目标经常有几个依赖。但并非是所有的指令命令更新目标的规则都需要依赖,如“clean”目标可以没有依赖。l Command(命令):是Make执行的动作,一个规则可以包含有多个命令,每个命令各占一行。注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符时Tab。隐含规则能够告诉Make使用默认的标准方法来执行文件操作,Make定义了一系列的隐含规则,如下表2-1所示:表2-1 Makefiel中常见的隐含规则预定义变数默认规则AR:库文件维护程序的名称默认值:arAS:汇编程序的名称默认值:asCC:C编译程序的名称默认值:cc(gcc)CPP:
27、C预处理器的名称默认值:$(cc) -ECXX:C+编译程序的名称默认值:g+RM:删除程序的名称默认值:rm -fARFLAGS:AR的选项默认值:无ASFLAGS:AS的选项默认值:无CFLAGS:CC的选项默认值:无CPPFLAGS:CPP的选项默认值:无2.3.3 Makefile的变量变量时在Makefile中定义的名字,其用来代替一个文本字符串,该文本字符串称为该变量的值。在具体要求下,这些值可以代替目标、依赖、命令以及Makefile文件中的其他部分。变量可以代替文件列表、传递给编译器的选项、要执行的程序、查找源文件的目录、输出写入的目录等,只要是文本都可以用变量来代替。变量名不
28、包含“:”、“#”、“=”,前导或结尾空格的任何字符串,并且是大小写敏感的。除了一些用户定义的变量外,Makefile另外还有一部分变量是使用一个标点符号或几个字符作为变量,这些变量是Makefile中预定义的自动变量,在规则每次执行时都基于目标和依赖产生新值,如表2-2所示。表2-2 Makefile中常见的自动变量变量名含义$目标文件的完整名称$%如果目标是归档成员,该变量代表目标的归档成员名称%第一个依赖的文件名$?所有比目标文件新的依赖文件的名称,以空格隔开$所有不重复的依赖文件的名称,以空格隔开$+所有的依赖文件(可重复),以空格隔开,并以出现的先后为序$*不包含扩展名的目标名称2.
29、3.4 Make命令的使用当在shell提示符下输入Makef命令后,make 将读取当前目录下的Makefile文件,并将Makefile文件中的第一个目标作为其执行的“终极目标”,开始处理第一个规则。Make还有一些常用的命令行选项,如表2-3所示:表2-3 Make的命令行选项选项含义-s执行时不显示命令-C dir搜索并读取指定目录dir下的Makefile-f file指定file 为Makefile2.4 ARM常用汇编指令和数据结构Linux系统上可用的C编译器是GNU C编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNU C对标准C进行一系列扩展,以增
30、强标准C的功能。1、零长度数组GNU C允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用,如:strict var_data int len; char data0;char data0仅仅意味着程序中通过var_data结构体实例的dataindex成员可以访问len之后的第index个地址,它并没有为data数组分配内存,因此sizeof(struct var_data)=sizeof(int)。2、typeof关键字tpyeof(x)语句可以获得x的类型。2.5 构建嵌入式交叉编译环境GNU集成编译环境GCC(GNU Compiler Collection)是开发嵌入式处理
31、器平台的必选工具,它功能强大,支持多种编程语言,支持多种处理器,包括ARM、MIPS、PowerPC等嵌入式处理器。此外,它还提供了多种优化选项,可以进行分布编译。对于嵌入式系统平台下的程序的编译和链接,由于一般嵌入式系统存储容量有限,不能在嵌入式设备平台上建立一套类似PC上的编译连接系统。通常的解决方法就是在PC机上建立一个用于目标机的交叉编译环境,这是一个由编译器、连接器和解释器组成的综合开发环境,包括binutils、gcc和glibc等几部分交叉编译工具。有时处于减小libc库大小的考虑,也可以用别的c库来代替glibc,例如uClibc、dietlibc和newlib。1、交叉编译环
32、境概述交叉开发就是指在一台通用计算机上进行程序的编辑、编译、然后下载到嵌入式设备中运行调试方式。开发计算机一般称为宿主机,嵌入式设备成为目标机;在宿主机上编译好的程序,下载到目标机上运行。交叉编译就是在宿主机上对即将运行在目标机上的应用程序进行编译,生成可在目标机上运行的可执行文件。交叉编译环境对硬件没有特殊的要求,但是为了建立宿主机和目标机之间的连接关系,需要的接口包括JTAG接口、串口,有些时候还需要以太网口或USB口。多数嵌入式目标机不能够提供足够的资源供编译过程使用,因而一般采用编译工作转移到高性能的宿主机中运行。通常的嵌入式系统的软件的开发采用一种交叉编译的方式。开发时使用宿主机上的
33、交叉编译、汇编及连接工具形成可执行的二进制代码,(这种可执行代码并不能在宿主机上执行,而只能在目标机上执行),然后把可执行文件下载到目标机上运行。嵌入式交叉编译环境就是在PC机上建立基于开发板的程序编译环境。它有两个非常显著的特点:第一,整套交叉编译环境建立在PC上,它和PC的编译环境共存;第二,利用交叉编译环境编译出来的可执行程序只能在嵌入式开发板上运行。利用已有的工具链建立交叉编译环境交叉编译工具链的安装可以自己安装,但这是一个相当复杂的过程,在这里,采用另外一种方式,在网上下载一些已经编译好的可用的交叉编译工具链。步骤如下:从网上下载交叉编译工具链压缩包。目前网络上主要流行下列两种类型的
34、压缩包:corss-2.95.3.tar.bz2和corss-3.3.2.tar.bz2。1、建立目录:#cd /usr/local#mkdir arm将cross-2.95.3.tar.bz2复制到/usr/local/arm目录下。2、解压缩包:# tar xjvf cross-2.95.3.tar.bz23、修改/etc/bashrc文件编辑/etc/bashrc文件,在最后增加路径 export PATH=/usr/local/arm/2.95.3/bin:$PATH,以后编译程序均可用arm-linux-来指定交叉编译器。3.BootLoader分析部分3.1 常用的BootLoad
35、er介绍从事于ARM处理器的Linux嵌入式系统开发,通常都是采用硬件板卡设计和软件系统设计同步进行的方式。那么在硬件板卡出来之后,首要的工作就是把BootLoader、Linux Kernel、File System移植到板卡上。针对不同的处理器,都对应有不同的BootLoader和不同版本的Kernel。也就是说无论是哪种ARM处理器,都需要进行BootLoader、内核、文件系统3个部分的移植工作。在针对不同处理器移植过程中有一些共性的地方,比如CPU状态的初始化、内存接口的初始化、内存地址的分配、系统设备的挂载等,也有一些不同的地方,比如处理器是否有MMU等。在移植过程中最好是根据具体
36、的情况,参考不同的软件版本进行移植。BootLoader是嵌入式系统软件开发的第一个环节,它将软、硬件紧密地衔接在一起。BootLoader(引导装载器)是用于初始化目标板硬件,给嵌入式操作系统提供板上硬件资源信息,并进一步装载、引导嵌入式系统的固件。在ARM嵌入式系统开发过程中,BootLoader的编写往往是设计的第一个难点。目前,BootLoader的开发通常都是基于一些开源的BootLoader(比如vivi、U-boot、Blob、ARMBoot等)而设计,它们在设计思路上有许多相同之处。下面介绍目前主流的几款ARM处理器所使用的不同的BootLoader。BootLoader(引导
37、加载程序)是系统加电后运行的第一段代码,一般它只在系统启动时运行非常短的时间,但对于嵌入式系统来说,这是一个非常重要的系统组成部分。在嵌入式系统中,通常并没有像BIOS那样固件程序,因此在一般典型的系统中,整个系统的加载启动任务就完全由BootLoader来完成。在一个基于ARM的嵌入式系统中,系统在上电或复位时通常从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader。通过这段小程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便最终调用操作系统内核准备好正确的环境。嵌入式Linux系统从软件的角度看通常可以分为4
38、个层次:(1)引导加载程序。包括固化在固件(firmware)中的启动代码(可选)和BootLoader两大部分。(2)内核。特定于嵌入式板子的定制内核以及控制内核引导系统的参数。(3)文件系统。包括根文件系统和建立于Flash内存设备之上的文件系统。通常用RAMDISK作为根文件系统。它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好的运行环境的载体。(4)用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核之间可能还包括一个嵌入式图形用户界面。下图是一个装有BootLoader、内核启动参数、内核映像和根文件系统映像的典型固态存储设备的空间分配结构示意图:大多数BootL
39、oader都包含两种不同的操作模式。(1)启动加载(BootLoading)模式在这种模式下,BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布时,BootLoader必须工作在这种模式下。(2)下载(Downloading)模式在这种模式下,目标机上的BootLoader将通过串口或者网络等通信手段从开发主机(Host)上下载内核映像和根文件系统影响等到RAM中。然后可以再被BootLoader写入目标机上的固态存储介质中,或者直接进行系统的引导。前一种功能通常用于第一次
40、烧写内核和根文件系统到固态存储介质时或者以后的系统更新时使用;后者多用于开发人员在前期开发的过程中。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。BootLoader是严重地依赖于硬件而实现的。每种不同体系结构的处理器都有不同的BootLoader。除了依赖于处理器的体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备的配置,也就是说,对不两块不同的嵌入式板而言,即使他们是基于同一种处理器而构建的,要想让运行于一块板子上的BootLoader程序也能运行在另一块板子上,通常也都需要对BootLoade进行移植工作。所以在嵌入式世界里建立一个
41、通用的BootLoader几乎是不可能是。所以掌握了BootLoader的工作内容和流程后,移植或者开发自己相应板子的BootLoader不是问题。BootLoader的启动流程:BootLoader启动大多数分为两个阶段。第一阶段主要包含依赖于CPU体系结构硬件初始化的代码,通常都用汇编语言来实现。这个阶段的任务有:* 基本的硬件设备初始化(屏蔽所有的中断、关闭处理器内部指令/数据cache等)* 为第二阶段准备RAM空间* 如果是从某个固态存储介质中,则复制BootLoader的第二阶段代码到RAM* 设置堆栈。* 跳转到第二阶段的C程序入口点。第二阶段通常是用C语言完成,以便实现更为复杂
42、的功能,也使程序有更好的可读性和可移植性。这个阶段的任务有:* 初始化本阶段要使用的硬件设备* 检测系统内存映射* 将内核影响和根文件系统映像从Flash读到RAM中。* 为内核设置启动参数。* 调用内核3.1.1 rrload介绍1、rrload介绍嵌入式BootLoader-rrload是由ridgerun公司开发、注册的,是cadenux BSP的一部分。它针对具体的引导,允许用户管理装载、存储和调用Linux内核和根文件系统。在正常运行时,从驻留在Flash中复位向量对应的地址开始引导。它是系统上电运行的第一个程序,rrload通常传送一些控制参数到Linux内核和文件系统。rrloa
43、d会搬移内核或者文件系统到SDRAM。这些会根据用户在rrload里面配置的默认boot命令“boot_auto”来自动运行。这是典型的命令存储方式,存储的命令中当然包括额外的一些用户想要传递给内核的命令。如果不是配置成默认的boot_auto命令,或者boot过程被打断,rrload会打印出用户界面,等待用户输入。rrload提供了一个菜单用户接口UI和命令行接口UI。用户可通过这些UI方便地下载新内核或文件系统到RAM或Flash中。rrload支持通过板载的I/O口,比如串口、并口、网口等下载,可以接受各种格式的文件。rrload的主要特性有以下几点。* 提供菜单UI和命令行UI。* U
44、I可以和主机标准仿真接口协同工作。* 可以下载各种格式的Image到SDRAM或Flash,诸如srec、rrbin格式等。* 支持各种I/O端口,比如串口、并口、网口等。* 内建Flash管理功能,包括存储、读写、存储等。* 根据用户存储的boot 命令自行执行。rrload可以更新自己,也可以更新Kernel和文件系统,更新方式可以通过串口或网口,本身支持TFTP协议。如果要更新自己,必须要看rrload启动的打印信息。如果打印信息时rrload,则需要下载rrloadForUpgrade.rr。而如果打印信息是rrload.ForUpgrade,则需要下载rrload.rr更新。rrlo
45、ad移植的几个关键文件* head_ti925.S,在head_ti925.S红初始化CP15,初始化cache,设置DPLL,初始化Flash控制寄存器,然后通过boot strap跳转到C代码。* sdram_ti925.S,在sdram_ti925.S中初始化SDRAM访问控制寄存器。* io_xxxx.c是初始化I/O端口,主要有misc_init()、uart_init()、Flash_init()、ether_init()。* Flash_intel.c这个文件里面主要是针对Flash芯片的操作函数。* ether_xxxx.c是以太网接口芯片接口函数。* ld.ti925.scr
46、ipt和ld.ti925.ForUpGrade.script事连接文件。综上所述,如果更换了Flash、SDRAM或者以太网卡等,就需要修改上述的几个相关文件。3.1.2 U-Boot介绍(1)U-boot介绍U-boot即Universal Boot Loader。它源自DENX软件工程中心的Wolfgang Denk基于8xxrom的源码创建的PPCBoot工程,之后不断添加对处理器的支持,后来Sysgo GmbH把PPCBoot移植到ARM平台上,创建了ARMBoot工程,然后以PPCBoot工程和ARMBoot工程为基础,创建了U-Boot工程。现在U-boot已经可以支持PowerPC、ARM、X86、MIPS等体系结构上的伤百种开发板,已经成为工程最多、灵活性最强并且开发最积极的开放源码的BootLoader。U-boot提供两