参考1:
U-Boot启动过程可以分成两个阶段(stage)
下面是u-boot启动过程的流程图其中左右两部分分别是启动过程的两个阶段
第一阶段(stage1):
依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:设置ARM进入SVC模式、禁止IRQ和FIQ、关闭看门狗、屏蔽所有中断。设置时钟(FCLK,HCLK,PCLK)、清空I/Dcache、清空TLB、禁止MMU和cache、配置内存控制器、为搬运代码做准备、搬移uboot映像到RAM中(使用copy_loop实现)、分配堆栈、清空bss段(使用clbss_l实现)。
(1)具体设置与代码实现:
ü
CPSR 寄存器(和保存它的 SPSR寄存器)中的位分配如下:
31 30 29 28 --- 7 6 - 4 3 2 1 0
N Z C V I F M4 M3 M2 M1 M0
0 0 0 0 0 User26 模式
0 0 0 0 1 FIQ26 模式
0 0 0 1 0 IRQ26 模式
0 0 0 1 1 SVC26 模式
1 0 0 0 0 User 模式
1 0 0 0 1 FIQ 模式
1 0 0 1 0 IRQ 模式
1 1 1 0 0 1 1 SVC 模式
1 0 1 1 1 ABT 模式
1 1 0 1 1 UND 模式
要设置成SVC模式,则要将先关中断即将6位IRQ(中断),7位(快速中断)置位;
|
关闭看门狗、屏蔽所有中断
#ifdefined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) # ifdefined(CONFIG_S3C2410) # endif |
对于S3C2440和S3C2410的WTCON寄存器的[0]控制允许或禁止看门狗定时器的复位输出功能,设置为“0”禁止复位功能。通过设置INTMSK,INTSUBMSK的所有中断位即可屏蔽所有中断。
#ifndef CONFIG_SKIP_LOWLEVEL_INIT |
MCR与MRC是对ARM处理器的协处理器进行操作的指令;
Invalidate ICache andDCache|SBZ|MCR p15,0,Rd,c7,c7,0 |
MCRp15,0,r0,c8,c7,0的操作原型如下:
InvalidateTLB(s)|SBZ|MCR p15,0,Rd,c8,c7,0 |
|
在ARM920T TechnicalReference Manual(Rev 1)说明文档中,可以查到如下的信息:
|
注:对于第一阶段时钟初始化等在这儿不作讲解。
第二阶段(stage2)通常用C语言来实现。
首先以start_armboot()函数为入口点,主要进行如下操作:
参考2:
前面一段时间一直在移植U-Boot,Linux内核和构建根文件系统,其中有些地方还不是很明白,现在回过头来,理解一下U-boot的启动流程,以及u-Boot是如何加载引导内核启动的。这里的分析也都是以U-Boot-2009.08版本为基础的,可能会和以前的版本有所不同。在这里也不打算一句句分析U-Boot的源码,只是想把U-Boot一步一步怎么最终能够加载Linux内核的过程,分析一下。
(1)启动加载模式:这种模式也称为“自主”模式。也就是Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入,这种模式是在嵌入式产品发布里的通用模式。
(2)下载模式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件,例如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标上的Flash类的固态存储设备中,Bootloader的这种模式是在在开发时使用的工作于这种模式的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。
在嵌入式Linux系统中从软件的角度通常可以分为4个层次:
(1)引导加载程序,包括固化在固件中的boot代码(可选)和Bootloader两大部分。
(2)Linux内核
(3)文件系统
(4)用户应用程序
特定于用户的应用程序,它们也存储在文件系统中,有时在用户应用程序和内核层之间可以还会包括一个嵌入式图形用户界面。
2. Bootloader启动的两个阶段
(1) Bootloader第一阶段的功能
在第一阶段进行的硬件初始化一般包括:关闭WATCHDOG,关中断,设置CPU的速度和时钟频率RAM初始化等。这些不都是必需的。
(2)Bootloader第二阶段的功能
将内核存放在适当的位置后,直接跳到它的入口点即可调用内核,调用内核之前,下列条件要满足
(1)CPU寄存器的设置
(2)CPU工作模式
(3)Cach和MMU的设置