目标板:2440开发板

  u-boot启动的第一阶段是在文件start.S中完成的,这个过程对不同硬件平台的设置是不同的。下面进入start.S  

 _start: b reset //跳转到reset

  //设置CPU为SVC32安全管理模式

    reset:
  /*
  * set the cpu to SVC32 mode
  */
  mrs    r0,cpsr
  bic    r0,r0,#0x1f
  orr    r0,r0,#0xd3
  msr    cpsr,r0

  //关闭看门狗

    #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
    ldr r0, =pWTCON
    mov r1, #0x0
    str r1, [r0]

  //屏蔽中断

    /*
    * mask all IRQs by setting all bits in the INTMR - default
    */
    mov    r1, #0xffffffff
    ldr    r0, =INTMSK
    str    r1, [r0] 
 

   //初始化内存

    #ifndef CONFIG_SKIP_LOWLEVEL_INIT
    adr    r0, _start        /* r0 <- current position of code   */
    /*将_start的值赋给r0,如果_start的地址为0x33F80000,则说明内存已经被初始化,准备从0x33F80000运行程序
    如果_start的值为0,则说明程序还没开始执行,内存没有被初始化*/
    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
    //将链接地址_TEXT_BASE,给r1
    cmp     r0, r1                  /* don't reloc during debug         */
    /*cmp = 0时,则r0 = r1,那么程序已经把SDRAM初始化了*/
    blne    cpu_init_crit
    /* 当r0和r1不相等时,跳转到cpu_init_crit*/
    #endif
    

 /*查找cpu_init_crit*/

    cpu_init_crit:
    /*
     * flush v4 I/D caches 设置缓存
     */
    mov    r0, #
    mcr    p15, , r0, c7, c7,     /* flush v3/v4 cache */
    mcr    p15, , r0, c8, c7,     /* flush v4 TLB */

    /*
     * disable MMU stuff and caches  关闭MMU,内存映射
     */
    mrc    p15, , r0, c1, c0,
    bic    r0, r0, #, : (--V- --RS)
    bic    r0, r0, #, : (B--- -CAM)
    orr    r0, r0, # (A) Align
    orr    r0, r0, # (I) I-Cache
    mcr    p15, , r0, c1, c0, 

    /*
     * before relocating, we have to setup RAM timing
     * because memory timing is board-dependend, you will
     * find a lowlevel_init.S in your board directory.
     */
    mov    ip, lr
    bl    lowlevel_init  /*跳转到lowlevel_init,开始初始化SDRAM*/
    mov    lr, ip
    mov    pc, lr

  /*lowlevel_init的路径为/cpu/arm920t/ks8695/lowlevel_init.S ,在lowlevel_init.S中,对内存进行设置*/

  //设置堆栈

    /* Set up the stack                            */
    stack_setup:
        ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */
        sub    r0, r0, #CFG_MALLOC_LEN    /* malloc area                      */
        sub    r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo 

    #ifdef CONFIG_USE_IRQ
        sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
    #endif
        sub    sp, r0, #12        /* leave 3 words for abort-stack    */

  /*从上面的代码可以知道,栈区已经被分为好几个部分,栈的起始地址为_TEXT_BASE,依次分为堆区,全局数据区等如下图所示*/

  

  /*在栈设置好之后,就可以处理C程序了*/

    #ifndef CONFIG_SKIP_LOWLEVEL_INIT
        bl clock_init
    #endif

  /*clock_init设置时钟,在上面的栈初始化结束之后执行,这儿处理的clock_init,是C语言程序*/
  进入/board/100ask24x0/boot_init.c,文件boot_init.c中的void clock_init(void),用的是c与汇编混合编程,c语言中嵌入汇编。

  /*下面这段代码就是,开始搬运u-boot到SDRAM中去*/

relocate:                /* relocate U-Boot to RAM        */
    adr    r0, _start        /* r0 <- current position of code   */
    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
    cmp     r0, r1                  /* don't reloc during debug         */
    beq     clear_bss

  //如果加载地址与链接地址相等,则开始清BSS段,BSS段中存放的是未初始化的静态变量和全局变量

  由u-boot.lds可以知道,BSS段从从_bss_start开始,在_end 结束

clear_bss:
        ldr    r0, _bss_start        /* find start of bss segment        */
        ldr    r1, _bss_end        /* stop here                        */
        mov     r2, #0x00000000        /* clear                            */

  /*在清空BSS段之后,就跳转到_start_armboot,就开始从start_armboot运行C程序*/

ldr    pc, _start_armboot

    _start_armboot:    .word start_armboot

  综合上边的过程,可以得到,start.S 中所作如下工作:
  1.设置设置CPU为SVC32安全管理模式
  2.关闭看门狗
  3.屏蔽中断
  4.开始初始化SDRAM
  5.设置堆栈
  6.clock_init设置时钟
  7.搬运u-boot到SDRAM中
  8.清BSS段
  9.调用start_armboot进入第二阶段

u-boot启动第一阶段的更多相关文章

  1. Spring Boot 启动第一个页面(Spring二)

    在前面的文章里我配置好了spring boot的环境,并选择STS开发工具 具体文章见:https://blog.csdn.net/qq_38175040/article/details/105481 ...

  2. UBoot启动代码第一阶段流程

    http://blog.csdn.net/xautfengzi/article/details/7470134 前段时间了看了UBoot的源码,放了一段时间之后忘得差不多了.现做一些注释,方便以后温习 ...

  3. Spring Boot启动过程及回调接口汇总

    Spring Boot启动过程及回调接口汇总 链接: https://www.itcodemonkey.com/article/1431.html 来自:chanjarster (Daniel Qia ...

  4. [Spring Boot] Spring Boot启动过程源码分析

    关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到 ...

  5. Spring Boot启动过程源码分析--转

    https://blog.csdn.net/dm_vincent/article/details/76735888 关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Sp ...

  6. uboot启动第一阶段分析

    一. uboot第一阶段初识 1.1. 什么是uboot第一阶段 1.1.1. 启动os三个阶段 1.1.1.1. bl0阶段 a. 这段代码是三星固化到iROM中,可以查看<S5PV210_i ...

  7. Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动

    之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void cr ...

  8. Spring Boot 启动(四) EnvironmentPostProcessor

    Spring Boot 启动(四) EnvironmentPostProcessor Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698. ...

  9. Spring Boot 启动(二) 配置详解

    Spring Boot 启动(二) 配置详解 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot 配置 ...

随机推荐

  1. OSPF协议介绍及配置 (下)

    4.特殊区域详解 为了让我们的讲解更加的通俗易懂,我们看上面这个拓扑,这是一个根据客户业务逻辑结构所涉及的OSPF网络,共有三个区域(实际上远远不止),骨干区域area0为一级行及二级行所部署,*** ...

  2. oracle 物化视图 ORA-23413: 表 "xxx"."xx" 不带实体化视图日志

    DROP materialized view log on TAB_NAME ;    --不是view名,是表名 CREATE MATERIALIZED VIEW LOG ON TAB_NAME W ...

  3. 【BZOJ2151】种树(贪心)

    [BZOJ2151]种树(贪心) 题面 BZOJ 题解 如果没有相邻不能选的限制,那么这就是一道傻逼题. 只需要用一个堆维护一下就好了. 现在加上了相邻点的限制,那么我们就对于当前位置加入一个撤销操作 ...

  4. 【CF813E】Army Creation(主席树)

    [CF813E]Army Creation(主席树) 题面 CF 洛谷 翻译 by ppl 见洛谷 题解 考虑最多只会有\(K\)个相同的数 那么,也就是说,如果一个数会被选 那么,和它相等的数中,在 ...

  5. BZOJ 1367 [Baltic2004]sequence 解题报告

    BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...

  6. [NOI2008]糖果雨

    bzoj1062[Noi2008]糖果雨 首先给出的颜色没有用. 估计要用数据结构.而线段难以维护. 考虑把线段变成点 T是单增的. 所以询问的时候,存在的线段都可能贡献答案. 那些线段的位置如果可以 ...

  7. oracle 数据库记录

    /*----------------------------------------------------------------------------*/ 问题1[--------] Selec ...

  8. php curl使用ss代理

    1.安装 ss,过程略 2.ss 配置文件 { "server":"x.x.x.x", #你的 ss 服务器 ip "server_port" ...

  9. 手脱ACProtect v1.35(无Stolen Code)

    1.载入PEID ACProtect v1.35 -> risco software Inc. & Anticrack Soft 2.载入OD,需要注意的是,异常选项除了[内存访问异常] ...

  10. [洛谷P2750] [USACO5.5]贰五语言Two Five

    洛谷题目链接:[USACO5.5]贰五语言Two Five 题目描述 有一种奇怪的语言叫做"贰五语言".它的每个单词都由A-Y这25个字母各一个组成.但是,并不是任何一种排列都是一 ...