Bootloader简介

说明:只供学习交流

一,Bootloader的概念

系统上电之后,需要一段程序来进行初始化。比如:关闭WATCHDOG、改变系统时钟、初始化存储器控制器、将更多的代码复制到内存中等。如果它能将操作系统内核复制到内存中运行,无论从本地(比如Flash)还是从远端(比如通过网络),就称这段程序为Bootloader。简单地说,Bootloader就是那么一小段程序,它在系统上电时开始执行,,初始化硬件设备、准备好软件环境,最后调用操作系统内核。

二,Bootloader的启动方式

CPU上电后会从某个地址开始执行。比如MIPS结构的CPU会从0xBFC00000取第一条指令,而ARM结构的CPU则从0x00000000开始。在嵌入式开发板中,需要把存储器件ROMFlash等映射到这个地址,Bootloader就存放在这个地址开始处,这样一上电就可以执行。

Bootloader一般分为两种启动模式分别为:

1)启动加载(Boot loading)模式

上电后,Bootloader从板子上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。产品发布时,Bootloader就工作在这种模式下。

2)下载(Downloading)模式

这种模式下只对开发人员有意义,开发人员可以使用各种命令,通过串口或网络连接等通信手段从主机(Host)下载文件(比如内核映像、文件系统映像),将它们直接放在内存运行或烧入Flash类固态存储设备中。

三,Bootloader的结构

嵌入式Linux系统从软件的角度通常可以分为以下4个层次:

1)、引导加载程序,包括固化在固件(firmware)中boot代码(可选)和Bootloader两大部分。

有些CPU在运行Bootloader之前先运行一段固化的程序(固件,firmware),比如X86结构的CPU就是先运行BIOS中的固件,然后才运行硬盘第一个分区(MBR)中的Bootloader。在大多数嵌入式系统中并没有固件,Bootloader是上电后执行的第一个程序。

2Linux内核

特定于嵌入式板子的定制内核以及内核的启动参数。内核的启动参数可以是内核默认的,或是由Bootloader传递给它的。

3)文件系统

包括根文件系统和建立于Flash内存设备之上的文件系统。里面包含了Linux系统能够运行所必需的应用程序、库等,比如可以给用户提供操作Linux的控制界面的Shell程序、动态连接的程序运行时需要的glibcuClibc库等。

4)用户应用程序

特定于用户的应用程序,它们也存储在文件系统中。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。

显然,在嵌入式系统的固态存储设备上有相应的分区来存储它们,下图所示为一个典型的分区结构:

Bootparameters”分区中存放一些可设置的参数,比如IP地址、串口波特率、要传递给内核的命令行参数等

四,Bootloader的启动

Bootloader的启动过程可以分为单阶段多阶段两种。通常多阶段的Bootloader能提供更为复杂的功能以及更好的可移植性。从固态存储设备上启动的Bootloader大多都是两阶段的启动过程。第一阶段使用汇编来实现,它完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码;第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性。

一般而言,这两个阶段完成的功能可以如下分类:

1Bootloader第一阶段的功能

*硬件设备初始化。

*为加载Bootloader的第二阶段代码准备RAM空间。

*复杂Bootloader的第二阶段代码到RAM空间中。

*设置好栈。

*跳转到第二阶段代码的C入口点。

在第一阶段进行硬件的初始化一般包括:关闭WATCHDOG、关中断、设置CPU的速度和时钟频率、RAM初始化等。这些并不都是必需的,比如S3C2410/S3C2440的开发板所使用的U-boot中,就将CPU的速度和时钟频率的设置放在第二阶段。甚至,将第二阶段的代码复制到RAM空间中也不是必需的,对于NOR Flash等存储设备,完全可以在上面直接执行代码,只不过相比在RAM中执行效率大为降低。

2Bootloader第二阶段功能

*初始化本阶段要使用到的硬件设备。

*检测系统内存映射。

*将内核映像和根文件系统映像从Flash上读到RAM空间中。

*为内核设置启动参数。

*调用内核。

所谓检测内存映射,就是确定板上使用了多少内存、它们的地址空间是什么。由于嵌入式开发中Bootloader多是针对某类板子进行编写,可以根据板子的情况直接设置,不需要考虑可以适用于个类情况的复制算法。

Flash上的内核映像有可能是经过压缩的,在读到RAM之后,还需要进行解压。当然对于有自解压功能的内核,不需要Bootloader来解压。

将文件系统映像复制到RAM中,这不是必需的。这取决于是什么类型的根文件系统,以及内核访问它的方法。

将内核存放在适当的位置后,之间跳到它的入口点即可调用内核。在调用内核之前,下列条件要满足:

1)、CPU寄存器的设置: R0 = 0 R1=机器类型ID;对于ARM结构的CPU,其机器类型ID可以参见linux/arch/arm/tools/mach-types R2=启动参数标记列表在RAM中起始基地址。

2)、CPU工作模式:必须禁止中断(IRQSFIQS)。CPU必须为SVC模式。

3)、CacheMMU的设置:MMU必须关闭。指令Cache可以打开也可以关闭。数据Cache必须关闭。

(五)Bootloader与内核的交互

Bootloader与内核的交互是单向的,Bootloader将各类参数传递给内核。由于他们不能同时运行,传递办法只有一个:Bootloader将参数放在某个约定的地方之后,在启动内核,内核启动后从这个地方获得参数。除了约定好参数存放的地址外,还有规定参数的结构。Linux 2.4.x以后的内核都期望以标记列表(tagged list)的形式来传递启动参数。标记,就是一种数据结构;标记列表,就是挨着存放的多个标记。标记列表以ATAG_CORE开始,以标记ATAG_NONE结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值