当前位置:文档之家› bootloader移植

bootloader移植


简单地说,Boot Loader 就是在操作系统内核运行之前运行 的一段小程序。通过这段小程序,我们可以初始化硬件设备 、建立内存空间的映射图,从而将系统的软硬件环境带到一 个合适的状态,以便为最终调用操作系统内核准备好正确的 环境。
通常,Boot Loader 是严重地依赖于硬件而实现的,特别是 在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。
TM

西南林学院计算机系 贺金平
19
19
2、stage2阶段(续)

(3)、将kernel和根文件系统映像从flash上读到RAM空间中 。 •由于像 ARM 这样的嵌入式 CPU 通常都是在统一的内存地 址空间中寻址 Flash 等固态存储设备的,因此从 Flash 上 读取数据与从 RAM 单元中读取数据并没有什么不同。这一 步骤包括两部分内容:规划kernel和根文件系统所占用的内 存范围和将它们从flash上进行拷贝。
TM
12
12
2、下载(Downloading)模式

像RedBoot或U-Boot等功能强大的Bootloader通常都可同 时支持这两种工作模式,而且允许用户在这两种工作模式之 间进行切换。 比如,RedBoot在启动时处于正常的启动加载模式,但是 它会延时3秒等待终端用户按下任意键而将RedBoot切换到 下载模式。如在等待时间内没有接收到用户按键,则继续启 动 Linux 内核。

西南林学院计算机系 贺金平
TM
20
20
2、stage2阶段(续)

(4)、为kernel设置启动参数。 •这是在调用内核之前应该做的准备工作。Linux 2.4.x 以后 的内核都期望以标记列表(tagged list)的形式来传递启动参 数。启动参数标记列表以标记 ATAG_CORE 开始,以标记 ATAG_NONE 结束。在嵌入式 Linux 系统中,通常需要由 Boot Loader 设置的常见启动参数有:ATAG_CORE、 ATAG_MEM(内存映射)、ATAG_NONE等。

启动加载模式称为“自举”(Autonomous)模式 。即Bootloader从目标机上的某个固态存储设备上 将操作系统加载到 RAM 中运行,整个过程并没有 用户的介入。 启动加载模式是 Bootloader的正常工作模式,在 嵌入式产品发布的时侯,Bootloader必须工作在这 种模式下。


西南林学院计算机系 贺金平
TM
18
18
2、stage2阶段(续)

(2)、检测系统内存映射(memory map)。 •所谓内存映射就是指在整个物理地址空间中有哪些地址范 围被分配用来作为寻址系统的 RAM 单元。虽然 CPU 通常 预留出一大段足够的地址空间给系统 RAM,但是在搭建具 体的嵌入式系统时却不一定会实现 CPU 预留的全部 RAM 地址空间。也就是说,具体的嵌入式系统往往只把 CPU 预 留的全部 RAM 地址空间中的一部分映射到 RAM 单元上, 而让剩下的那部分预留 RAM 地址空间处于未使用状态。 • 基于上述这个事实,因此 Boot Loader 的 stage2 必须在 它想干点什么 (比如,将存储在 flash 上的内核映像读到 RAM 空间中) 之前检测整个系统的内存映射情况,也即它 必须知道 CPU 预留的全部 RAM 地址空间中的哪些被真正 映射到 RAM 地址单元,哪些是处于 "unused" 状态的。
西南林学院计算机系 贺金平
TM
13
13
5.1.4 Bootloader的启动流程

Bootloader的启动通常可以分为stage1和stage2 两个阶段。
西南林学院计算机系 贺金平
TM
14
14
1、stage1阶段

stage1主要包含依赖于CPU的体系结构,比如设备初始化 代码等。通常都用汇编语言来实现。这个阶段的任务有:

西南林学院计算机系 贺金平
TM
6
6
Boot Loader 的安装媒介 (Installation Medium)

系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址 上取指令。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种 类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先 安排的地址上。因此在系统加电后,CPU 将首先执行 Boot Loader 程序。 下图就是一个同时装有 Boot Loader、内核的启动参数、内核映像和根文件系 统映像的固态存储设备的典型空间分配结构图。

大多数Bootloader都包含两种不同的操作模式:“ 启动加载”模式和“下载”模式,这种区别仅对于 开发人员才有意义。 •从最终用户的角度看,Bootloader的作用就是用 来加载操作系统,而并不存在所谓的启动加载模式 与下载工作模式的区别。

西南林学院计算机系 贺金平
TM
10
10
1、启动加载(Bootloading)模式
西南林学院计算机系 贺金平
TM
21
21
2、stage2阶段(续)

(5)、调用内核。

•Bootloader调用Linux kernel的方法是直接跳转到内核的 第一条指令处。在跳转时必须满足下列条件。
Bootloader通常固化在硬件上某个固态存储设备上 ,加电后自启动。 通过Bootloader这段代码,我们可以初始化硬件设 备、建立内存空间的映射图,从而将系统的软硬件 环境带到一个合适的状态,以便为最终调用操作系 统内核准备好正确的环境。


西南林学院计算机系 贺金平
TM
5
5
Bootloader介绍
第五章 bootloader移植
TM 版权所有 西南林学院计算机系 贺金平
1
主要内容

5.1 Bootloader




5.1.1 Bootloader介绍 5.1.2 Bootloader的种类 5.1.3 Bootloader的操作模式 5.1.4 Bootloader的启动流程 5.1.5 BootLoader 与主机之间的通信协议 5.1.6 关于串口
TM

西南林学院计算机系 贺金平
15
15
1、stage1阶段(续)

(2)、为stage2准备包括RAM空间。 •为了获得更快的执行速度,通常把 stage2 加载到 RAM 空 间中来执行,因此必须为加载 Boot Loader 的 stage2 准备 好一段可用的 RAM 空间范围。 •由于stage2通常是C语言执行代码,因此在考虑空间大小 时,除了stage2可执行映像的大小外,还必须把堆栈空间 也考虑进来。此外,空间大小最好是 memory page 大小( 通常是4KB)的倍数。一般而言,1M的RAM空间已经足够了 。具体的地址范围可以任意安排,但是,将stage2安排到 整个RAM空间的最顶1M是一种值得推荐的方法。此外,还 必须确保所安排的地址范围确实是可读写的RAM空间。

西南林学院计算机系 贺金平
TM
16
16
1、stage1阶段(续)

•为了后面的叙述方便,这里把RAM 空间范围的大小记为: stage2_size(字节),把起始地址和终止地址分别记为: stage2_start 和 stage2_end(这两个地址均以 4 字节边界 对齐)。因此,stage2_end=stage2_start+stage2_size 。 (3)、拷贝stage2到RAM空间。 •(4)、设置好堆栈。 •堆栈指针的设置是为了执行 C 语言代码作好准备。通常我 们可以把 sp 的值设置为(stage2_end-4),也即前面所提到 的1MB 的 RAM 空间的最顶端(堆栈向下生长)。 •(5)、跳转到stage2的C入口点。 在上述一切都就绪后,就可以跳转到 Boot Loader 的 stage2 去执行了。

•(1)、基本的硬件设备初始化。
•这是 Boot Loader 一开始就执行的操作,其目的是为 stage2 的执行以及随后kernel 的执行准备好一些基本的硬 件环境。 它通常包括以下步骤:屏蔽所有的中断(为中断提供服务通 常是操作系统设备驱动程序的责任,因此在Bootloader 的 执行全过程中可以不必响应任何中断。)、设置 CPU 的速 度和时钟频率、关闭处理器内部指令/数据cache(通常使用 内部指令和cache可以提高系统性能,但由于cache的使用 可能改变访问主存的数量、类型和时间,因此Bootloader 的执行通常不需要。)等。
西南林学院计算机系 贺金平
TM
11
11
2、下载(Downloading)模式

在这种模式下,目标机上的Bootloader将通过串口连接或 网络连接等通信手段从主机上下载文件。
比如:下载内核映像和根文件系统映像等。从主机下载的文 件通常首先被Bootloader保存到目标机的RAM中,然后再 被 Bootloader写到目标机上的FLASH 类固态存储设备中。

3、U-Boot
U-Boot(Universal Bootloader)是一款目前功能较为强 大的开源Bootloader程序,它支持多种处理器平台,包括 ARM、MIPS等。
西南林学院计算机系 贺金平
TM
8
8
其他Bootloader
相关主题