Bootloader技术分析
- 格式:ppt
- 大小:974.00 KB
- 文档页数:45


网上关于Linux的bootloader文章不少了,但是大都是vivi,blob等比较庞大的程序,
读起来不太方便,编译出的文件也比较大,而且更多的是面向开发用的引导代码,做成产品时
还要裁减,这一定程度影响了开发速度,对初学者学习开销也比较大,在此分析一种简单的
bootloader,是在三星公司提供的S3C2410 bootloader上稍微修改后的结果,编译出来的文
件大小不超过4k,希望对大家有所帮助.
1.几个重要的概念
COMPRESSED KERNEL and DECOMPRESSED KERNEL
压缩后的KERNEL,按照文档资料,现在不提倡使用DECOMPRESSED KERNEL,而要使用
COMPRESSED KERNEL,它包括了解压器.因此要在ram分配时给压缩和解压的KERNEL提供足够
空间,这样它们不会相互覆盖.
当执行指令跳转到COMPRESSED KERNEL后,解压器就开始工作,如果解压器探测到解压的代码
会覆盖掉COMPRESSED KERNEL,那它会直接跳到COMPRESSED KERNEL后存放数据,并且重新定
位KERNEL,所以如果没有足够空间,就会出错.
Jffs2 File System
可以使armlinux应用中产生的数据保存在FLASH上,我的板子还没用到这个.
RAMDISK
使用RAMDISK可以使ROOT FILE SYSTEM在没有其他设备的情况下启动.一般有两种加载方式,
我就介绍最常用的吧,把COMPRESSED RAMDISK IMAGE放到指定地址,然后由BOOTLOADER把这
个地址通过启动参数的方式ATAG_INITRD2传递给KERNEL.具体看代码分析.
启动参数(摘自IBM developer)
在调用内核之前,应该作一步准备工作,即:设置 Linux 内核的启动参数。Linux 2.4.x 以
后的内核都期望以标记列表(tagged list)的形式来传递启动参数。启动参数标记列表以标
……………………………一……………… ……一~ 实用第一 智慧密集
………………………………………………………….,
基 s3C44B lX. B傩 抵 实说
在嵌入式系统中BootLoader的作用类似于Windows的
BIOS,用来引导操作系统。所做的工作基本上就是进行一些简
单的初始化工作,然后将控制权转交给要运行的操作系统或应
用程序。现在有很多典型的BootLoader如U boot,bl0b,Angel・
boot等。BootLoader对CPU的体系结构依赖性很大,也依赖于
具体嵌入式板级设备的配置,例如板卡硬件地址分配,RAM
芯片的类型,外设类型等。但是BootLoader的基本组成以及执
行流程式是类似的。本文通过S3C44BOX试验板——jx44b0,
结合经过实际验证的代码详细地分析了¥3C44B0 BootLoader
的运行过程。
一、S3C44BOX简介
SANGSUNG S3C44BOX嵌入式微处理器是专门为手持设备
提供的高性价比和高性能的嵌入式微处理器解决方案。它使用
ARM7TDMI内核,工作在66MHZ,为了减少系统总成本和减
少外围器,它集成了如下部件:8KB CACHE、外部存储器控
制器、LCD控制器、4个DMA通道、2通道UART、1个多主
I2C总路线控制器、一个IIS总路线控制器、5通道PWM定时
控制器及一个内部定时控制器、71个通用10口、8个外部中
断源,实时时钟、8通道10ADC等。本文涉及的S3C44BOX开
发板的硬件结构如图1所示。
图1¥3C4480X硬件结构图
二、存储空间分布
BootLoader采用默认的存储空间分布地址来加载uChnux内
核、文件系统,并按照正确引导uClinux的运行。在ARMSYS
的BootLoader中,默认的存储空间分布如下表:
/ ̄",, 2006.11与 _ 李臣龙
内容 起始地址 存储介质
详解bootloader的执行流程与ARM Linux启动过程分析
ARM Linux启动过程分析是本文要介绍的内容,嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。
本文以S3C2410 ARM处理器为例,详细分析了系统上电后 bootloader的执行流程及 ARM
Linux的启动过程。
1、引 言
Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在
GNU的支持下,Linux 获得了巨大的发展。虽然 Linux 在桌面 PC 机上的普及程度远不及微软的 Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些年来 Linux 在嵌入式领域的迅猛发展,更是给 Linux 注入了新的活力。
一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(bootloader),
Linux 内核,文件系统,应用程序。
其中 bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用 Linux 内核。
Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root
Filesystem)。
根文件系统是 Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。
应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。
从以上分析我们可以看出 bootloader 和 Linux 内核在嵌入式系统中的关系和作用。
Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本
基于ARMCore的Bootloader分析与设计金中朝于锋(中北大学教育部仪器科学与动态测试重点实验室,山西太原030051)引言嵌入式系统是在满足实际应用的基础上的最小简化型系统,与PC相比,嵌入式系统所完成的功能大多是单一和固定的,数据的传输和处理有很强的实时性。在工业控制和电子消费品中有很大的发展空间,但是由于嵌入式设备的复杂度和集成度要求逐渐提高,使用简单流程控制的嵌入式系统已经无法满足这一要求,引入了嵌入式操作系统这一概念。嵌入式操作系统的引导必需由Bootloader来完成。1Bootloader的分析BootLoader是系统运行的起始点,它包含着系统运行的第一行代码。在特定的硬件平台上运行Linux系统最困难的工作之一就是让Boot-Loader正常启动这个硬件平台,并且为这个平台定制相应内核的配置和载入功能。BootLoader是一段单独的程序代码,它存放于目标平台的非易失存储介质中,如ROM或Flash中。在嵌入式开发中,因为嵌入式板极配置的不同,所以要充分考虑以后移植的需要。在实现Bootloader的时候应尽量使用C语言来配合汇编实现。这时Boot-loader的启动过程可分为单阶段(Single-Stage)与多阶段(Multi-Stage)。一般来说,多阶段的Boot-loader可以提供更为复杂的功能,以及更好的可移植性。而单阶段的Bootloader不具备这种特点。本系统中采用了多阶段的方法来设计实现Boot-loader。由于Bootloader的实现严重依赖于CPU的体系结构和板级配置,因此大多数Bootloader都分为stage1和stage2两大阶段。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,使用汇编语言来实现,以达到短小精悍的目的。而stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且可以使代码有良好的可移植性。2Bootloader的启动流程系统加电或复位后,CPU通常都从地址0x00000000处取指令,执行流程图(如图1所示):2.1基本的硬件初始化。a.屏蔽所有的中断并进入SVC32模式,在Boot-loader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的状态寄存器来实现来完成。进入SVC32模式也是通过写CPU的状态寄存器来完成。mrsr0,cpsrmovr0,#MODE_SVC32|I_BIT|F_BITmsrcpsr_c,r0b.设置系统控制寄存器,关闭CPU内部指令/数据CACHE,为后面的初始化存储系统做系统准备。ldrr0,=ARM7_SYSCFGldrr1,=0x87fffe122.2初始化存储系统。系统加电后,只有FLASH是可用的。SDRAM没有被初始化不可用。FLASH被映射到0 ̄2M的位置。这时需要初始化SDRAM。本阶段的代码通过设定特殊功能寄存器来完成SDRAM的初始化。在这部分代码执行完成后,SDRAM被映射到了2 ̄18M的位置。在这部分代码执行前,Bootloader一直是在FLASH里面执行的。为了实现内存映射,并且保证remap后Bootloader可以继续执行,本阶段要把Bootloader全部拷贝到SDRAM里面。这样,在SDRAM里就有了一个Bootloader的拷贝。但是此时Bootloader还是在FLASH里面执行。此时0 ̄2M还是FLASH,2 ̄18M还是SDRAM,但此时SDRAM里面多了一个Bootloader的拷贝。代码如下:@SelfcopyfromFLASHtoSDRAMldrr0,=__text_startldrr1,=__text_endldrr2,=__data_startldrr3,=__data_endsubr1,r1,r0@thesizeofROsubr3,r3,r2@thesizeofRWaddr1,r1,r3@thesizeofallldrr2,=0x200000@2Mcopy:ldrr3,[r0],#4strr3,[r2],#4subsr1,r1,#4bnecopy由于在SDRAM有一份Bootloader的拷贝,所以在remap后Bootloader可以继续执行。但这时是在SDRAM里执行。2.3C程序执行环境初始化。a.全局变量的初始化。由于stage2执行C语言程序的需要,因此必须要初始化一些全局变量。全局变量包括data段中已经有初值的变量和bss段中未赋初值的变量。对于data段中的变量采用直接拷贝的办法。对于bss段中没有初值的变量采用把从bss_start到bss_end的间的所有变量赋0值的办法。b.设置堆栈和跳转到C入口。由于stage2通常是C语言执行代码,因此必须把堆栈空间设置好。通常我们可以把sp的值设置为SDRAM空间的最顶端,在本系统中为0x800000。在上述一切都就绪后,就可以跳转到Bootloader的stage2去执行了。在ARM系统中,这可以通过修改PC寄存器为C入口的地址来实现。ldrpc,=load2.4串口驱动与传输协议。串口由于其电气界面的相对简单得以广泛应用,在这里串口驱动实现是通过串口操作原语和基本的上层应用两个层次实现的。对串口操作的原语是一组宏定义。如下所示:GET_STATUS(p):获得当前UART状态#defineGET_STATUS(p)(*(volatileunsigned*)((p)+USTAT))RX_DATA(s):接收数据到达标志#defineRX_DATA(s)((s)&USRRxData)TX_READY(s):发送数据就绪标志#defineGET_CHAR(p)(*(volatileunsigned*)((p)+URXBUF))GET_CHAR(p):从缓冲获得一个数据#defineGET_CHAR(p)(*(volatileunsigned*)((p)+URXBUF))PUT_CHAR(p,c):向缓冲发送一个数据#definePUT_CHAR(p,c)(*(unsigned*)((p)+UTXBUF)=(unsigned)(c))通过这组原语,配合一定的串口数据收发逻辑,就是先看标志位,标志位表示许可操作的时候,才能进行收发,否则就是忙等待。这样就可以简单的实现了串口的收发。3加载内核和根文件系统映像在加载内核和根文件系统映像之前需要如下准备工作:a.规划内存占用的布局。规划内存占用的布局包括两个方面:内核映像所占用的内存范围和根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址和映像的大小两个方面。对于内核映像,一般将其拷贝到从(MEM_START+0x8000)这个基地址开始的大约1MB大小的内存范围内(嵌入式Linux的内核一般都不操过1MB)。从MEM_START到MEM_START+0x8000这段32KB大小的内存用于放置一些Linux内核的全局数据结构,如:启动参数和内核页表等信息。而对于根文件系统映像,则一般将其拷贝到MEM_START+0x00100000开始的地方。如果用Ramdisk作为根文件系统映像,则其解压后的大小一般是1MB。b.从FLASH上拷贝到SDRAM。由于ARM通常都是在统一的内存地址空间中寻址FLASH等固态存储设备的,因此从FLASH上读取数据与从RAM单元中读取数据并没有什么不同。用一个简单的循环就可以完成从FLASH设备上拷贝映像的工作。for(i=0;i<Size/2;i++)*(DataPtr+i)=*((unsignedshort*)Read-Start+i);在将内核映像和根文件系统映像拷贝到RAM空间中后,就可以准备启动Linux内核了。结束语以S3C4510B为平台,分析了Bootloader的主要功能和工作流程。Bootloader的设计与具体硬件平台以及板级配置的不同而不同。它的根本任务是将操作操作系统引导一个合适的工作状态。参考文献[1]詹荣开.嵌入式系统BootLoader技术内幕[EB/OL].http://www2900.ibm.com/developerWorks/cn/lin-ux/l2btloader/index/shtml,2003.[2]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.[3]吴平,曹晓琳,李波等.基于ARM核的S3C4510B启动代码的研究与应用[J].电子器件,2004(2).摘要:Bootloader的开发是嵌入式系统整个开发过程中的重要环节。它是操作系统内核启动前运行的一小段程序,其作用与pc机上的BIOS相似。以ARMS3C4510B为例,分析说明了Bootloader在嵌入式Linux开发中的作用与工作流程,并设计了相应的Bootloader。关键词:Bootloader;ARM;嵌入式系统