33
第 10 第 Bootloader 第第第第

第 10 章 Bootloader 设计基础

  • Upload
    bernie

  • View
    87

  • Download
    6

Embed Size (px)

DESCRIPTION

第 10 章 Bootloader 设计基础. 10.1 Bootloader 概述. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 10 章  Bootloader  设计基础

第 10 章 Bootloader 设计基础

Page 2: 第 10 章  Bootloader  设计基础

10.1 Bootloader 概述 Bootloader ,启动引导程序,又叫引导加载

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

Page 3: 第 10 章  Bootloader  设计基础

10.1.1 Bootloader 的作用 Bootloader 是在嵌入式操作系统内核运行之前运行的

一段小程序,也是系统开机后执行的第一段程序。通过这段小程序,可以初始化硬件设备、建立内存空间,从而将系统的软硬件环境设置成一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 Bootloader 是依赖于底层硬件而实现的,因此建立一个通用的嵌入式系统 Bootloader 几乎是不可能的。

在 PC 机中,主板的 BIOS 和位于硬盘 0 磁道上的主引导记录 (Master Boot Record, MBR) 中的引导程序(如 LILO 或 GRUB 等) , 两者一起的作用就相当于 Bootloader 在嵌入式系统中的作用,即实现整个系统的启动引导,并最终能引导操作系统的运行。

Page 4: 第 10 章  Bootloader  设计基础

10.1.1 Bootloader 的作用 在嵌入式系统中, Bootloader 对嵌入式设备

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

Page 5: 第 10 章  Bootloader  设计基础

10.1.1 Bootloader 的作用 Bootloader 从第一条指令跳转后,就开

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

Page 6: 第 10 章  Bootloader  设计基础

10.1.1 Bootloader 的作用 初始化 CPU速度; 初始化内存,包括启用内存库,初始化内存配置寄存器等; 初始化中断控制器,在系统启动时,关闭中断,关闭看门狗; 初始化串行端口(如果在目标上有的话); 启用指令 / 数据高速缓存; 设置堆栈指针; 设置参数区域并构造参数结构和标记 , 即引导参数; 执行 POST(上电自检)来标识存在的设备并报告有何问题; 为电源管理提供挂起 / 恢复支持; 传输操作系统内核镜像文件到目标机。也可以将操作系统内核镜像文件事先存放

在 Flash 中,这样就不需要 Bootloader 和主机传输操作系统内核镜像文件,这通常是在做成产品的情况下使用。而一般在开发过程中,为了调试内核的方便,不将操作系统内核镜像文件固化在 Flash 中,这就需要主机和目标机进行文件传输;

跳转到内核的开始,在此又分为 ROM 启动和 RAM 启动。所谓 ROM 启动就是用 XIP技术直接在 Flash 中执行操作系统镜像文件;所谓 RAM 启动就是指把内核镜像从 Flash复制到 RAM 中,然后再将 PC 指针跳转到 RAM 中的操作系统启动地址。

Page 7: 第 10 章  Bootloader  设计基础

10.1.1 Bootloader 的作用 在嵌入式 Linux软件系统的开发中,一般将软件分为启动引导程

序 (Bootloader) 、操作系统内核 (OS Kernel) 、根文件系统 (File System) 、图形窗口系统 (GUI) 和应用程序 (AP) 等几个部分,其中前三部分是一个可运行的嵌入式系统必不可少的, 它们在开发的过程中,被分别独立地编译链接或打包为一个二进制目标文件,然后下载(烧录)到嵌入式系统的 ROM (一般是 Flash )中。后两部分如果有的话,

通常也是和根文件系统一 起打包后烧录到 Flash 中。 因此,在 Bootloader阶段, 也提供了对 Flash 设备的分 区格式化的支持,其空间 分配通常如图所示。

Page 8: 第 10 章  Bootloader  设计基础

10.1.2 Bootloader 的工作模式 对于嵌入式系统的开发人员而言, Boo

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

Page 9: 第 10 章  Bootloader  设计基础

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

Page 10: 第 10 章  Bootloader  设计基础

10.1.3 Bootloader 的启动流程 分为 stage1 和 stage2两个阶段 一般依赖于 CPU 体系结构的代码,比如

设备初始化代码等,都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍且启动快的目的;而 stage2 则通常用 C语言来实现,这样可以实现各种复杂的功能(比如串口、以太网接口的支持等)

Page 11: 第 10 章  Bootloader  设计基础

Bootloader 的第一阶段 1. 硬件设备初始化2. 为加载 Bootloader 的 stage2 准备 RA

M 空间 3. 拷贝 Bootloader 的 stage2 到 RAM 空

间中4. 设置好堆栈 5. 跳转到 stage2 的 C 入口点 main()函数处

Page 12: 第 10 章  Bootloader  设计基础

Bootloader 的第二阶段 1. 初始化本阶段要使用到的硬件设备2. 检测系统内存映射 (memory map)3. 将 kernel 映像和根文件系统映像从 fl

ash 上读到 RAM 空间中4. 为内核设置启动参数5. 调用内核

Page 13: 第 10 章  Bootloader  设计基础

10.2 S3C2410 平台下 Linux的 Bootloader

Vivi

U-BOOT

Page 14: 第 10 章  Bootloader  设计基础

10.2 S3C2410 平台下 Linux的 Bootloader 1. vivi 简介 vivi 是由韩国mizi公司为 ARM处理器系列设计的一个 bootloader 。它同样支持启动加载模式和下载工作模式。

在下载模式下, vivi 为用户提供一个命令行人机接口,通过这个人机接口可以使用 vivi 提供的一些命令。如果嵌入式系统没有键盘和显示,那么可以利用 vivi 中的串口,将其和宿主机连接起来,利用宿主机中的串口软件(如 windows 中的超级终端或者 Linux中的 minicom )来控制。

Page 15: 第 10 章  Bootloader  设计基础

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

Page 16: 第 10 章  Bootloader  设计基础

vivi 文件结构代码包括 arch , init , lib , drivers 和 inclu

de 等几个目录,共 200 多条文件 vivi 的配置和编译① #make distclean 。清除一些早先生成的无

用的目标文件。② #make menuconfig 。然后可以根据菜单中

的信息进行配置。③ make” 命令开始编译

10.2.1 vivi

Page 17: 第 10 章  Bootloader  设计基础

10.2.1 vivi 3. vivi 的配置和编译 vivi 的配置和嵌入式 Linux内核一样,可以采用菜单化的形式进行。其步骤主要如下:

① #make distclean。清除一些早先生成的无用的目标文件。

② #make menuconfig。然后可以根据菜单中的信息进行配置。

编译。菜单配置完毕后,保存退出。然后执行“ make”命令开始编译。

Page 18: 第 10 章  Bootloader  设计基础

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

Page 19: 第 10 章  Bootloader  设计基础

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

Page 20: 第 10 章  Bootloader  设计基础

10.2.1 vivi 第一步: vivi 从 main()函数开始执行,函数开始通过 putstr(vivi_bannner)打印出 vivi 的版本。

第二步:主要是初始化 GPIO ,本的思路和方法就是在把握好整个系统硬件资源的前提下,根据芯片的数据手册把所有的初始值设定,在这里利用 set_gpios这个函数就可以完成初始化了。

Page 21: 第 10 章  Bootloader  设计基础

10.2.1 vivi 第三步:进行内存映射初始化和内存管理单元( MMU )的初始化工作

第四步:初始化堆,然后内存会发生变化。在这里,实际上就是实现动态内存分配策略。

Page 22: 第 10 章  Bootloader  设计基础

10.2.1 vivi 第五步:初始化 mtd 设备 第六步:配置参数,主要是 init_priv_d

ata函数。 第七步:提供 vivi人机接口的各种命令。

第八步:进入 Bootloader 的两种模式之

一 .

Page 23: 第 10 章  Bootloader  设计基础

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 的一层含义。

Page 24: 第 10 章  Bootloader  设计基础

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 、键盘等;  ⑦ 较为丰富的开发调试文档与强大的网络技术支持;

Page 25: 第 10 章  Bootloader  设计基础

10.2.2 U-boot 常用命令 :Help/ ? Bdinfo setenv print

env saveenv mw md mm flin foerase[起始地址 结束地址 ]. cp[源地址 目标地址大小 ] imi[起始地址 ] bootm[起始地址 ] tftboot[起始地址 镜像名 ] reset

Page 26: 第 10 章  Bootloader  设计基础

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驱动及中断初始化等文件;

Page 27: 第 10 章  Bootloader  设计基础

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相关的资源的配置参数 , 我们往往只需修改这个文件就可以配置目标板的参数 , 如波特率、引导参数、物理内存映射等。

Page 28: 第 10 章  Bootloader  设计基础

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镜像文件的工具;

Page 29: 第 10 章  Bootloader  设计基础

10.3 其他常见的 Bootloader 1. WinCE的 Bootloader Nboot 和 Eboot 是WinCE的 Bootloade

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

Page 30: 第 10 章  Bootloader  设计基础

Eboot 提供的命令   命 令

      说 明

Help 列出所有支持的命令并加以说明Eboot 从宿主机上通过网线下载 CE映像并加载Write 向某一内存地址写入数据Read 显示某一内存地址的数据Jump 跳转到某一地址执行程序Xmodem 从计算机的超级终端接收以 Xmodem协议传送的文件Toy 测试平台 CPU的计数器是否运转Flash 擦除或者更新 Flash中的数据Tlbread 显示 CPU的所有 TLB表Tlbwrit 设置 CPU的 TLB

Macaddr 设置 CPU的MAC地址Seti 设置平台的 IP地址

Page 31: 第 10 章  Bootloader  设计基础

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

Page 32: 第 10 章  Bootloader  设计基础

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

Page 33: 第 10 章  Bootloader  设计基础

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