我们要生成u-boot.bin文件,它首先依赖于很多.o文件和.lds链接脚本文件

我们只要找到对应的.lds链接脚本文件就可以分析u-boot的启动流程。

1、打开u-boot-1.1.6\u-boot-1.1.6\board\smdk2410\

打开链接脚本boot.lds 看看:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

 . = 0x00000000;

. = ALIGN(4);

 .text      :

 {

   cpu/arm920t/start.o (.text)

   *(.text)

 }

1)可以看见入口函数是_start

2)这个start代码放在cpu/arm920t/,就是start.S生成的start.o

 2、打开u-boot-1.1.6\cpu\arm920t\start.S

.globl _start

_start: b       reset

 ldr pc, _undefined_instruction

......

一开始跳到 reset

reset:

设置CPU SVC32模式:



 /*

  * set the cpu to SVC32 mode

  */

mrs r0,cpsr

 bic r0,r0,#0x1f   /*clear 0 at low 5 bit */

 orr r0,r0,#0xd3  /*set 110 10011*/

                             /*close irq,fiq,at arm state ,at supervisor mode */

 msr cpsr,r0      /*write cpsr*/

I F 为1,关闭FIQ,IRQ

T为0,ARM模式

M[4:0]=10011,管理模式

关闭看门狗:

向pWTCON全写0

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)

 ldr     r0, =pWTCON

 mov     r1, #0x0  

 str     r1, [r0]

关闭所有中断:

但默认已经是关闭的

INTMSK写1,屏蔽对应的中断(默认1)

INTSUBMSK写1,屏蔽对应的二级中断(默认1)

/*

  * mask all IRQs by setting all bits in the INTMR - default

  */

 mov r1, #0xffffffff

 ldr r0, =INTMSK

 str r1, [r0]

# if defined(CONFIG_S3C2410)

 ldr r1, =0x3ff

 ldr r0, =INTSUBMSK

 str r1, [r0]

# endif

设置时钟分频比:

/* FCLK:HCLK:PCLK = 1:2:4 */

 /* default FCLK is 120 MHz ! */

 ldr r0, =CLKDIVN

 mov r1, #3

 str r1, [r0]

接着跳入cpu系统初始化:

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

 bl cpu_init_crit

#endif

在里面再跳入sdram初始化:

bl lowlevel_init

拷贝代码到SDRAM:

十分遗憾,这是给NOR FLASH用的

首先判断_start当前第一条代码位置,如果是在内存中,就不用代码重定位了

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

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     stack_setup

ldr r2, _armboot_start

 ldr r3, _bss_start

 sub r2, r3, r2  /* r2 <- size of armboot            */

 add r2, r0, r2  /* r2 <- source end address         */

copy_loop:

 ldmia r0!, {r3-r10}  /* copy from source address [r0]    */

 stmia r1!, {r3-r10}  /* copy to   target address [r1]    */

 cmp r0, r2   /* until source end addreee [r2]    */

 ble copy_loop

#endif /* CONFIG_SKIP_RELOCATE_UBOOT */

设置堆栈:

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                        */

还有设置中断stack

......

清bss段:

Bss段用来存放未初始化的全局变量和静态变量,在有操作系统的c编译器里默认为0.
但移植u-boot时,所有堆栈,清bss段都是人手设置,我们定义了一个bss段,把这个区域写0,
以后我们c函数运行时,就默认0了。

clear_bss:

 ldr r0, _bss_start  /* find start of bss segment        */

 ldr r1, _bss_end  /* stop here                        */

 mov  r2, #0x00000000  /* clear                            */

clbss_l:str r2, [r0]  /* clear loop...                    */

 add r0, r0, #4

 cmp r0, r1

 ble clbss_l

跳到c函数入口:

ldr pc, _start_armboot

_start_armboot: .word start_armboot

第一阶段基本完成

ldr绝对跳转到_start_armboot函数入口

U-boot分析与移植(2)----U-boot stage1分析的更多相关文章

  1. 【转】U-boot分析与移植(1)----bootloader分析

    原文网址:http://blog.csdn.net/jianchi88/article/details/7061089  一.Boot Loader 概念 就是在操作系统内核运行之前运行的一段小程序. ...

  2. U-boot分析与移植(1)----bootloader分析

    一.Boot Loader 概念 就是在操作系统内核运行之前运行的一段小程序.通过这段小程序,我们可以初始化硬件设备.建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作 ...

  3. spring boot实战(第十三篇)自动配置原理分析

    前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...

  4. 《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析

    刚关注的朋友,可以回顾前两篇文章: 基础应用开发 分布式应用开发 上篇文章总结了<深入实践Spring Boot>的第二部分,本篇文章总结第三部分,也是最后一部分.这部分主要讲解核心技术的 ...

  5. spring Boot(十九):使用Spring Boot Actuator监控应用

    spring Boot(十九):使用Spring Boot Actuator监控应用 微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台 ...

  6. Spring Boot (十): Spring Boot Admin 监控 Spring Boot 应用

    Spring Boot (十): Spring Boot Admin 监控 Spring Boot 应用 1. 引言 在上一篇文章<Spring Boot (九): 微服务应用监控 Spring ...

  7. Spring Boot高频面试题:Spring Boot执行原理

    之前一篇文章Spring Boot快速入门文章中,我们已经体会到Spring Boot的神器,不再像之前Spring那样需要繁琐的XML,甚至几秒钟就能搭建出Spring的项目骨架.接下来我们简单分析 ...

  8. Linux之uboot分析与移植20160601

    说一下uboot分析与移植: 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2 ...

  9. 基于Petri网的工作流分析和移植

    基于Petri网的工作流分析和移植 一.前言 在实际应用场景,包括PEC的订单流程从下订单到订单派送一直到订单完成都是按照一系列预先规定好的工作流策略进行的. 通常情况下如果是采用面向过程的编程方法, ...

  10. spring boot系列01--快速构建spring boot项目

    最近的项目用spring boot 框架 借此学习了一下 这里做一下总结记录 非常便利的一个框架 它的优缺点我就不在这背书了 想了解的可以自行度娘谷歌 说一下要写什么吧 其实还真不是很清楚,只是想记录 ...

随机推荐

  1. javascript练习题·(1)

    1.参数集合是什么? (function(){ return typeof arguments; })(); 的结果是? typeOf只能以字符串的形式返回数据类型 js中包括6种数据类型--Numb ...

  2. 设置 Mysql中的datetime的默认值

    如果在navicat下操作,将字段类型设置为timestamp,然后默认值写上CURRENT_TIMESTAMP即可

  3. Educational Codeforces Round 13

    http://codeforces.com/contest/678 A:水题 #include<bits/stdc++.h> #define fi first #define se sec ...

  4. hdu 5981 Guess the number

    Guess the number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 160000/160000 K (Java/Other ...

  5. C++程序设计之提高效率

    设计C++程序时,总结起来可以从如下几点提高效率: 1.并发 2.异步 3.缓存

  6. WCF基础:绑定(一)

    WCF中的终结点(ServiceEndpoint)包含有三要素:地址(EndpointAddress),绑定(Binding),契约描述(ContractDescription)三要素:其中绑定的在整 ...

  7. Spring AOP(面向切面示例)

    什么是AOP?基本概念切面(aspect):横切关注点被模块化的特殊对象.通知(advice):切面必须要完成的工作.切面中的每个方向称之为通知.通知是在切面对象中的.目标(target):被通知的对 ...

  8. Struts01---入门小案例

    创建web项目    实现的效果! 用户点击页面不同的链接,后台调用不同的代码! 创建两个类实现共同的接口! public interface Action { String execute(); } ...

  9. 条款16:成对使用new以及delete的时候应该采取相同的形式

    首先思考下面的代码: ]; ... delete stringArray; 这是最常见的错误之一了,new与delete不配对,但是仔细想想new与delete为什么一定要配对呢? 可以想到一种可能就 ...

  10. Electron中git, npm,webpack使用

    开始学习Electron的时候用到git, 记录学习一下, 学习地址是: https://zhuanlan.zhihu.com/p/20225295?columnSlug=FrontendMagazi ...