(1)定义入口。由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
(2)设置异常向量(Exception Vector)。
(3)设置CPU的速度、时钟频率及终端控制寄存器。
(4)初始化内存控制器。
(5)将ROM中的程序复制到RAM中。
(6)初始化堆栈。
(7)转到RAM中执行,该工作可使用指令ldr pc来完成。

.globl _start                         //u-boot启动入口
_start: b       reset               //复位向量并且跳转到reset
 ldr pc, _undefined_instruction
 ldr pc, _software_interrupt
 ldr pc, _prefetch_abort
 ldr pc, _data_abort
 ldr pc, _not_used
 ldr pc, _irq                     //中断向量
 ldr pc, _fiq                     //中断向量
 b  sleep_setting             //跳转到sleep_setting
系统上电或reset后,cpu的PC一般都指向0x0地址,在0x0地址上的指令是
reset:                                 //复位启动子程序
/******** 设置CPU为SVC32模式***********/
 mrs r0,cpsr                       //将CPSR状态寄存器读取,保存到R0中
 bic r0,r0,#0x1f
 orr r0,r0,#0xd3
 msr cpsr,r0                      //将R0写入状态寄存器中
/************** 关闭看门狗 ******************/
 ldr      r0, =pWTCON
 mov     r1, #0x0
 str       r1, [r0]
/************** 关闭所有中断 *****************/
 mov r1, #0xffffffff
 ldr r0, =INTMSK
 str r1, [r0]
 ldr r2, =0x7ff
 ldr r0, =INTSUBMSK
 str r2, [r0]
/************** 初始化系统时钟 *****************/
 ldr r0, =LOCKTIME
 ldr     r1, =0xffffff 
 str     r1, [r0]
clear_bss:
        ldr       r0, _bss_start           //找到bss的起始地址 
        add      r0, r0, #4              //从bss的第一个字开始 
        ldr       r1, _bss_end           // bss末尾地址 
        mov      r2, #0x00000000       //清零 
clbss_l:str        r2, [r0]                // bss段空间地址清零循环 
        add     r0, r0, #4
        cmp     r0, r1
        bne      clbss_l
/***************** 关键的初始化子程序 ************************/
/ * cpu初始化关键寄存器       设置重要寄存器          设置内存时钟  * /
cpu_init_crit:           /** flush v4 I/D caches*/
 mov r0, #0
 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
 mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
/************* disable MMU stuff and 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
/******* 在重新定位前,我们要设置RAM的时间,因为内存时钟依赖开发板硬件的,你将会找到board目录底下的memsetup.S。**************/
 mov ip, lr
#ifndef CONFIG_S3C2440A_JTAG_BOOT
 bl memsetup        //调用memsetup子程序(在board/smdk2442memsetup.S)
#endif
 mov lr, ip
 mov pc, lr                        //子程序返回
 
memsetup:   
/**************** 初始化内存 **************/
        mov     r1, #MEM_CTL_BASE
        adrl    r2, mem_cfg_val
        add     r3, r1, #52
1:       ldr     r4, [r2], #4
        str     r4, [r1], #4
        cmp     r1, r3
        bne     1b
/*********** 跳转到原来进来的下一个指令(start.S文件里) ***************/  
mov     pc, lr                 //子程序返回
 

并通过下段代码拷贝到内存里
relocate:                             //把uboot重新定位到RAM
 adr r0, _start                  // r0 是代码的当前位置 
 ldr r2, _armboot_start               //r2 是armboot的开始地址
 ldr r3, _armboot_end                //r3 是armboot的结束地址
 sub r2, r3, r2                      // r2得到armboot的大小 
 ldr r1, _TEXT_BASE            // r1 得到目标地址  
 add r2, r0, r2                    // r2 得到源结束地址 
copy_loop:                             //重新定位代码
 ldmia r0!, {r3-r10}                  //从源地址[r0]中复制
 stmia r1!, {r3-r10}                  //复制到目标地址[r1]
 cmp  r0, r2                        //复制数据块直到源数据末尾地址[r2]
 ble copy_loop

/****************** 建立堆栈 *******************/
 ldr r0, _armboot_end               //armboot_end重定位
 add r0, r0, #CONFIG_STACKSIZE    //向下配置堆栈空间
 sub sp, r0, #12                  //为abort-stack预留个3字

/**************** 跳转到C代码去 **************/
 ldr pc, _start_armboot           //跳转到start_armboot函数入口,start_armboot字保存函数入口指针
_start_armboot: .word start_armboot    //start_armboot函数在lib_arm

/board.c中实现
从此进入第二阶段C语言代码部分

u-boot启动代码start.S详解360的更多相关文章

  1. u-boot启动代码start.S详解

    (1)定义入口.由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本 ...

  2. [PXE] Linux(centos6)中PXE 服务器搭建,PXE安装、启动及PXE理论详解

    [PXE] Linux(centos6)中PXE 服务器搭建,PXE安装.启动及PXE理论详解 本篇blog主要讲述了[PXE] linux(centos)PXE无盘服务器搭建,安装,启动及pxe协议 ...

  3. Spring Boot源码中模块详解

    Spring Boot源码中模块详解 一.源码 spring boot2.1版本源码地址:https://github.com/spring-projects/spring-boot/tree/2.1 ...

  4. 服务启动项 Start类型详解

    注册表的服务启动项 Start类型详解 HKLM\SYSTEM\CurrentControlSet\services\ 下的服务项.不论有没有在services.msc服务管理控制台中显示,在注册表中 ...

  5. Understand:高效代码静态分析神器详解(转)

    之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便了,但是却没有了静态代码分析工具,很幸运,前段时间找到一款比source ins ...

  6. DBA_Oracle Startup / Shutdown启动和关闭过程详解(概念)

    2014-08-07 Created By BaoXinjian

  7. 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...

  8. Understand:高效代码静态分析神器详解(一)

    Understand:高效代码静态分析神器详解(一) Understand   之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便 ...

  9. “全栈2019”Java异常第六章:finally代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

随机推荐

  1. Python中图像的缩放 resize()函数的应用

    cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst 参数说明: src - 原图 dst - 目标图像.当参数ds ...

  2. 安装oracle服务端之后再安装oracle客户端导致sqlplus命令无法使用??

    首先小编自述一下所遇到的问题: 昨天在已经安装 oracle 服务端的 win7 X64 主机上安装 oracle client 之后,发现我的sqlplus命令无法用了??经过百度,都说我服务没有开 ...

  3. BA--调试经验笔记

    100%的湿度是水蒸气,称做饱和空气,人体的相对湿度范围为20%---60%,当室内的湿度小于20%时,容易产生静电,尤其在计算机上,超过60%就过湿 冬天适宜温度24.5+-1.5,夏天适宜温度22 ...

  4. codevs——T1576 最长严格上升子序列

    http://codevs.cn/problem/1576/  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  5. 关于idea控制台乱码问题

    乱码是常有的事儿,改一下也就两分钟......不多说看图: 上图中的勾选项一定不要忘记,它可以隐藏你项目中encoding设置. 在上图两个文件中加入 -Dfile.encoding=UTF-8 在上 ...

  6. NEFU 109

    n最大为2000000000(不知为什么OJ上是1000),若为判断2000000000是素数,则必有一个素数在sqrt(n)内,求出这个范围 的所有素数,其比最大数据小的n'的sqrt(n')也在这 ...

  7. 鸟书shell 学习笔记(二) shell中正則表達式相关

    通配符与正則表達式的差别 通配符是bash原生支持的语法,正則表達式是处理字符串的一种表示方式, 正則表達式须要支持的工具支持才干够 语系设置 : export LANG=C grep alias 设 ...

  8. linux虚拟机网络设置好ping百度没有用

    场景:公司内网,本机使用的是本地连接,不是wiff,虚拟机设置了桥接模式 问题:使用桥接模式 启动好网络服务,查看ifconfig也获取到了设置的ip,可是ping了www.baidu.com还是没有 ...

  9. HDU 1874 畅通project续 (最短路径)

    畅通project续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. Ubuntu14.04编译WebRTC For Android代码 2014-07-24

    整整快一年没有写博客了.近期基于Google开源的WebRTC项目做了一款音视频聊天的即时通信项目,期间在下载WebRTC代码时就碰到了一些问题.在此以作记录,也希望可以帮助到正在下载编译WebRTC ...