在嵌入式系统中,BootLoader 是用来初始化硬件,加载内核,传递参数。因为嵌入式系统的硬件环境各不相同,所以嵌入式系统的
BootLoader 也各不相同,其中比较通用的是 U-Boot,它支持不同的体系结构,如 ARM,PowerPC,X86,MIPS 等。本文着重介
BootLoader 与内核之间参数传递这一基本功能。本文的硬件平台是基于 AT91RM9200 处理器系统,软件平台是 Linux-2.6.19.2 内核。
内核映像文件为 zImage。
1. 系统硬件平台简介
AT91RM9200 处理器,它是由 Atmel 公司基于 ARM920T 内核的微处理器,带有内存管理单元,CPU 时钟最高可达 240MHz,它具有丰
富的标准接口,EBI 接口,内部集成了静态存储控制器(SMC), SDRAM 控制器,Burst Flash 控制器。有关处理器的说明请参考
AT91RM9200 的数据手册。本系统 SDRAM(64MB)地址为:0x20000000, NorFlash(8MB)的地址为:0x10000000[1]。
2. BootLoader 设计和实现
内核源代码目录树下的 documentation/arm/booting[2]文档规定了基于 ARM 体系结构 BootLoader 的基本功能。本系统 BootLoader 除
了完成这些基本的功能外,还结合自身硬件的特点加入了代码搬运等功能。
BootLoader 的流程是:系统上电复位后,首先从 NorFlash 开始运行(由处理器 BMS 引脚连接决定),因为处理器此时的 0 地址就是
NorFlash 的首地址(0x10000000),BootLoader 就是被烧写在这个位置,AT91RM9200 处理器能够映射的地址范围只有 0x0000
0000—0x001f ffff。 BootLoader 执行的第一步就是将自身代码从 NorFlash 中搬运到处理器内部的 RAM 中(0x00200000),然后将 0
地址映射到内部 RAM,并且跳转到内部 RAM 的相应地址处继续执行。进入内部 RAM 后才进入真正的硬件初始化阶段,这个阶段初始化
的各种控制器都是内核所必须的,包括:PMC, EBI, SMC, SDRAM, USART 等。接着就是创建内核参数链表(Tagged list),创建完链表
就是搬运事先烧写在 NorFlash 中的内核映像和根文件系统映像到 SDRAM,根据内核对 BootLoader 的基本要求关闭中断,MMU 和数
据 Cache,并且配置 r0=0, r1=0x0000 00fb 或者 0x00000106(根据内核中 linux/arch/arm/tools/mach-types[2]
规定的机器编号),r2=0x20000100(BootLoader 传递给内核参数链表的物理地址),在 ARM 体系结构中,这个地址在同一种处理器
的机器描述符(machine_desc)中都是默认的,所以在这里可以不指定。最后 BootLoader 直接跳转到 SDRAM 的内核处执行。
3. 内核参数链表
BootLoader 可以通过两种方法传递参数给内核, 一种是旧的参数结构方式(parameter_struct),主要是 2.6 之前的内核使用的方式。
另外一种就是现在的 2.6 内核在用的参数链表 (tagged list) 方式。这些参数主要包括,系统的根设备标志,页面大小,内存的起始地址
和大小,RAMDISK 的起始地址和大小,压缩的 RAMDISK 根文件系统的起始地址和大小,内核命令参数等[3][4][5]。
内核参数链表的格式和说明可以从内核源代码目录树中的 include/asm-arm/setup.h[2]中找到,参数链表必须以 ATAG_CORE 开始,以
ATAG_NONE 结 束 。 这 里 的 ATAG_CORE , ATAG_NONE 是 各 个 参 数 的 标 记 , 本 身 是 一 个 32 位 值 , 例 如 :
ATAG_CORE=0x54410001。
其它的参数标记还包括: ATAG_MEM32 , ATAG_INITRD , ATAG_RAMDISK ,ATAG_COMDLINE 等。每个参数标记就代表一个参
数结构体,由各个参数结构体构成了参数链表。参数结构体的定义如下:
struct tag
{
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
评论1