1、Bootloader的启动方式
①启动加载(Boot loading)模式;②下载(Downloading)模式
2、Bootloader的结构和启动过程
2.1 结构
嵌入式Linux的四个层次:
①引导加载程序:boot代码(可选,如i386的BIOS)、Bootloader两大部分;
②Linux内核:特定于嵌入式板子的定制内核及其启动参数;内核启动参数可以是内核默认的或是由Bootloader传递给内核的;
③文件系统:包括根文件系统和建立于Flash内存设备之上的文件系统。包含了linux系统能够运行所必需的应用程序、库等;
④用户应用程序:特定于用户的应用程序,也存储在文件系统中。
如下图为典型嵌入式linux系统中文件分区结构:
图1:典型嵌入式linux系统文件分区结构
“Boot parameters”分区存放一些可设置参数,正常启动过程中,Bootloader首先运行,然后将内核复制到内存中(也有些内核直接在固态存储设备中运行),并在内核中某个固定的地址设置好要传递给内核的参数,最后运行内核。内核启动后,它会挂载(mount)根文件系统Root filesystem,启动文件系统中的应用程序。
2.2、Bootloader的两个阶段
①Bootloader第一阶段功能:
※ 硬件设备初始化:关WATCHDOG、关中断、设置CPU的速度和时钟频率、RAM初始化等(并不都是必须的,可放置在第二阶段);
※ 为加载Bootloader的第二阶段代码准备RAM空间;
※ 复制Bootloader的第二阶段代码到RAM空间(不是必须的);
※ 设置好栈;
※ 跳转到第二阶段代码的C入口点。
②Bootloader第二阶段功能:※ 初始化本阶段要用到硬件设备;
※ 检测系统内存映像(memory map);
※ 将内核映像和根文件系统映像从Flash上读到RAM空间;
※ 为内核设置启动参数;
※ 调用内核
调用内核之前,必须满足下列条件:
①CPU寄存器设置:
※ R0=0;
※ R1=及其类型ID;可参见linux/arch/arm/tools/mach-types
※ R2=启动参数标志列表在RAM中的起始地址;
②CPU工作模式:
※ 必须禁止中断
※ CPU必须为SVC模式
③Cache和MMU设置:
※ MMU必须关闭
※ 指令Cache可以打开也可以关闭
※ 数据Cache必须关闭
3、Bootloader与内核交互
传递方法:Bootloader将参数放在某个约定的地方之后,再启动内核,内核启动后从这个地方获得参数。
标志列表:数据结构tag。