您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > 基于s3c2410开发板的BootLoader的启动分析
基于s3c2410开发板的BootLoader的启动分析发布:2010-5-0122:38|作者:西南科技大学刘军芳李众立|来源:MCU嵌入式领域摘要:BootLoader是操作系统和硬件的枢纽,负责初始化硬件和引导操作系统的内核,目前已有一些通用的BootLoader,但是如何根据特定的嵌入式平台,开发BootLoader是一个重点和难点。本文通过阐述VIVI分析了BootLoader开发的特点和模式,详细说明了BootLoader要完成的主要任务和实现方法。0引言BootLoader通常称为系统的引导程序,是系统复位后执行的第一段代码,相当于PC上的BIOS以及商业实时操作系统中的板级支持包BSP,,其作用是初始化硬件设备、建立内存空间的映射图、为最终调用操作系统内核做好准备。BootLoader独立于操作系统,必须有用户自己设计,它的实现高度依赖于硬件,包括处理器的体系结构、具体型号、硬件电路板的设计。在基于S3C2410的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。1系统硬件平台简介本系统采用SamSung公司的S3C2410处理器,采用ARM920T为内核的处理器,有内存管理单元,支持WINCE和Linux操作系统。存储器使用64MB的NANDFlash和64MB的DRAM.集成有SDRAM内存控制器、NNADFlash控制器、SD卡控制器、USBHost、USBDevice控制器、LCD控制器、IIC总线控制器、IIS控制器、SPI接口等等多种接口,可用于手持设备、可视化电话、VoIP、网络监控、多媒体终端产品、医疗电子设备等领域。BootLoader、内核映像和文件系统映像在系统中的典型空间分配结构图如下:2VIVI简介VIVI是由韩国Mizi公司开发的一种BootLoader,适合于ARM9处理器,支持S3C2410,该系统采用的BootLoader就是VIVI。2.1VIVI的操作模式和所有的BootLoader一样,VIVI也有两种工作模式,即启动模式和下载模式。2.1.1启动加载(Bootloading)模式这种模式也称为“自主”(Autonomous)模式。也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时候,BootLoader必须工作在这种模式下。2.1.2下载(Downloading)模式在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的FLASH类固态存储设备中。BootLoader的模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader的这种工作模式。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。2.2VIVI的启动方式VIVI提供了MTD(MemoryTechnologyDevice),修改代码就可以从不同的存储器启动。即VIVI可以从NANDFlash中启动,也可以从NorFlash中启动,选择不同类型的Flash上启动,它的使用方法会有一些差别。该系统的硬件平台选用斯道S3C2410普及版,只有64MB的NANDFlash,所以系统的VIVI是从NANDFlash中启动的,因此这里只介绍从NANDFlash中启动:NANDFlash没有专门的地址线,所以他在系统中没有地址空间(它的结构是共用地址和数据线,通过分时发送地址和数据的),只适合来存储数据,不能够直接在其上执行程序指令。只有利用S3C2410专门内置的NANDFlash控制器解决这个问题:通过在芯片内设置了4KB的名为StepStone的RAM来完成NANDFlash启动功能。即通过NANDFlash启动的启动代码不要超过4KB,芯片复位后可以自动将NANDFlash最开始的4KB内容拷贝到StepStone中,然后开始执行。NANDFlash的最开始部分是head.S,在head.S的尾部VIVI将自身拷贝到RAM中,然后跳转到RAM中的main()函数,开始运行。2.3编译VIVI在VIVI窗口中输入如下命令:$makeclean$makemenuconfig在menuconfig窗口中,选择LoadConfigurationfile…在输入栏手动输入arch/def-configs/smdk2410,目标板选择从NANDFlash启动。打开arch/def-configs/smdk2410,部分内容如下:CONFIG_ARCH_S3C2410=Y;处理器选择S3C2410CONFIG_S3C2410_NAND_BOOT=Y;选择从NANDFlash启动CONFIG_VIVI_TEXTADDR=0;TEXTADDR=0保存设置退出menuconfig窗口,完成VIVI的配置。3VIVI的启动过程分析BootLoader的启动分为两个阶段:分为两个阶段主要是因为:(1)基于编程语言考虑。阶段1主要是用汇编语言编写,主要进行与CPU核以及存储设备有关的处理工作,进行一些必要的初始化工作,是一些依赖与CPU体系结构的代码,为了增加效率以及因为涉及到协处理器的设置。只能用汇编语言写,这部分直接在flash中执行;阶段2用一般的C语言,来实现一般的流程以及对板级的一些驱动的支持,这部分会拷贝到RAM执行。(2)代码具有更好的可读性和可移植性:若对于相同的CPU以及存储设备要增加外设支持,阶段1的代码可以维护不便,只对阶段2的代码进行修改;若要支持不同的CPU,则只需修改阶段1的代码。VIVI作为一种BootLoader,它的启动也分为两个阶段。3.1VIVI的阶段13.1.1基本的硬件初始化这是BootLoader一开始就执行的操作,其目的是为阶段2的执行以及随后的内核1的执行准备一些基本的硬件环境。包括以下步骤:(1)设置中断和异常向量。(2)禁止看门狗。(3)屏蔽所有的中断,在BootLoader的执行全过程中可以不必响应任何中断,中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器CPSR寄存器来完成;(4)设置CPU的速度和时钟频率;(5)对RAM进行初始化,包括正确设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等;(6)初始化UATR(7)关闭CPU内部指令/数据高速缓存(cache)。3.1.2拷贝阶段2的代码到SDRAM中拷贝时要确定两点:一是阶段2的可执行映像在固态存储设备的存放起始地址和终止地址;二是RAM空间的起始地址。3.1.3设置堆栈指针sp堆栈指针的设置是为了执行C语言代码作好准备。通常可以把sp的值设置为(stage2_end-4),经过上述这些执行步骤后,系统的物理内存布局如下图2所示:3.3.4跳转到阶段2的C人口点在上述一切就绪后,就可以跳转到BootLoader的阶段2去执行了。可以通过修改PC寄存器为合适的地址来实现。3.2VIVI的阶段2第二个阶段的代码通常是用C语言来实现的,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。但是与普通C语言应用程序不同的是,在编译和链接BootLoader程序时,不能使用glibc库中的任何支持函数,因此从哪里跳转进main()函数就成了问题。如果直接把main()函数的起始地址作为整个阶段2执行映像的人口点,这样有两个缺点:一是无法通过main()函数传递函数参数;二是无法处理main()函数返回的情况。一种较为巧妙的方法是利用弹簧床(trampoline)的概念。即用汇编语言写一段trampoline小程序,并将这段trampoline小程序作为阶段2可执行映像的执行入口点。然后可以在trampoline汇编小程序中用CPU跳转指令跳入main()函数中去执行;而当main()函数返回时,CPU执行路径显然再次回到trampoline程序。VIVI中trampoline函数调用main()函数过程如下:ldrsp,DW_STACK_STARTmovfp,#0mova2,#0blmainmovpc,#FLASH_BASH3.2.1初始化本阶段使用的硬件设备主要是开发板初始化,例如:定时器设置和IO端口设置,函数在arch/s3c2410/smdk.c中。3.2.2检测系统的内存映射BootLoader的阶段2必须先检测整个系统的内存映射情况,即它必须知道CPU预留的全部RAM地址空间中的哪些被真正映射到RAM地址单元,哪些处于“unused”状态。3.2.3加载内核映像和根文件系统映像对于内核映像,一般将其拷贝到从(MEM_START+0x8000)这个基地址开始的大约1MB大小的内存范围内。而对于根文件系统映像,则一般将其拷贝到(MEM_START+0x0010,0001)开始的地方。从Flash存储器上拷贝,由于像ARM这样的嵌入式CPU通常都是在统一的内存地址空间中寻址Flash存储器等固态存储设备的,因此从Flash存储器上读取数据与从RAM单元中读取数据并没有什么不同。用一个简单的循环就可以完成从Flash存储器上拷贝映像的工作。while(count){*dest++=*src++;/*theyareallalignedwithwordboundary*/count-=4;/*bytenumber*/};3.2.4设置内核的启动参数在将内核映像和根文件系统映像拷贝到RAM空间中后,就可以准备启动Linux内核了。但是在调用内核之前,应该做一步准备工作,即设置内核的启动参数。由于本系统是从NANDFlash启动运行Linux,所以要修改相应的启动参数,修改启动命令如下:charLinux_cmd[]=”noinitrd”root=/dev/bon/2init=/Linuxrcconcole=tty0console=ttyS03.2.5调用内核BootLoader调用内核的方法是直接跳转到内核的第1条指令处,即直接跳转到MEMSTART+0x8000地址处。4结束语BootLoader的设计与实现是一个非常复杂的过程。通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将嵌入式系统S3C2410的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。创新点:为了降低系统的硬件成本,本文采用斯道S3C2410普及版作为硬件平台,斯道S3C2410普及版只有64MB的NANDFlash,而没有NORFlash。NANDFlash只能存储数据,不能直接在其上执行程序指令,为解决这一问题:本文采用修改内核启动参数的方法,最终系统可以自动安全的启动。(见文中2.2VIVI的启动方式和3.2.4设置内核的启动参数)参考文献:1、李驹光、聂雪媛等,ARM应用系统开发详解[M],北京:清华大学出版社,20032、詹荣开,嵌入式BootLoader技术内幕,、童大鹏等,基于AT91RM9200微控制器的BootLoader的分析与开发[J],微计算机应用,200526[3],345—3494、ARM9Linux实验教程,深圳市英蓓特信息技术有限公司[M]。20055、万永波等,基于ARM的嵌入式系统BootLoader启动流程分析[J],微计算机信息,2005,11-2,90-92页6、郝淑凤等,基于ARM的uCLinux启动引导实现的分析[J],微计算机信息,2005,8-2,50-52页
本文标题:基于s3c2410开发板的BootLoader的启动分析
链接地址:https://www.777doc.com/doc-2571978 .html