原版:http://www.arm.linux.org.uk/developer/booting.php
Author: Russell KingInitial date: May 18, 2002
Revision: 1 - 17 September 20042 - 30 September 2004
为了启动ARM Linux,首先,你需要一个bootloader,它是一个很小的程序(在内核运行之前启动)。bootloader的第一阶段作用就是初始化各种硬件设备,最后,就是调用内核,并且将第一阶段的各种参数传递给内核。
本质上将,bootloader程序应提供(最小限度)如下几个方面:
1、设置和初始化化RAM
2、初始化一个串口
3、检测机器类型
4、设置内核启动需要的标记列表
5、调用内核镜像
1、设置和初始化RAM
现有的bootloader:强制性的(必须的)
新的bootloader:强制性的(必须的)
bootloader被用来去找到并初始化所有内核将用于非易失性数据存储系统中使用的内存。它完成那些动作都是在机器依赖的方式下完成的。(它可能采用内部算法来自动定位和分类所有的RAM,或者它可能采用特定机器的RAM的相关知识,或者任何其它的、设计者认为合适的方法)。
2、初始化一个串口
现有的bootloader:可选的,推荐使用的
新的bootloader:可选的,推荐使用的
bootloader在这个过程应该以初始化、使能一个串口设备为目标。这使得内核的串行驱动程序自动检测哪一个串口应该被用来作为内核的控制台。(一般用于调试或者通信的目的)。
可供选择的,通过特定的串口标记列表,bootloader可以向内核传递诸如“console=”相关的参数,还可以传递一些串口格式的参数,比如在linux/Documentation/kernel-parameters.txt中描述的。
3、检测机器ID
现有的bootloader:可选的
新的bootloader:强制性的(必须的)
bootloader必须创建和初始化内核标记列表。一个有效的标记列表开始于ATAG_CORE这个标记,结束于ATAG_NONE,ATAG_CORE可能会是空的,或者也可能不是。一个空ATAG_CORE标记的大小被设置为'2' (0x00000002),ATAG_NONE这个标记的大小必须设置为0。
任何号码的标记都可以放置在这个标记列表中。但是,重复的标记是否附加到前面的标记所携带的信息中,或者它是否会取代完整的信息,这些都是不确定的。
The boot loader must pass at a minimum the size and location ofthe system memory, and root filesystem location,因此,最小的标记列表如下:
+-----------+ base -> | ATAG_CORE | | +-----------+ | | ATAG_MEM | | increasing address +-----------+ | | ATAG_NONE | | +-----------+ v这个标记列表应该存放在系统的RAM中。
这个标记列表必须放置在一块内存区中,这块内存区内核既不能解压,临时的文件系统也不能覆盖它。一般推荐的这个内存位置为RAM的第一个16KB大小处。
5、调用内核镜像
现有的bootloader:强制性的(必须的)
新的bootloader:强制性的(必须的)
bootloader在调用内核的时候提供了连个选项。如果zImage镜像存储在Flash中,并且它被正确的链接为从Flash中启动,那么,bootloader直接从Flash调用zImage就是合法的(有效的)。
zImage还可能放置在系统的RAM(RAM的任何位置)中,并且在那里被调用。请注意,内核使用内核镜像下的16KB RAM来存放页表。所以,这个页表推荐放置在RAM的第32KB处。
在上述的两种情况下,必须满足以下条件:
●CPU 寄存器设置
★ r0=0;
★ r1=机器ID(上述第三步中发现的)
★ r2=标记列表在RAM的物理地址
●CPU 模式
★ 所有的中断必须禁用
★ CPU必须设置为SVC模式(操作系统保护模式),
● 高速缓存、MMUs
★ 关MMU(内存映射)
★指令缓存可以设为开或者关
★ 必须关数据缓存,并且其中不能含有“脏数据”
● 设备
★ 不响应DMA设备
● bootloader通过直接跳转到内核镜像的第一条指令来最终实现内核的调用。
上一篇:ARM初始化程序分析
下一篇:ARM-Thumb 过程调用标准
推荐阅读最新更新时间:2024-03-16 15:02