bootloader的移植

上传人:千****8 文档编号:118604966 上传时间:2019-12-19 格式:PPT 页数:87 大小:493.50KB
返回 下载 相关 举报
bootloader的移植_第1页
第1页 / 共87页
bootloader的移植_第2页
第2页 / 共87页
bootloader的移植_第3页
第3页 / 共87页
bootloader的移植_第4页
第4页 / 共87页
bootloader的移植_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《bootloader的移植》由会员分享,可在线阅读,更多相关《bootloader的移植(87页珍藏版)》请在金锄头文库上搜索。

1、第10课 bootloader介绍(含VIVI),VIVI,课程内容介绍,PART I: Boot loader概述 PART II: VIVI PART III:VIVI基本命令介绍 PART IV:本章小结,PART I,Bootloader概述,1.1 Bootloader简介,引导加载程序(Bootloader)是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘MBR(master boot record)中的OS BootLoader(比如,LILO 和 GRUB 等)一起组成。BIOS

2、在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader 读到系统的RAM 中,然后将控制权交给 OS BootLoader。BootLoader的主要运行任务就是将内核映像从硬盘上读到RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。(用图来演示PC的启动过程),1.1 Bootloader简介,而在嵌入式系统中,通常并没有像BIOS 那样的固件程序(注:有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000 处开始执

3、行,而在这个地址处安排的通常就是系统的BootLoader程序。(演示通信系统的一般系统启动过程) 本节将从BootLoader的概念和启动过程来讨论嵌入式系统的BootLoader。,1.1 Bootloader简介,1.1.1 BootLoader的概念 简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的Boot

4、Loader几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的 BootLoader设计与实现。,1.1 Bootloader简介,1、BootLoader所支持的CPU和嵌入式单板 每种不同的CPU体系结构都有不同的BootLoader。有些BootLoader也支持多种体系结构的CPU,比如U-Boot就同时支持ARM、PPC和MIPS 等一系列体系结构。除了依赖于CPU的体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU构建的,要想让运行在一块板子上的

5、BootLoader程序也能运行在另一块板子上,通常也都需要修改BootLoader的源程序。,1.1 Bootloader简介,2、BootLoader的安装 系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令。比如,ARM系列CPU在复位后都从地址0x00000000取它的第一条指令。而嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被安排在这个起始地址上,因此在系统加电后,CPU将首先执行BootLoader程序。,1.1 Bootloader简介,一个同时装有 BootLoader、内核的启动参数、内核映像和根文件系统映像的固态

6、存储设备的典型空间分配结构图(这个图是Linux的典型配置,不同的系统配置可以不同):,1.1 Bootloader简介,3、用来控制BootLoader的设备或机制 串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在BootLoader中主机和目标机之间都通过串口建立连接,BootLoader程序在执行时通常会通过串口来进行I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。当然如果认为串口通讯速度不够,也可以采用网络或者USB通讯,那么相应的在BootLoader中就需要编写各自的驱动。,1.1 Bootloader简介,4、BootLoader的启动过程 BootLoade

7、r的启动过程分为单阶段(Single Stage)和多阶段(Multi-Stage)两种。通常多阶段的BootLoader能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的BootLoader大多都是2阶段的启动过程,也即启动过程可以分为 stage 1和 stage 2 两部分。至于在 stage 1 和 stage 2中具体完成哪些任务,将在下一小节中具体讨论。,1.1 Bootloader简介,5、BootLoader的操作模式 大多数 BootLoader都包含两种不同的操作模式:“启动加载”模式和“下载”模式。这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boo

8、tLoader的作用就是用来加载操作系统的,而并不存在所谓的启动加载模式与下载工作模式的区别。,1.1 Bootloader简介,启动加载(Boot loading)模式:这种模式也称为“自主”(Autonomous)模式。即BootLoader从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 BootLoader的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader显然必须工作在这种模式下。 下载(Downloading)模式:在这种模式下,目标机上的 BootLoader将通过串口连接或网络连接等通信手段从主机(Host)下载文

9、件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 BootLoader保存到目标机的 RAM 中,然后再被BootLoader写到目标机上的FLASH 类固态存储设备中。BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader的这种工作模式。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。,1.1 Bootloader简介,6、BootLoader与主机之间进行文件传输所用的通信设备及协议 最常见的情况就是,目标机上的 BootLoader通过串口与主机之间进行文件传输,传

10、输协议通常是 xmodemymodemzmodemkermit 协议中的一种。但是,串口传输的速度是有限的,因此通过以太网连接并借助 TFTP 协议来下载文件是个更好的选择。(问题:TFTP协议是在第几层?它是基于那一个协议的?) 此外,在论及这个话题时,主机方所用的软件也要考虑。比如,在通过以太网连接和 TFTP 协议来下载文件时,主机方必须有一个软件用来提供 TFTP 服务(tftpserver)。,1.1 Bootloader简介,1.1.2 BootLoader 的启动过程 BootLoader 的 stage1 通常包括以下步骤(以执行的先后顺序): 硬件设备初始化。 为加载 Boo

11、tLoader 的 stage2 准备 RAM 空间。 拷贝 BootLoader 的 stage2 到 RAM 空间中。 设置好堆栈。 跳转到 stage2 的 C 入口点。,1.1 Bootloader简介,BootLoader 的 stage2 通常包括以下步骤(以执行的先后顺序): 初始化本阶段要使用到的硬件设备(比如网络和串口)。 检测系统内存映射(memory map),得知内存的大小等信息。 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 为内核设置启动参数。(这个后面会讲) 调用内核。,1.1 Bootloader简介,1、BootLoader

12、的 stage1(通常用汇编来写) a)基本的硬件初始化 这是 BootLoader 一开始就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序): 屏蔽所有的中断。为中断提供服务通常是 OS 设备驱动程序的责任,因此在 BootLoader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。,1.1 Bootloader简介,设置 CPU 的速度和时钟频率。 RAM 初始化。包括正确地设置系统的内存控制器的功能寄存器以

13、及各内存库控制寄存器等。 初始化 LED。典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 BootLoader 的 Logo 字符信息来完成这一点。 关闭 CPU 内部指令数据 cache。,1.1 Bootloader简介,b)为加载 stage2 准备 RAM 空间 为了获得更快的执行速度,通常把 stage2 加载到 RAM 空间中来执行,因此必须为加载 BootLoader 的 stage2 准备好一段可用的 RAM 空间范围。 由于 stage2 通常是 C 语言执行代码,因

14、此在考虑空间大小时,除了 stage2 可执行映像的大小外,还必须把堆栈空间也考虑进来。此外,空间大小最好是 memory page 大小(通常是 4KB)的倍数。一般而言,1M 的 RAM 空间已经足够了。,1.1 Bootloader简介,另外,还必须确保所安排的地址范围的的确确是可读写的 RAM 空间,因此,必须对你所安排的地址范围进行测试。具体的测试方法可以采用类似于 blob 的方法,也即:以 memory page 为被测试单位,测试每个 memory page 开始的两个字是否是可读写的。为了后面叙述的方便,我们记这个检测算法为:test_mempage,其具体步骤如下: 先保存

15、 memory page 一开始两个字的内容。 向这两个字中写入任意的数字。比如:向第一个字写入 0x55,第 2 个字写入 0xaa。,1.1 Bootloader简介,然后,立即将这两个字的内容读回。显然,我们读到的内容应该分别是 0x55 和 0xaa。如果不是,则说明这个 memory page 所占据的地址范围不是一段有效的 RAM 空间。 再向这两个字中写入任意的数字。比如:向第一个字写入 0xaa,第 2 个字中写入 0x55。 然后,立即将这两个字的内容立即读回。显然,我们读到的内容应该分别是 0xaa 和 0x55。如果不是,则说明这个 memory page 所占据的地址范

16、围不是一段有效的 RAM 空间。 恢复这两个字的原始内容。测试完毕。 为了得到一段干净的 RAM 空间范围,我们也可以将所安排的 RAM 空间范围进行清零操作。,1.1 Bootloader简介,c)拷贝stage2到RAM中 拷贝时要确定两点:(1) stage2 的可执行映像在固态存储设备的存放起始地址和终止地址;(2) RAM 空间的起始地址。 d)设置堆栈指针sp 堆栈指针的设置是为了执行 C 语言代码作好准备。通常我们可以把 sp 的值设置为(stage2_end-4),也即在b)中所安排的那个 1MB 的 RAM 空间的最顶端(最大处)(堆栈向下生长)。 此外,在设置堆栈指针 sp 之前,也可以关闭 led 灯,以提示用户我们准备跳转到 stage2。,1.1 Bootloader简介,e)跳转到stage2的C入口点 在上述一切都就绪后,就可以跳转到 BootLoader 的 stage2 去执行了。比如,在 ARM 系统中,这可以通过修改 PC 寄存器为合适的地址来实现。,1.1 Bootloader简介,执行完Stage_1以后的内存情况:,1.1 Bootl

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 企业信息化/信息管理

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号