BootLoader启动过程.ppt_第1页
BootLoader启动过程.ppt_第2页
BootLoader启动过程.ppt_第3页
BootLoader启动过程.ppt_第4页
BootLoader启动过程.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

7.1 Boot Loader 概述,简单地说,Boot Loader就是在操作系统内核或用户应用程序之前运行的一段小程序。通过这段小程序可以初始化硬件设备,建立内存空间的映射图,将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确环境。 通常,Boot Loader是依赖于硬件而实现的,因此,为嵌入式系统建立一个通用的Boot Loader是很困难的。但是可以归纳出一些通用的概念,以便于了解特定Boot Loader的设计与实现。 Boot Loader的主要任务如图7.1所示。,图7.1 Boot Loader的主要任务,每种不同的处理器体系结构都有不同的Boot Loader。有些Boot Loader也支持多种体系结构的处理器。除了依赖处理器的体系结构外,Boot Loader实际上也依赖于具体的嵌入式板级设备的配置。即使是基于同一种处理器构建的两块不同的嵌入式板级设备,它们的Boot Loader也是不同的。Boot Loader源程序是很关键的代码,因为它是一些把特定的数字写入指定硬件寄存器的指令序列。 系统加电复位后,所有的处理器通常都从某个处理器制造商预先安排的地址上取指令。如基于S3C44B0x的处理器在复位时通常都从地址0x00000000取它的第一条指令。而基于处理器构建的嵌入式系统通常都有某种类型的固态存储设备(如ROM、EEPPOM或FLASH等)被映射到这个预先安排的地址上。因此在系统加电后,处理器将首先执行Boot Loader程序。 装有Boot Loader内核的启动参数,内核映像和根文件系统映像的固态存储设备的典型空间分配结构如图7.2所示。,图7.2 存储设备典型空间分配结构,7.2.1 Boot loader的操作模式 大多数Boot loader都包含启动加载模式及下载模式两种不同的操作模式,但这种区别仅对于开发人员才有意义。从最终用户的角度开,Boot Loader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。 1.启动加载模式(Boot Loading) 启动加载模式也称为自主(Autonomous)模式,即Boot Loader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是Boot Loader的正常工作模式。 2.下载(Down Loading)模式 当采用下载模式时,目标机上的Boot Loader将通过串口连接或网络连接等通信手段从主机下载文件,如应用程序、数据文件、内核映像等。从主机下载的文件通常首先被Boot Loader保存到目标机的RAM中,然后再被Boot Loader写到目标机上的固态存储设备中。下载模式要求在Boot Loader中完成对串口或以太网口的初始化,定义相关的命令,向其终端提供相应简单的命令接口。Boot Loader的这种模式通常在系统更新时使用。,7.2.2 Boot Loader的总体设计 1阶段设计 Boot Loader的启动可以是分阶段的,因此在设计时也可将Boot Loader分为阶段1和阶段2。将Boot Loader分为2个阶段的原因如下。 (1) 基于编程语言的考虑 阶段1主要用汇编语言编写,这是因为它主要行进与CPU核心及存储设备密切相关的处理工作,进行一些必要的初始化工作,是依赖于CPU体系结构的代码,为了增加效率以及因为涉及协处理器的设置,只能用汇编语言编写,这部分直接在FLASH中执行;阶段2可以用一般的C语言编写,用于实现一般的流程以及对板级的一些驱动支持,这部分会被复制到RAM中执行。 (2) 代码具有更好的可读性与移植性 若对于相同的CPU以及存储设备,要增加外设支持,阶段1的代码可以维护不变,只对阶段2 的代码进行修改;若要支持不同的CPU,则基础代码只需在阶段1中修改。,2.地址规划设计 当Boot Loader阶段设计好之后,需要考虑的是镜像存储的地址分配:如总镜像保存在什么地方,阶段2对应的镜像会被复制到什么地方,内核镜像原先存放在什么地方,Boot Loader会把它又重新加载到什么地方;如何进行准确的地址规划以保证没有相互冲突等。 3. 模式设计 对于普通用户来说只需要Boot Loader的启动加载模式,但是对于开发者来说,则需要下载模式,因为他们需要时时刻刻地进行一些镜像的更新。为了在两者之间做到兼顾,这里介绍一个既支持启动加载模式又支持下载模式的具体思路:在Boot Loader做完一些硬件初始化的工作之后,而在加载内核镜像之前,先在一定的时间内等待有没有用户有键盘输入。如果没有,则为启动加载模式,直接加载内核镜像进行启动;如果有,则进入命令行格式,这时开发者就可以根据自己的需要以及Boot Loader的支持情况,做一些其他的工作。模式的转换设计主要在阶段2中实现。,7.3 Boot Loader的主要功能及典型结构,7.3.1 Boot Loader的阶段1 1. 基本的硬件初始化 基本的硬件初始化是Boot Loader一开始就执行的操作,其目的是为了阶段2的内核的执行准备好一些基本的硬件环境。它执行的步骤如下:(1)屏蔽所有的中断。(2)设置处理器的速度和时钟频率。(3)RAM初始化。(4)初始化LED。(5)关闭处理器内部指令/数据缓存。 2. 加载阶段2的RAM空间 3.复制阶段2到RAM 4.设置堆栈指针(sp) 5.跳转到阶段2的C程序入口点 Boot Loader在Flash和RAM中的系统布局如图7.3所示。,图7.3 Boot Loader在Flash和RAM中的系统布局,7.3.2 Boot Loader的阶段2 阶段2的代码通常用C语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。 1. 初始化阶段2要使用的硬件设备:通常包括初始化一个串行口,初始化计时器等。 2. 检测系统内存映射:所谓内存映射就是指在整个物理地址空间中有哪些地址范围被分配用来寻址系统的RAM单元。在S3C44B0x处理器中,从0x0C000000到0x10000000之间的64MB地址空间被用作系统的RAM地址空间。 3.加载内核映像和根文件系统映像:(1)规划内存占用的布局;(2)从Flash上复制。 4.调用内核:完成了所有硬件的设置后,就可以跳转到内核,开始运行内核了。,从Flash设备上拷贝映像的工作,程序代码如下: /*拷贝Flash地址0x10000内核到RAM 0xC300000中*/ ldr r0, =0x10000 ldr r1, =0xC300000 add r2, r0,#(1536*1024) copy_kernel: ldmia r0!,r3-r10 stmia r1!, r3-r10 cmp r0,r2 调用内核的程序代码如下: /*跳转到RAM中执行内核*/ ldr r0, =0xC30000 ;0xC30000正是前面拷贝kernel函数中的目的地址 mov pc, r0 ; 修改程序地址寄存器,完成跳转,74 S3C44B0x下uCLinux的Boot Loader分析,本节介绍S3C44BOX下的CLinux的Boot Loader 分析,由于它只是一个比较简单的Boot Loader,所以它的阶段1和阶段2是在一起由汇编完成的,程序流程如图7.4所示。,图7.4 简单的Boot Loader工作流程图,以下是该Boot Loader 的完整程序。 /* * File: boot.s */ WTCON EQU 0x01D30000 ;以下的几个定义都是为了设置相应的控制寄存器,请注意查阅各位所对应的作用,理解所作的设置 PCONE EQU 0x01D20028 LOCKTIME EQU 0x01D8000C PLLCON EQU 0x01D80000 CLKCON EQU 0x01D80004,GLOBAL_start _start: breset;程序的第一条指令,在烧写时将会被烧写在0x00000000地址 add pc,pc,#0x0C000000 add pc,pc,#0x0C000000 add pc,pc,#0x0C000000 add pc,pc,#0x0C000000 add pc,pc,#0x0C000000 add pc,pc,#0x0C000000 add pc,pc,#0x0C000000,MEMORY_CONFIG: ;定义一组数据用来后面的设置存储器,可看作一个数组 DCD 0x11110102 DCD 0x600 DCD 0x7FFC DCD 0x7FFC DCD 0x18000 DCD 0x18000 DCD 0x860459 DCD 0x10 DCD 0x20 DCD 0x20,;复位地址 reset: ;关看门狗 ldr r0,=WTCON ldr r1,=0x0 str r1,r0 ;设置端口控制寄存器Port E,打开RXD0盒TxDO(串口输入功能) ldr r1,=PCONE ldr r0,=0x25529 str r0,r1 ;设置时钟控制寄存器 ldr r1,=LOCKTIME ldrb r0,=0xFFF strb r0,r1,ldr r1,=PLLCON ldr r0,=0x78061 str r0,r1 ldr r1,=CLKCON ldr r0,=0x7FF8 str r0,r1 ;设置寄存器 memsetup: ldr r0,=MEMORY_CONFIG;通过前面已定义好的数组用4条指令就可以完成设置 ldmia r0,r1-r13 ldr r0, =0x01C80000 stmia r0,r1-r13,;拷贝Flash地址0x1000内核到RAM 0xC300000中 ldr r0,=0x10000 ldr r1,=0xC300000 add r2,r0,#(1536*1024) copy_kernel: ldmia r0!,r3-r10 stmia r1!,r3-r10 cmp r0,r2 ble copy_kernel ;跳转到RAM中执行内核 ldr r0,=0xC300000;0xC300000正式前面拷贝内核函数中的目的地址 mov pc,r0;修改程序地址寄存器,完成跳转,75 其他的初始化方,在实际的应用中,有些设备只需要简单的应用函数便可以满足需要,不需要加载操作系统,有些设备的操作系统比较简单,不需要单独的Boot Loader来引导。这时可以通过一个初始化程序来完成对硬件的初始化,最后跳到主程序中去。如果需要,可以在主程序的开始,调用操作系统的初始化程序。不过在这个初始化程序中所要完成的工作和Boot Loader的工作基本一致。下面介绍一个S3C44B0x的初始化程序,它是所建立的工程的一部分。在这个初始化程序完成后调用了main函数,从中可以清楚地看到它调用uC/OS-II的过程。当设置目标文件入口时,它所生成的*.O文件就被选中,当烧写时也同样被烧写到Flash的0x000000地址处。这样系统上电后也是首先执行这个初始化程序。程序流程如图7.5所示。下面介绍几个程序段。,图7.5 其它初始化方式程序流程图,1异常中断向量表 及中断处理跳转的宏 AREA Init,CODE,READONLY ENTRY b ResetHandler b HandlerUndef b HandlerSWI ;* b HandlerIRQ b HandlerFIQ ;* VECTOR_BRANCH ldr pc,=HandlerEINT0 ;mGA硬件中断向量表(H/W interrupt vector table) ldr pc,=HandlerEINT1 ; ldr pc,=HandlerEINT2 ; ,下面是具体的中断处理函数跳转的宏,通过上面的$HandlerLabel的宏定义展开后跳转到对应的中断处理函数(对于向量中断): HandlerFIQ HANDLER HandleFIQ HandlerIRQ HANDLER HandleIRQ HandlerUndef HANDLER HandleUndef HandlerSWI HANDLER HandleSWI HandlerDabort HANDLER HandleDabort HandlerPabort HANDLER HandlePabort HandlerADC HANDLER HandleADC HandlerRTC HANDLER HandleRTC HandlerUTXD1 HANDLER HandleUTXD1 HandlerUTXD0 HANDLER HandleUTXD0 HandlerSIO HANDLER HandleSIO ,2堆栈初始化程序 InitStack mrs r0,cpsr bic r0,r0,#MODEMASK orr r1,r0,#UNDEFMODE|NOINT msr cpsr_cxsf,r1 ;UndefMode ldr sp,=UndefStack orr r1,r0,#ABORTM

温馨提示

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

最新文档

评论

0/150

提交评论