u-boot的其中过程

来源:互联网 发布:号码追逐软件 编辑:程序博客网 时间:2024/05/18 20:52

U-Boot启动过程可以分成两个阶段(stage)

下面是u-boot启动过程的流程图其中左右两部分分别是启动过程的两个阶段



第一阶段(stage 1):

依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:设置ARM进入SVC模式禁止IRQ和FIQ关闭看门狗、屏蔽所有中断设置时钟(FCLK,HCLK,PCLK)、清空I/D cache、清空TLB、禁止MMU和cache配置内存控制器、为搬运代码做准备、搬移uboot映像到RAM中(使用copy_loop实现)、分配堆栈、清空bss段(使用clbss_l实现)。

(1)具体设置与代码实现:

ü 设置ARM进入SVC模式、禁止IRQ和FIQ

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 模式 
U-Boot的启动过程(摘)要设置成SVC模式,则要将先关中断即将6位IRQ(中断),7位(快速中断)置位 

mrs r0,cpsr @将cpsr的值读到r0中

bic r0,r0,#0x1f @清除M0~M4

orr r0,r0,#0xd3 @禁止IRQ,FIQ中断,并将处理器置于管理模式(SVC32 mode)

msr cpsr,r0 @将r0的值返回到cpsr中

U-Boot的启动过程(摘)关闭看门狗、屏蔽所有中断

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)

ldr r0, =pWTCON

mov r1, #0x0

str r1, [r0]

mov r1, #0xffffffff ; all interrupt disabl

ldr r0, =INTMSK

str r1, [r0]

# if defined(CONFIG_S3C2410)

ldr r1, =0x3fff ;all sub interrupt disable

ldr r0, =INTSUBMSK

str r1, [r0]

# endif

对于S3C2440和S3C2410的WTCON寄存器的[0]控制允许或禁止看门狗定时器的复位输出功能,设置为“0”禁止复位功能。通过设置INTMSK,INTSUBMSK的所有中断位即可屏蔽所有中断。

U-Boot的启动过程(摘)设置CPU:清空I/D cache、清空TLB、禁止MMU和cache

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:

@初始化CACHES
mov r0, #0
mcr p15, 0, r0, c7, c7, 0
mcr p15, 0, r0, c8, c7, 0

对于ARM协处理器的知识,参考ARM920T Technical Reference Manual(Rev 1)说明文档解释如下:

MCR与MRC是对ARM处理器的协处理器进行操作的指令;

MCR p15,0,Rd,c7,c7,0的操作原型如下:

Invalidate ICache and DCache|SBZ|MCR p15,0,Rd,c7,c7,0

这指令是让ICache与DCache无效,其中ICache是指令缓存器,DCache是数据缓存器;对Rd的说明,SBZ(Should Be Zero),是使这个寄存器里所有的位都为0,所以第一句语句是mov r0, #0。

MCR p15,0,r0,c8,c7,0的操作原型如下:

Invalidate TLB(s)|SBZ|MCR p15,0,Rd,c8,c7,0

这条指令就是让TLB无效;也许读者会问,那什么是TLB呢?
TLB是Translation Lookaside Buffers的简称,即地址译码的动作,可翻译成“地址转换遍历缓存”。对这种机制感兴趣的读者可以到官方下载ARM920T Technical Reference Manual(Rev 1)的说明文档。
接下来我们来关闭MMU和CACHES


@关闭MMU和CACHES
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
mcr p15, 0, r0, c1, c0, 0

在ARM920T Technical Reference Manual(Rev 1)说明文档中,可以查到如下的信息:

MRC p15, 0, Rd, c1, c0, 0 ;读控制寄存器
MCR p15, 0, Rd, c1, c0, 0 ;写控制寄存器

第一条设置指令:0x00002300 = 10001100000000(B),第8,9,13位被清零,即S,R,V位被清零。经过查ARM920T说明文档可知:S,R位被清零,表示任何对MMU的访问操作都会产生域失败(domain fault)。V位被清零,表示Base location of exception registers的地址,从0x0开始。

第二条设置指令:0x00000087 = 10000111(B),第0,1,2,7位被清零。即M,A,C,B被清零,分别表示MMU Disabled、Data address alignment fault checking、Fault checking disabled、DCache disabled、Little-endian operation。当你按下重启键的时候,U-boot会检查CPU的存储类型,是大端存储还是小端存储,当第7位被设置为1,则为大端存储,当第8位被设置为0,则为小端存储。
第三条设置指令: 0x00000002 = 10(B),即第1位置1,表示又把相应的模式设置成了Data address alignment fault checking,Fault checking enabled状态。

第四条设置指令:0x00001000 = 1000000000000(B),即第12位置1,表示可以打开ICache,即打开指令缓存。然后mcrp15, 0, r0, c1, c0, 0就是把相应的位操作结果写到寄存器1中,使其生效。

注:对于第一阶段时钟初始化等在这儿不作讲解。

第二阶段(stage 2)通常用C语言来实现。

首先以start_armboot()函数为入口点,主要进行如下操作:

初始化(cpu, 板卡,中断,串口,控制台等),开启I/D cache。初始化FLASH,根据系统配置执行其他初始化操作。打印LOG,使能中断,获取环境变量,初始化网卡。最后进入main_loop()函数。在main_loop函数中会检查BOOTDELAY和BOOTCMD环境变量,如果BOOTCMD已经设置过,则在等待BOOTDELAY个毫秒后会自动执行BOOTCMD。如果等待过程中被用户中断(ctl+c)或者BOOTCMD没有设置,则会等待用户输入命令。

到此,U-boot就已经正常启动起来了,如果读者有进一步想了解U-Boot启动,可以结合源代码分析,本节将不作更具体的介绍了。

原创粉丝点击