U-Boot的启动过程

参考1:

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

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

 U-Boot的启动过程(摘)

第一阶段(stage1):

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

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

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

CPSR 寄存器(和保存它的 SPSR寄存器)中的位分配如下:

  31 30 29 28  ---           0 

                 M4  M3 M2   M1  M0 

                                         User26 模式 

                                        FIQ26 模式 

                                        IRQ26 模式 

                                        SVC26 模式 

                                         User 模式 

                                        FIQ 模式 

                                        IRQ 模式 

                                   SVC 模式 

                                         ABT 模式 

                                        UND 模式 

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

 

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

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

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

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

 

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

#ifdefined(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]

# ifdefined(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/Dcache、清空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(Rev1)说明文档解释如下:

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

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

Invalidate ICache andDCache|SBZ|MCR p15,0,Rd,c7,c7,0

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

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

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

   这条指令就是让TLB无效;也许读者会问,那什么是TLB呢?
  TLB是TranslationLookasideBuffers的简称,即地址译码的动作,可翻译成“地址转换遍历缓存”。对这种机制感兴趣的读者可以到官方下载ARM920TTechnical 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 TechnicalReference 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的访问操作都会产生域失败(domainfault)。V位被清零,表示Base location of exceptionregisters的地址,从0x0开始。

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

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

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

 

 

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

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

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

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

参考2:

前面一段时间一直在移植U-Boot,Linux内核和构建根文件系统,其中有些地方还不是很明白,现在回过头来,理解一下U-boot的启动流程,以及u-Boot是如何加载引导内核启动的。这里的分析也都是以U-Boot-2009.08版本为基础的,可能会和以前的版本有所不同。在这里也不打算一句句分析U-Boot的源码,只是想把U-Boot一步一步怎么最终能够加载Linux内核的过程,分析一下。

  首先,我们应该理解Bootloader是什么?它有什么作用?其实它就是系统上电后运行的和小段程序。
1 BootLoader的概念
  在系统上电后,需要一段程序来进行初始化:关闭WATCHDOG,改变系统时钟,初始化存储控制器,将更多的代码复制到内存中。并将操作系统内核复制到内存中运行,这就段程序代码就叫做Bootloader。没有一个Bootloader完全支持所有CPU,所以我们要想使用Bootloaser一般情况下要自己进行修改,我们可以增强Bootloader的功能,让它具有网络功能,可以通过NFS远程下载Linux内核和根文件系统,可以烧写Linux内核和根文件系统到NandFlash中,而这些功能对于最终的用户来说是没有什么意义的,它们看到的只是Bootloader引导Linux内核启动这一个功能,而其余的功能只对开发人员很有用处。也就是说在开发期间这些功能是必不可少的。
(1)启动加载模式:这种模式也称为“自主”模式。也就是Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入,这种模式是在嵌入式产品发布里的通用模式。
(2)下载模式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件,例如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标上的Flash类的固态存储设备中,Bootloader的这种模式是在在开发时使用的工作于这种模式的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。
在嵌入式Linux系统中从软件的角度通常可以分为4个层次:
(1)引导加载程序,包括固化在固件中的boot代码(可选)和Bootloader两大部分。
   有些CPU在运行Bootloader之前运行一段固化的程序,比如x86结构的CPU就是先运行BIOS中的固件,然后才运行硬盘的第一个分区中的BootLoader。在大多数的嵌入式系统中并没有固件,Bootloader是上电后第一个执行的程序。
(2)Linux内核
    嵌入式定制的内核以及启动参数,启动参数可以是Bootloader传递给内核的,也可以是内核默认的。
(3)文件系统
  包括根文件系统和建立于Flash内存设备之上的文件系统。里面包括了Linux系统能够运行所必要的应用程序和库文件等。比如可以给用户提供操作Linux的控制shell程序。
(4)用户应用程序
特定于用户的应用程序,它们也存储在文件系统中,有时在用户应用程序和内核层之间可以还会包括一个嵌入式图形用户界面。
2. Bootloader启动的两个阶段
 从固态存储设备上启动的Bootloader大多都是两阶段的启动过程,第一阶段使用汇编来实现。它完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码,第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性。
(1) Bootloader第一阶段的功能
   1)硬件设备初始化
  2)为加载Bootloader的第二阶段准备RAM空间。
  3)复制Bootloader的第二阶段代码到RAM空间中。
   4)设置好栈
   5)跳转到第二阶段代码的C入口点。
在第一阶段进行的硬件初始化一般包括:关闭WATCHDOG,关中断,设置CPU的速度和时钟频率RAM初始化等。这些不都是必需的。
(2)Bootloader第二阶段的功能
   1)初始化本阶段要使用的硬件设备
   2)检测系统内存映射
  3)将内核映像和根文件系映象从Flash望到RAM空间中
   4)为内核设置启动参数
   5)调用内核
将内核存放在适当的位置后,直接跳到它的入口点即可调用内核,调用内核之前,下列条件要满足
(1)CPU寄存器的设置
  R0=0.
 R1=机器类型ID;对于ARM结构的CPU,其机器类型ID在linux/arch/arm/tools/mach-types
 R2=启动参数标记列表在RAM中起始基地址
(2)CPU工作模式
    必须禁止中断(IRQs和FIQs)
    CPU必须为SVC模式
(3)Cach和MMU的设置
    MMU必须关闭
     指令Cach可以打开也可以关闭
    数据Cach必须关闭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值