目标板: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. BZOJ1564 NOI2009二叉查找树(区间dp)

    首先按数据值排序,那么连续一段区间的dfs序一定也是连续的. 将权值离散化,设f[i][j][k]为i到j区间内所有点的权值都>=k的最小代价,转移时枚举根考虑是否修改权值即可. #includ ...

  2. Linux学习笔记二:tar命令使用

    tar命令详解 tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的 ...

  3. 【CodeChef】Chef and Graph Queries

    Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计 ...

  4. 【bzoj4591】超能粒子炮·改

    Portal-->bzoj4591 Solution 首先这个模数是一个质数 然后看一下那个\(k\)和\(n\)的范围..行吧Lucas定理咯 但是如果直接求: \[ \sum\limits_ ...

  5. 框架----Django之Ajax全套实例(原生AJAX,jQuery Ajax,“伪”AJAX,JSONP,CORS)

    一.原生AJAX,jQuery Ajax,“伪”AJAX,JSONP 1. 浏览器访问 http://127.0.0.1:8000/index/ http://127.0.0.1:8000/fake_ ...

  6. Hexo之我的桌角女友的食用方式

    秀秀 通过使用一个名为 hexo-helper-live2d 的开源库,可以轻松的在自己的Hexo网站下贴上一只生猛可爱的萌妹子或主子: 什么是live2d Live2d是11区宅男们开发出的虚拟女友 ...

  7. 洛谷P1106 删数问题

    题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小. 输出应包括所去掉的数字的位置和 ...

  8. Linux系统之路——用CentOS 7打造合适的科研环境

    安装CentOS CentOS 7的安装与其他Linux发行版的安装差不多,个别地方稍有不同. 准备工作 准备材料 U盘:容量700M以上,用于制作U盘启动盘,因为在制作启动盘时会格式化U盘,所以U盘 ...

  9. Tensorboard教程:显示计算图中节点信息

    Tensorboard显示计算图节点信息 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 强烈推荐Tensorflow实战Google深度学习框架 实验平台: Tensorflow1 ...

  10. linux 中 permission denied的问题

    想在linux中运行一个脚步,却提示permission denied. 文件权限不允许. 为了获得执行权限,借助chmod指令修改文件权限即可. 1.如果是运行程序时出现此提示,一般执行chmod ...