1 / 33

第 10 章 Bootloader 设计基础

第 10 章 Bootloader 设计基础. 10.1 Bootloader 概述.

bernie
Download Presentation

第 10 章 Bootloader 设计基础

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第10章 Bootloader 设计基础

  2. 10.1 Bootloader 概述 • Bootloader,启动引导程序,又叫引导加载程序,功能强大的Bootloader也就直接叫做板级支持包(BSP,Board Support Packet)或者固件(Firmware)。近年来,为了方便嵌入式产品的推广,也有些直接将Bootloader叫做BIOS。BIOS是PC机的“基本输入输出系统”,烧录在电脑主板上一块专门的芯片中。一般BIOS由主板厂商或者专门的BIOS生产商提供,不是开源的,用户不能修改其中的代码进行定制。而嵌入式系统的开发则离不开Bootloader的开发,它也是整个系统开发中的难点之一。

  3. 10.1.1 Bootloader 的作用 • Bootloader是在嵌入式操作系统内核运行之前运行的一段小程序,也是系统开机后执行的第一段程序。通过这段小程序,可以初始化硬件设备、建立内存空间,从而将系统的软硬件环境设置成一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。Bootloader是依赖于底层硬件而实现的,因此建立一个通用的嵌入式系统Bootloader几乎是不可能的。 • 在PC机中,主板的BIOS和位于硬盘0磁道上的主引导记录(Master Boot Record, MBR)中的引导程序(如LILO或GRUB等),两者一起的作用就相当于Bootloader在嵌入式系统中的作用,即实现整个系统的启动引导,并最终能引导操作系统的运行。

  4. 10.1.1 Bootloader 的作用 • 在嵌入式系统中,Bootloader对嵌入式设备中的主要部件如CPU、SDRAM、FLASH、串口等进行了初始化,这样可以使用Bootloader通过串口下载各种文件到设备的SDRAM中或者烧录Flash,然后将操作系统内核读入到内存中来或者直接跳转到内核的入口点,从而实现操作系统的引导。现在有些Bootloader也把对以太网的支持等功能也加进去了,这样一个功能比较强大的Bootloader实际上就已经相当于一个微型的操作系统了。

  5. 10.1.1 Bootloader 的作用 • Bootloader从第一条指令跳转后,就开始初始化各种最重要的硬件,比如CPU的工作频率、定时器、中断、看门狗、检测RAM大小和Flash等。一般,硬件初始化的这段程序是用汇编语言编写的,其后就用C语言编写。总体上Bootloader主要完成以下工作:

  6. 10.1.1 Bootloader 的作用 • 初始化CPU速度; • 初始化内存,包括启用内存库,初始化内存配置寄存器等; • 初始化中断控制器,在系统启动时,关闭中断,关闭看门狗; • 初始化串行端口(如果在目标上有的话); • 启用指令/数据高速缓存; • 设置堆栈指针; • 设置参数区域并构造参数结构和标记,即引导参数; • 执行POST(上电自检)来标识存在的设备并报告有何问题; • 为电源管理提供挂起/恢复支持; • 传输操作系统内核镜像文件到目标机。也可以将操作系统内核镜像文件事先存放在Flash中,这样就不需要Bootloader和主机传输操作系统内核镜像文件,这通常是在做成产品的情况下使用。而一般在开发过程中,为了调试内核的方便,不将操作系统内核镜像文件固化在Flash中,这就需要主机和目标机进行文件传输; • 跳转到内核的开始,在此又分为ROM启动和RAM启动。所谓ROM启动就是用XIP技术直接在Flash中执行操作系统镜像文件;所谓RAM启动就是指把内核镜像从Flash复制到RAM中,然后再将PC指针跳转到RAM中的操作系统启动地址。

  7. 10.1.1 Bootloader 的作用 • 在嵌入式Linux软件系统的开发中,一般将软件分为启动引导程序(Bootloader)、操作系统内核(OS Kernel)、根文件系统(File System)、图形窗口系统(GUI)和应用程序(AP)等几个部分,其中前三部分是一个可运行的嵌入式系统必不可少的, 它们在开发的过程中,被分别独立地编译链接或打包为一个二进制目标文件,然后下载(烧录)到嵌入式系统的ROM(一般是Flash)中。后两部分如果有的话, • 通常也是和根文件系统一 • 起打包后烧录到Flash中。 • 因此,在Bootloader阶段, • 也提供了对Flash设备的分 • 区格式化的支持,其空间 • 分配通常如图所示。

  8. 10.1.2 Bootloader 的工作模式 • 对于嵌入式系统的开发人员而言,Bootloader通常包含“启动加载”和“下载”这两种不同的工作模式。当然,这两种工作模式的区别一般仅仅对于开发人员才有意义,而对最终用户来说,Bootloader 的作用就是用来加载操作系统,从而启动整个嵌入式系统。

  9. 10.1.2 Bootloader 的工作模式 • 启动加载(Boot loading)模式 --正常启动模式 • 下载(Downloading)模式 --提供给开发人员或者技术支持人员使用

  10. 10.1.3 Bootloader 的启动流程 • 分为stage1和stage2两个阶段 一般依赖于 CPU 体系结构的代码,比如设备初始化代码等,都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍且启动快的目的;而 stage2 则通常用C语言来实现,这样可以实现各种复杂的功能(比如串口、以太网接口的支持等)

  11. Bootloader的第一阶段 1. 硬件设备初始化 2. 为加载 Bootloader 的 stage2 准备 RAM 空间 3. 拷贝 Bootloader的 stage2 到 RAM 空间中 4. 设置好堆栈 5.跳转到 stage2 的 C 入口点main()函数处

  12. Bootloader的第二阶段 • 初始化本阶段要使用到的硬件设备 • 检测系统内存映射(memory map) • 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中 • 为内核设置启动参数 • 调用内核

  13. 10.2 S3C2410 平台下Linux的Bootloader • Vivi • U-BOOT

  14. 10.2 S3C2410 平台下Linux的Bootloader • 1. vivi简介 • vivi是由韩国mizi公司为ARM处理器系列设计的一个bootloader。它同样支持启动加载模式和下载工作模式。 • 在下载模式下,vivi为用户提供一个命令行人机接口,通过这个人机接口可以使用vivi提供的一些命令。如果嵌入式系统没有键盘和显示,那么可以利用vivi中的串口,将其和宿主机连接起来,利用宿主机中的串口软件(如windows中的超级终端或者Linux中的minicom)来控制。

  15. 10.2.1 vivi • vivi常用的命令 Load,Part,bon,Param,Boot,Flash

  16. 10.2.1 vivi • vivi文件结构 代码包括arch,init,lib,drivers和include等几个目录,共200多条文件 • vivi的配置和编译 • #make distclean。清除一些早先生成的无用的目标文件。 • #make menuconfig。然后可以根据菜单中的信息进行配置。 • make”命令开始编译

  17. 10.2.1 vivi • 3. vivi的配置和编译 • vivi的配置和嵌入式Linux内核一样,可以采用菜单化的形式进行。其步骤主要如下: • ① #make distclean。清除一些早先生成的无用的目标文件。 • ② #make menuconfig。然后可以根据菜单中的信息进行配置。 • 编译。菜单配置完毕后,保存退出。然后执行“make”命令开始编译。

  18. 10.2.1 vivi • vivi的第一阶段主要完成了依赖于CPU的体系结构硬件初始化,包括禁止中断、初始化串口、复制第二阶段到RAM中等。由于这些代码是和硬件紧密相关的,因此要求读者在阅读时对照S3C2410处理器的数据手册,查阅相关的寄存器的描述,以便更好地理解。这些汇编代码全部就集中在vivi\arch\s3c2410目录下的head.S这一个汇编文件中,当然还有相关的头文件。

  19. 10.2.1 vivi • vivi第二阶段的分析 • vivi的第二阶段的入口就是init/main.c,按照源代码的组织流程,根据模块化划分的原则,共分为8个功能模块即八个步骤,在源代码的注释中以step非常清晰的给出了区分。

  20. 10.2.1 vivi • 第一步:vivi从main()函数开始执行,函数开始通过 putstr(vivi_bannner)打印出vivi的版本。 • 第二步:主要是初始化GPIO,本的思路和方法就是在把握好整个系统硬件资源的前提下,根据芯片的数据手册把所有的初始值设定,在这里利用set_gpios这个函数就可以完成初始化了。

  21. 10.2.1 vivi • 第三步:进行内存映射初始化和内存管理单元(MMU)的初始化工作 • 第四步:初始化堆,然后内存会发生变化。在这里,实际上就是实现动态内存分配策略。

  22. 10.2.1 vivi • 第五步:初始化mtd设备 • 第六步:配置参数,主要是init_priv_data函数。 • 第七步:提供vivi人机接口的各种命令。 • 第八步:进入Bootloader的两种模式之一.

  23. 10.2.2 U-boot • U-Boot,全称Universal Bootloader,是遵循GPL条款的开放源码项目 • 它还支持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的一层含义。

  24. 10.2.2 U-boot • U-Boot的主要特点有: • ① 开放源码;  ② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, • LynxOS;   ③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;  ④ 较高的可靠性和稳定性;  ④ 较高的可靠性和稳定性;  ⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;  ⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;  ⑦ 较为丰富的开发调试文档与强大的网络技术支持;

  25. 10.2.2 U-boot • 常用命令 :Help/ ? Bdinfo setenv printenv saveenv mw md mm flin foerase[起始地址 结束地址]. cp[源地址 目标地址大小] imi[起始地址] bootm[起始地址] tftboot[起始地址 镜像名] reset

  26. 10.2.2 U-boot • U-boot文件结构 • U-boot代码采用了一种高度模块化的编程方式,与移植树有关的有以下几个目录. • board:这个目录存放了所有U-boot支持的目标板的子目录,如board/smdk2410/*就是我们说关心的.要将U-boot移植到自己的s3c2410x目标板上,必须参考这个目录下的内容,比如对比Flash以及Flash宽度和大小的定制邓就要修改其中的flash.c。 • common: 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;cpu:与处理器相关的文件。如mpc8xx子 目录下含串口、网口、LCD驱动及中断初始化等文件;

  27. 10.2.2 U-boot • driver: 通用设备驱动,如CFI FLASH 驱动(目前对INTEL FLASH支持较好) • fs:这个目录中存放了U-boot支持的文件系统. examples:可在U-Boot下运行的示例程序;如hello_world.c,timer.c; • Include: U-Boot头文件;这个目录存放头文件的公共目录,其中include/configs/smdk2410.h定义了所有和 S3C2410X相关的资源的配置参数,我们往往只需修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。

  28. 10.2.2 U-boot • lib_xxx: 处理器体系相关的文件,如lib_ppc, • lib_arm:目录分别包含与PowerPC、ARM体系结构相关的文件; • net: 与网络功能相关的文件目录,如bootp,nfs,tftp; • post: 上电自检文件目录。尚有待于进一步完善; • rtc rtc:驱动程序; • tools: 用于创建U-Boot S-RECORD和BIN镜像文件的工具;

  29. 10.3 其他常见的Bootloader • 1. WinCE的Bootloader Nboot和Eboot是WinCE的Bootloader。 Nboot是nand flash bootloader的简写,CPU可以直接从nand flash 启动,但是其代码大小不能超过4k,功能有限;Eboot则支持ethernet network(以太网),功能强大,用于 Ehternet在线调试和下载。

  30. Eboot提供的命令

  31. 2.Blob Blob是Bootloader Object的缩写,是一款功能强大的Bootloader,目前常用于Intel推出的Xscale架构的CPU的引导,譬如SA1110、PXA255/270等。

  32. Blob的代码也可以分为两个阶段。第一阶段从start.s文件开始,这也是开机执行的第段代码,这部分代码是在Flash中运行,主要功能包括对S3C2410的一些寄存器的初始化和将Blob第二阶段代码从Flash拷贝到SDRAM中。这一阶段的代码被编译后最大不能超过1kB。

  33. 第二阶段的起始文件为trampoline.s,被复制到SDRAM后,就从第一阶段跳到这个文件开始执行,先进行一些变量设置、堆栈的初始化等工作后,跳转到main.c进入C函数。第二阶段最大为63KB

More Related