1、CHAPTER 10Bootloader 设计基础设计基础2022-1-192内容提要内容提要Bootloader 概述概述S3C2410 Bootloader其他常见其他常见Bootloader2022-1-193内容提要内容提要Bootloader 概述概述S3C2410 Bootloader其他常见其他常见Bootloader2022-1-194Bootloader 概述概述o Bootloader,启动引导程序,又叫引导加载程序,功能强,启动引导程序,又叫引导加载程序,功能强大的大的Bootloader也就直接叫做板级支持包(也就直接叫做板级支持包(BSP,Board Support
2、Packet)或者固件)或者固件(Firmware)。o 近年来,为了方便嵌入式产品的推广,也有些直接将近年来,为了方便嵌入式产品的推广,也有些直接将Bootloader叫做叫做BIOS。nBIOS是是PC机的机的“基本输入输出系统基本输入输出系统”,烧录在电脑主板上,烧录在电脑主板上一块专门的芯片中。一般一块专门的芯片中。一般BIOS由主板厂商或者专门的由主板厂商或者专门的BIOS生产商提供,不是开源的,用户不能修改其中的代码进行定生产商提供,不是开源的,用户不能修改其中的代码进行定制。制。n嵌入式系统的开发则离不开嵌入式系统的开发则离不开Bootloader的开发,它也是整个的开发,它也是
3、整个系统开发中的难点之一。系统开发中的难点之一。2022-1-195Bootloader 的作用的作用oBootloader是在嵌入式操作系统内核运行之前运行的一段小程序,也是在嵌入式操作系统内核运行之前运行的一段小程序,也是系统开机后执行的第一段程序。是系统开机后执行的第一段程序。o通过这段小程序,可以初始化硬件设备、建立内存空间,从而将系统的通过这段小程序,可以初始化硬件设备、建立内存空间,从而将系统的软硬件环境设置成一个合适的状态,以便为最终调用操作系统内核准备软硬件环境设置成一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。好正确的环境。Bootloader是依赖于底层硬件而
4、实现的,因此建立一是依赖于底层硬件而实现的,因此建立一个通用的嵌入式系统个通用的嵌入式系统Bootloader几乎是不可能的。几乎是不可能的。o在在PC机中,主板的机中,主板的BIOS和位于硬盘和位于硬盘0磁道上的主引导记录磁道上的主引导记录(Master Boot Record, MBR)中的引导程序(如中的引导程序(如LILO或或GRUB等)等),两者一起的两者一起的作用就相当于作用就相当于Bootloader在嵌入式系统中的作用,即实现整个系统的在嵌入式系统中的作用,即实现整个系统的启动引导,并最终能引导操作系统的运行。启动引导,并最终能引导操作系统的运行。o在嵌入式系统中,在嵌入式系统
5、中,Bootloader对嵌入式设备中的主要部件如对嵌入式设备中的主要部件如CPU、SDRAM、FLASH、串口等进行了初始化,这样可以使用、串口等进行了初始化,这样可以使用Bootloader通过串口下载各种文件到设备的通过串口下载各种文件到设备的SDRAM中或者烧录中或者烧录Flash,然后将操,然后将操作系统内核读入到内存中来或者直接跳转到内核的入口点,从而实现操作系统内核读入到内存中来或者直接跳转到内核的入口点,从而实现操作系统的引导。作系统的引导。2022-1-196Bootloader 的作用的作用oBootloader从第一条指令跳转后,就开始初始化各种硬件,如从第一条指令跳转后
6、,就开始初始化各种硬件,如CPU工工作频率、定时器、中断、看门狗、检测作频率、定时器、中断、看门狗、检测RAM大小和大小和Flash等。其主要完等。其主要完成以下工作:成以下工作:n初始化初始化CPU速度;速度;n初始化内存,包括启用内存库,初始化内存配置寄存器等;初始化内存,包括启用内存库,初始化内存配置寄存器等;n初始化中断控制器,在系统启动时,关闭中断,关闭看门狗;初始化中断控制器,在系统启动时,关闭中断,关闭看门狗;n初始化串行端口(如果在目标上有的话);初始化串行端口(如果在目标上有的话);n启用指令启用指令/数据高速缓存;数据高速缓存;n设置堆栈指针;设置堆栈指针;n设置参数区域并
7、构造参数结构和标记设置参数区域并构造参数结构和标记,即引导参数;即引导参数;n执行执行POST(上电自检)来标识存在的设备并报告有何问题;(上电自检)来标识存在的设备并报告有何问题;n为电源管理提供挂起为电源管理提供挂起/恢复支持;恢复支持;n传输操作系统内核镜像文件到目标机。也可以将操作系统内核镜像传输操作系统内核镜像文件到目标机。也可以将操作系统内核镜像文件事先存放在文件事先存放在Flash中,这样就不需要中,这样就不需要Bootloader和主机传输操和主机传输操作系统内核镜像文件,这通常是在做成产品的情况下使用。作系统内核镜像文件,这通常是在做成产品的情况下使用。n跳转到内核的开始,在
8、此又分为跳转到内核的开始,在此又分为ROM启动和启动和RAM启动。启动。2022-1-197Bootloader 的作用的作用o 在嵌入式在嵌入式Linux软件系统的开发中,一般将软件分为启动引导程软件系统的开发中,一般将软件分为启动引导程序序(Bootloader)、操作系统内核、操作系统内核(OS Kernel)、根文件系统、根文件系统(File System)、图形窗口系统、图形窗口系统(GUI)和应用程序和应用程序(AP)等几个部等几个部分,其中前三部分是一个可运行的嵌入式系统必不可少的,分,其中前三部分是一个可运行的嵌入式系统必不可少的, 它它们在开发的过程中,被分别独立地编译链接或
9、打包为一个二进制们在开发的过程中,被分别独立地编译链接或打包为一个二进制目标文件,然后下载(烧录)到嵌入式系统的目标文件,然后下载(烧录)到嵌入式系统的ROM中。后两部中。后两部分如果有的话,通常也是和根文件系统一起打包后烧录到分如果有的话,通常也是和根文件系统一起打包后烧录到Flash中。因此,在中。因此,在Bootloader阶段,也提供了对阶段,也提供了对Flash设备的分区格设备的分区格式化的支持,其空间分配通常如图所示。式化的支持,其空间分配通常如图所示。o 嵌入式系统中的嵌入式系统中的 Bootloader通常是开源通常是开源的,常见的有的,常见的有vivi、U-Boot、Blob
10、、ARMBoot、RedBoot、Nboot、Eboot等。等。开发人员可以从网上下载相应源代码,针开发人员可以从网上下载相应源代码,针对自己的嵌入式硬件系统进行二次开发,对自己的嵌入式硬件系统进行二次开发,这个过程称为这个过程称为Bootloader的移植。的移植。2022-1-198Bootloader 的工作模式的工作模式o Bootloader通常包含通常包含“启动加载启动加载”和和“下载下载”这两种不同这两种不同的工作模式。的工作模式。o 1、启动加载(、启动加载(boot loading)模式)模式n正常启动模式,即正常启动模式,即Bootloader从嵌入式目标机上的某个固态从嵌
11、入式目标机上的某个固态存储设备上(如存储设备上(如Flash、磁盘等)将操作系统加载到、磁盘等)将操作系统加载到RAM中中运行,整个过程并没有用户的介入和操作。运行,整个过程并没有用户的介入和操作。o 2、下载(、下载(down loading)模式)模式n在该模式下,目标机上的在该模式下,目标机上的Bootload通过串口连接或网络连接通过串口连接或网络连接等通信手段从宿主机上下载文件,如下载内核映像和根文件等通信手段从宿主机上下载文件,如下载内核映像和根文件系统映像等。从主机下载的文件通常首先被系统映像等。从主机下载的文件通常首先被Bootloader保存保存到目标机的到目标机的RAM中,
12、然后再被中,然后再被Bootloader写到目标机的写到目标机的Flash等存储设备中。等存储设备中。n该模式主要提供给开发人员或技术支持人员使用,类似于该模式主要提供给开发人员或技术支持人员使用,类似于PC机对机对BIOS进行设置。进行设置。2022-1-199Bootloader 的启动流程的启动流程o Bootloader启动过程通常可以分为启动过程通常可以分为stage1和和stage2两个两个阶段阶段 。n一般依赖于一般依赖于 CPU 体系结构的代码,比如设备初始化代码等,体系结构的代码,比如设备初始化代码等,都放在都放在stage1中,而且通常都用汇编语言来实现,以达到短中,而且通
13、常都用汇编语言来实现,以达到短小精悍且启动快的目的;而小精悍且启动快的目的;而 stage2 则通常用则通常用C语言来实现,语言来实现,这样可以实现各种复杂的功能(比如串口、以太网接口的支这样可以实现各种复杂的功能(比如串口、以太网接口的支持等)持等)o Bootloader的第一阶段的第一阶段1. 硬件设备初始化硬件设备初始化2. 为加载为加载 Bootloader 的的 stage2 准备准备 RAM 空间空间 3. 拷贝拷贝 Bootloader的的 stage2 到到 RAM 空间中空间中4. 设置好堆栈设置好堆栈 5.跳转到跳转到 stage2 的的 C 入口点入口点main()函数
14、处函数处2022-1-1910Bootloader 的启动流程的启动流程o Bootloader的第二阶段的第二阶段1. 初始化本阶段要使用到的硬件设备初始化本阶段要使用到的硬件设备2. 检测系统内存映射检测系统内存映射(memory map)3. 将将 kernel 映像和根文件系统映像从映像和根文件系统映像从 flash 上读到上读到 RAM 空空间中间中4. 为内核设置启动参数为内核设置启动参数5. 调用内核调用内核2022-1-1911内容提要内容提要Bootloader 概述概述S3C2410 Bootloader其他常见其他常见Bootloader2022-1-1912S3C241
15、0 平台下平台下Linux的的Bootloadero vivio U-BOOT2022-1-1913vivio 1. vivi简介简介o vivi是由韩国是由韩国mizi公司为公司为ARM处理器系列设计的一个处理器系列设计的一个bootloader。它同样支持启动加载模式和下载工作模式。它同样支持启动加载模式和下载工作模式。o 在下载模式下,在下载模式下,vivi为用户提供一个命令行人机接口,通过为用户提供一个命令行人机接口,通过这个人机接口可以使用这个人机接口可以使用vivi提供的一些命令。如果嵌入式系提供的一些命令。如果嵌入式系统没有键盘和显示,那么可以利用统没有键盘和显示,那么可以利用v
16、ivi中的串口,将其和宿中的串口,将其和宿主机连接起来,利用宿主机中的串口软件(如主机连接起来,利用宿主机中的串口软件(如windows中中的超级终端或者的超级终端或者Linux中的中的minicom)来控制。)来控制。o vivi常用的命令常用的命令 Load,Part,bon,Param,Boot,Flash 2022-1-1914vivio 2. vivi文件结构文件结构 vivi的代码包括的代码包括arch,init,lib,drivers和和include等几等几个目录个目录,共共200多个文件。多个文件。o 3. vivi的配置和编译的配置和编译 #make distclean。清
17、除一些早先生成的无用的目标文件。 #make menuconfig。然后可以根据菜单中的信息进行配置。 make”命令开始编译 2022-1-1915vivio vivi的第一阶段的第一阶段n主要完成了依赖于主要完成了依赖于CPU的体系结构硬件初始化,包括禁止中的体系结构硬件初始化,包括禁止中断、初始化串口、复制第二阶段到断、初始化串口、复制第二阶段到RAM中等。由于这些代码中等。由于这些代码是和硬件紧密相关的是和硬件紧密相关的,因此要求读者在阅读时对照因此要求读者在阅读时对照S3C2410处理器的数据手册处理器的数据手册,查阅相关的寄存器的描述,以便更好地理查阅相关的寄存器的描述,以便更好地
18、理解。这些汇编代码全部就集中在解。这些汇编代码全部就集中在viviarchs3c2410目录下目录下的的head.S这一个汇编文件中,当然还有相关的头文件。这一个汇编文件中,当然还有相关的头文件。o vivi第二阶段第二阶段nvivi的第二阶段的入口就是的第二阶段的入口就是init/main.c,按照源代码的组织,按照源代码的组织流程,根据模块化划分的原则,共分为流程,根据模块化划分的原则,共分为8个功能模块即八个步个功能模块即八个步骤,在源代码的注释中以骤,在源代码的注释中以step非常清晰的给出了区分。非常清晰的给出了区分。2022-1-1916vivi第二阶段执行步骤第二阶段执行步骤n第
19、一步:第一步:vivi从从main()函数开始执行,函数开始通过函数开始执行,函数开始通过 putstr(vivi_bannner)打印出打印出vivi的版本。的版本。 n第二步:主要是初始化第二步:主要是初始化GPIO,在把握好整个系统硬件资源的,在把握好整个系统硬件资源的前提下,根据芯片的数据手册把所有的初始值设定,在这里前提下,根据芯片的数据手册把所有的初始值设定,在这里利用利用set_gpios这个函数就可以完成初始化了。这个函数就可以完成初始化了。n第三步:进行内存映射初始化和内存管理单元(第三步:进行内存映射初始化和内存管理单元(MMU)的初)的初始化工作始化工作 n第四步:初始化
20、堆,然后内存会发生变化。在这里,实际上第四步:初始化堆,然后内存会发生变化。在这里,实际上就是实现动态内存分配策略。就是实现动态内存分配策略。n第五步:初始化第五步:初始化mtd设备设备 n第六步:配置参数,主要是第六步:配置参数,主要是init_priv_data函数。函数。 n第七步:提供第七步:提供vivi人机接口的各种命令。人机接口的各种命令。 n第八步:进入第八步:进入Bootloader的两种模式之一的两种模式之一.2022-1-1917U-booto U-Boot,全称,全称Universal Bootloader,是遵循,是遵循GPL条款条款的开放源码项目的开放源码项目 o 它
21、还支持它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS等嵌入式操作系统。其目前主要支持的目标操作系等嵌入式操作系统。其目前主要支持的目标操作系统有统有OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS等,因此功能比等,因此功能比较强大,这也是较强大,这也是U-Boot中中Universal的一层含义。的一层含义。2022-1-1918U-booto U-Bo
22、ot的主要特点有:的主要特点有:n 开放源码;开放源码;n 支持多种嵌入式操作系统内核,如支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;n 支持多个处理器系列,如支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;n 较高的可靠性和稳定性;较高的可靠性和稳定性;n 高度灵活的功能设置,适合高度灵活的功能设置,适合U-Boot调试、操作系统不同调试、操作系统不同引导要求、产品发布等;引导要求、产品发布等;n 丰富的设备驱动源码,如串口、以太网、丰富的设备驱动源码,如串口、以太网、SDRAM
23、、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;键盘等;n 较为丰富的开发调试文档与强大的网络技术支持;较为丰富的开发调试文档与强大的网络技术支持;2022-1-1919U-booto常用命令常用命令 nHelp/ ? nbdinfonsetenvnprintenv nsaveenvnmw、md、mmnflinfonerase起始地址起始地址 结束地址结束地址ncp源地址源地址 目标地址大小目标地址大小nimi起始地址起始地址nbootm起始地址起始地址ntftboot起始地址起始地址 镜像名镜像名nreset2022-1-1920U-booto U-boot文件结构文件结构n
24、U-boot代码采用了一种高度模块化的编程方式,与移植树有代码采用了一种高度模块化的编程方式,与移植树有关的有以下几个目录关的有以下几个目录. nboard:这个目录存放了所有这个目录存放了所有U-boot支持的目标板的子目录,支持的目标板的子目录,如如board/smdk2410/*。要将要将U-boot移植到自己的移植到自己的s3c2410 x目标板上目标板上,必须参考这个目录下的内容,比如对比必须参考这个目录下的内容,比如对比Flash以及以及Flash宽度和大小的定制等,就要修改其中的宽度和大小的定制等,就要修改其中的flash.c。ncommon:独立于处理器体系结构的通用代码,如内
25、存大小独立于处理器体系结构的通用代码,如内存大小探测与故障检测;探测与故障检测;ncpu:与处理器相关的文件。如与处理器相关的文件。如mpc8xx子目录下含串口、子目录下含串口、网口、网口、LCD驱动及中断初始化等文件;驱动及中断初始化等文件;ndriver: 通用设备驱动,如通用设备驱动,如CFI FLASH驱动驱动(目前对目前对INTEL FLASH支持较好支持较好)nfs:这个目录中存放了这个目录中存放了U-boot支持的文件系统。支持的文件系统。2022-1-1921U-booto U-boot文件结构文件结构nexamples:可在可在U-Boot下运行的示例程序;下运行的示例程序;
26、nInclude: U-Boot头文件;这个目录存放头文件的公共目录,头文件;这个目录存放头文件的公共目录,其中其中include/configs/smdk2410.h定义了所有和定义了所有和S3C2410X相关的资源的配置参数,我们往往只需修改这个相关的资源的配置参数,我们往往只需修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。存映射等。nlib_xxx:处理器体系相关的文件,如处理器体系相关的文件,如lib_ppc。nlib_arm:目录分别包含与目录分别包含与PowerPC、ARM体系结构相关的体系结构相关的文
27、件;文件;nnet:与网络功能相关的文件目录,如与网络功能相关的文件目录,如bootp,nfs,tftp。npost: 上电自检文件目录。尚有待于进一步完善;上电自检文件目录。尚有待于进一步完善;nrtc:驱动程序;驱动程序;ntools:用于创建用于创建U-Boot S-RECORD和和BIN镜像文件的工具;镜像文件的工具; 2022-1-1922U-boot代码分析代码分析o U-boot和和vivi有很多相似之处,详细内容可参考:有很多相似之处,详细内容可参考:嵌入式设计与嵌入式设计与Linux驱动开发指南驱动开发指南基于基于ARM9处理器处理器. 孙孙天泽天泽o U-boot的启动也是
28、从位于的启动也是从位于cpu/arm920t/start.S文件开始文件开始的。的。cpu目录中其余的文件都是用目录中其余的文件都是用C语言写的,包括:语言写的,包括:ncpu.c(处理器相关)(处理器相关)ninterrupts.c(中断相关)(中断相关)nserial.c(串行设备相关)(串行设备相关)nspeed.c(处理器频率相关)(处理器频率相关)nusb_ohci.c(USB相关)相关)2022-1-1923内容提要内容提要Bootloader 概述概述S3C2410 Bootloader其他常见其他常见Bootloader2022-1-1924WinCE的的Bootloadero
29、Windows CE.NET(简称(简称WinCE)是微软公司向嵌入式领域推出的一)是微软公司向嵌入式领域推出的一款操作系统。款操作系统。oWinCE不是一个通用的安装版操作系统,开发人员必须根据自己的硬不是一个通用的安装版操作系统,开发人员必须根据自己的硬件平台和应用场合定制件平台和应用场合定制WinCE,其中最主要的就是编写适合于硬件平,其中最主要的就是编写适合于硬件平台的板级支持包(台的板级支持包(BSP)。在)。在BSP中,最重要的组成部分是中,最重要的组成部分是Bootloader,它是开发,它是开发WinCE系统的第一步,也是最为关键的一步。系统的第一步,也是最为关键的一步。oNb
30、oot和和Eboot是是WinCE的的Bootloader。 nNboot是是nand flash bootloader的简写,的简写,CPU可以直接从可以直接从nand flash 启动,但是其代码大小不能超过启动,但是其代码大小不能超过4k,功能有限;,功能有限;nEboot则支持则支持ethernet network(以太网),功能强大,用于(以太网),功能强大,用于 Ehternet在线调试和下载。在线调试和下载。 nNboot是系统启动后是系统启动后 执行的第一段代码,然后它直接跳转到执行的第一段代码,然后它直接跳转到Eboot,由由Eboot引导引导WinCE或者直接引导或者直接引
31、导WinCE。nEboot一个很重要的功能就是提供对一个很重要的功能就是提供对WinCE内核的下载。内核的下载。2022-1-1925WinCE的的Bootloadero Bootloader的配置和编译通常采用微软公司的的配置和编译通常采用微软公司的Platform Builder(PB)工具软件。工具软件。n该工具能根据用户的需求,选择构建具有不同内核功能的该工具能根据用户的需求,选择构建具有不同内核功能的WinCE系统。系统。n同时,它是一个集成开发环境,可以为所有同时,它是一个集成开发环境,可以为所有WinCE支持的支持的CPU目标代码编译目标代码编译C/C+程序,程序,WinCE操作
32、系统内核的移操作系统内核的移植和配置也是在该环境下编译。植和配置也是在该环境下编译。o WinCE的开发可参考的开发可参考ARM9&WinCE实验与实践实验与实践基于基于S3C2410. 周立功周立功2022-1-1926Blobo Blob是是Bootloader Object的缩写,是一款功能强大的的缩写,是一款功能强大的Bootloader,目前常用于,目前常用于Intel推出的推出的Xscale架构的架构的CPU的引导,譬如的引导,譬如SA1110、PXA255/270等。等。o Blob的代码也可以分为两个阶段。第一阶段从的代码也可以分为两个阶段。第一阶段从start.s文件文件开始
33、,这也是开机执行的第一段代码,这部分代码是在开始,这也是开机执行的第一段代码,这部分代码是在Flash中运行,主要功能包括对中运行,主要功能包括对S3C2410的一些寄存器的的一些寄存器的初始化和将初始化和将Blob第二阶段代码从第二阶段代码从Flash拷贝到拷贝到SDRAM中。中。这一阶段的代码被编译后最大不能超过这一阶段的代码被编译后最大不能超过1KB。o 第二阶段的起始文件为第二阶段的起始文件为trampoline.s,被复制到,被复制到SDRAM后,就从第一阶段跳到这个文件开始执行,先进行一些变后,就从第一阶段跳到这个文件开始执行,先进行一些变量设置、堆栈的初始化等工作后,跳转到量设置、堆栈的初始化等工作后,跳转到main.c进入进入C函函数。第二阶段最大为数。第二阶段最大为63KB 。2022-1-1927谢谢 谢!谢!