引言:本文简明扼要的介绍了嵌入式Linux的引导过程,X86体系的引导过程以及几种常见嵌入式处理器的引导过程,U-Boot的移植的基本步骤、常用命令如何使用。通过本文可以对嵌入式Linux的引导从概念到实际操作有一个总体清晰的认识
1.启动顺序
1.1 Bootloader
Bootloader(引导加载程序)本质上是一小段程序,其基本功能在于:
基本的硬件初始化
从闪存存储,网络或其他类型的非易失性存储中加载应用程序二进制文件(通常是操作系统内核)。
可能会对应用程序二进制文件进行解压缩
执行申请
除此基本功能之外,大多数Bootloader(引导加载程序)实现了Shell命令集以执行不同操作。
从存储或网络中加载数据,内存检查,硬件诊断和测试等
1.2 基于BIOS-X86的引导
x86处理器通常安装在在一块包含BIOS程序的非易失性存储器主板上。
在基于BIOS的旧x86平台上:BIOS负责基本的硬件初始化和从非易失性存储中加载一小段代码。
这段代码通常是第一阶段的引导程序bootloader,它将加载完整的引导程序bootloader本身。
bootloader可以解析文件系统,因此内核映象可以直接从普通文件系统中加载。
此顺序与现代基于EFI的系统不同。
用于X86体系Linux的bootloader常用的有以下两种:
GNU GRUB(GRand UnifiedBootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
在X86架构的机器中,Linux、BSD 或其它Unix类的操作系统中GRUB、LILO 是大家最为常用,应该说是主流。
详细信息请参考:http://www.gnu.org/software/grub/
syslinux是一个功能强大的引导加载程序,而且兼容各种介质。它的目的是简化首次安装Linux的时间,并建立修护或其它特殊用途的启动盘。它的安装很简单,一旦安装syslinux好之后,sysLinux启动盘就可以引导各种基于DOS的工具,以及MS-DOS/Windows或者任何其它操作系统。不仅支持采用BIOS结构的主板,而且从6.0版也开始支持采用EFI结构的新型主板。
Syslinux常被用于自网络或者可移动存储介质(如USB/CD-ROM)引导 Linux
详细信息请参考:https://kernel.org/pub/linux/utils/boot/syslinux/
1.3 嵌入式CPU的引导
Case 1:CPU内部无引导代码
CPU上电后,CPU开始在固定地址入口执行代码
CPU没有提供其他引导机制
硬件设计必须确保已连接存储芯片(如NOR闪存芯片)这样就可以在CPU启动的地址访问它并执行指令
第一级引导程序必须在此地址编程在该存储芯片中(如NOR)
NOR是强制性的,因为它允许随机访问,NAND不允许
注:这种方案已不常用,因为需要NOR FLASH
Case2:CPU内具有引导代码
CPU在ROM中具有集成的引导代码。如:AT91 CPU上的BootROM,OMAP上的“ ROM代码”,等等。具体细节取决于CPU体系结构
此引导代码能够将第一级引导加载程序从存储设备加载到内部SRAM(因为DRAM尚未初始化)。 存储设备通常可以是:MMC,NAND,SPI闪存,UART(通过串行线传输数据)等等。
第一阶段的引导程序: 由于硬件限制,尺寸有限(SRAM比较贵), 由CPU供应商或社区项目提供
此第一阶段引导程序必须初始化DRAM和其他硬件设备,并将第二阶段的引导程序加载到RAM
因为本文专注嵌入式领域,故接下来将描述几种常见的嵌入式处理器的引导过程。