原文:
Booting ARM Linux作者:Russell King
首稿:2002年5月18日
校正:1 - 2004年9月17日 | 2 - 2004年9月30日
翻译:Yamir
为了启动ARM Linux,你需要在内核之前运行一个引导程序(Boot loader).Boot loader的作用是初始化各种设备,调用Linux内核并给内核传递相关的消息。一般来说,一个最小的Boot loader应该会完成以下几个功能:
1. 设置和初始化RAM
2. 初始化一个串口
3. 检测机器类型
4. 设置内核启动参数列表
5. 调用内核映像
1. 设置和初始化RAM
已存在Bootloader: 强制
新的Bootloader : 强制
Boot loader要检测并且初始化所有的随机存取储存器,内核将用来存储系统中的可变数据。这个过程对机器有依赖性。(它可能使用内部的算法来找到和估量的RAM的大小,也可能使用机器内RAM的信息,或者任何其他Boot loader设计者认为合适的方法)。
2. 初始化一个串口
已存在Boot loader: 可选,推荐
新的Boot loader : 可选,推荐
Boot loader应该在目标机上初始化和启用一个串行端口。这样内核的串行设备驱动能自动检测出一个串行端口做为内核的控制台使用(一般被用来调试或者与目标机通信)。
额外地,Boot loader能通过启动参数列表指定端口,将相关的 'console=' 选项传递给内核。串行设备选项的详细描述在linux/Documentation/kernel-parameters.txt。
3. 检测机器类型
已存在Boot loader: 可选
新的Boot loader : 强制
Boot loader应该在运行过程会通过一些方法来检测机器类型。无论检测连接硬件的对象是一个硬编码还是一些算法,它们都包含在下边文档中。Boot loader最后必须能提供一个MACH_TYPE_xxx的变量给内核。(参见linux/arch/arm/tools/mach-types).
4. 设置内核启动参数列表
已存在Bootloader: 可选,强烈推荐
新的Bootloader : 强制
Boot loader必须创建和初始化内核的启动参数列表。一个正确的启动参数列表从ATAG_CORE开始,到ATAG_NONE结束。ATAG_CORE参数可以是空的,也可以不是。一个空的ATAG_CORE参数大小被设置为'2'(0x00000002)。ATAG_NONE参数必须将其中"size"值设置为0。
任何数量的标记参数都能放在列表中。一个重复的标记是否包括上一个相同标记的信息或者全部替代都是不确定的,有些使用前者,有些使用后者。
Boot loader必须传递一个至少包含系统内存的尺寸和位置,以及根文件系统位置的信息。因此,最小的启动参数列表应该是这样:
+------------------+ <- 基部
| ATAG_CORE | |
+------------------+ |
| ATAG_MEM | | 增加地址
+------------------+ |
| ATAG_NONE| |
+------------------+ v
启动参数列表应该被存储在系统的RAM中。
启动参数列表被放置在一段内存区域中,这段内存区域在内核解压和'bootp'程序可以覆盖的区域之外。推荐放置在内存起始的16KiB(1k=1024)中。
5. 调用内核映像
已存在Bootloader: 强制
新的Bootloader : 强制
有两个方法调用内核的zImage映像。如果zImage映像被存储在闪存中,并且能直接从闪存中链接来运行,那么Boot loader直接调用内核映像是合法的。
zImage映像也有可能被放置在系统的RAM中(有可能在任何位置)来被调用。注意内核使用映像下边的16K RAM来存储页表。推荐使用RAM的32KiB的位置。
无论如何,以下的条件必须满足:
CPU的寄存器设置
r0 = 0
r1 = 第三节中检测到的机器类型
r2 = 启动参数列表在系统RAM中的物理地址
CPU模式
禁用所有形式的中断(IRQs和FIQs)。
CPU必须运行在超级用户(SVC)模式中。(对于Angel有一个特别的例外)
存储区和内存管理单元(Caches, MMUs)
内存管理单元必须关闭。
指令Cache可以打开也可以关闭。
数据Cache必须关闭,并且不含有任何过时或失效的数据。
设备
始于或到达设备的DMA应该被沉默(quiesced)。
注:"quiesce"意为使计算机在可用的情况下减速以节省能源。
Boot loader要通过直接跳入内核映像第一条指令的方式调用内核。