目标板: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. Spring Batch @SpringBatchTest 注解

    Spring Batch 提供了一些非常有用的工具类(例如 JobLauncherTestUtils 和 JobRepositoryTestUtils)和测试执行监听器(StepScopeTestEx ...

  2. JAVA本地TXT文件解决中文乱码问题

    import java.io.*; public class ReadFile { public static void main(String[] args) { try { File file = ...

  3. Mac下安装MacProt,并GNU autotools的安装和使用 autoconf,automake

    1 MacPort的下载:http://www.macports.org/install.php, 需要安装xCode支持macport 2 安装MacPorts 与其他Mac的软件的安装方式相同,挂 ...

  4. Communications link failure;;The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

    Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure::The ...

  5. for循环中的i++和++i

    直接上代码............. #include <iostream> using namespace std; int main() { int i, k,l,p; k = 0; ...

  6. Leetcode 832.翻转图像

    1.题目描述 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1] ...

  7. 手脱ASPack v2.12

    1.PEID查壳提示为: ASPack 2.12 -> Alexey Solodovnikov 2.载入OD,程序入口点是一个pushad,在他的下一行就可以进行ESP定律,下硬件访问断点然后s ...

  8. 「Django」与mysql8连接的若干问题

    1.setting配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #数据库驱动名 'NAME': 'my_tes ...

  9. SQL Server 2008如何开启数据库的远程连接

    SQL Server 2008默认是不允许远程连接的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,远程连接数据库.需要做两个部分的配置: 1,SQL Server Man ...

  10. KeyDown,KeyPress和KeyUp详解(转)

    1.按键的类型 Windows窗体将键盘输入标识为由按位Keys枚举表示的虚拟键代码.使用Keys枚举,可以综合一系列按键以生成单个值,这些值与WM_KEYDOWN和WM_SYSKEYDOWNWind ...