嵌入式linux(Bootloader)

2019-07-12 14:31发布

嵌入式系统层次

一个嵌入式系统从软件角度来看分为三个层次:
1、引导加载程序
包括固化在固件(firmware)中的boot 程序(可选),和BootLoader 两大部分。
2.、Linux 内核
特定于嵌入式平台的定制内核。
3.、文件系统
包括了系统命令和应用程序。 一个同时装有BootLoader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图: 这里写图片描述

PC中的BIOS

PC机中的引导加载程序由BIOS(其本质是一段固件程序)和GRUB或LILO一起组成。BIOS在完成硬件检测和资源分配后,将硬盘中的引导程序读到系统内存中然后将控制权交给引导程序。引导程序的主要任务是将内核从硬盘上读到内存中,然后跳转到内核的入口点去运行,即启动操作系统。

Bootloader

在嵌入式系统中,通常没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM的嵌入式系统中,系统在上电或复位时都从地址0x00000000开始执行。而在这个地址处安排的通常就是系统的BootLoader程序。 简单地说,BootLoader就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。

移植

每种不同的CPU体系结构都有不同的BootLoader。除了依赖于CPU的体系结构外,BootLoader 还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片的类型等。这也就是说,对于两块不同的开发板而言,即使它们是基于同一种CPU而构建的,但如果他们的硬件资源或配置不一致的话,要想在一块开发板上运行的BootLoader程序也能在另一块板子上运行,还是需要作修改。

BootLoader 的启动过程

BootLoader 的启动过程可分为单阶段(Single-Stage)和多阶段(Multi-Stage)两种,通常多阶段的BootLoader 具有更复杂的功能,更好的可移植性。从固态存储设备上启动的BootLoader 大多采用两阶段,即启动过程可以分为stage 1和stage2:stage1完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转到stage2。 BootLoader 的stage1 通常包括以下步骤:
·硬件设备初始化
·为加载BootLoader 的stage2 准备RAM 空间
·拷贝BootLoader 的stage2 到RAM 空间中
·设置好堆栈
·跳转到stage2 的C 入口点
BootLoader 的stage2 通常包括以下步骤:
·初始化本阶段要使用到的硬件设备
·将内核映像和根文件系统映像从flash 上读到RAM 中
·调用内核
这里写图片描述