我们要生成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. AutoCompleteTextView的使用

    AutoCompleteTextView的使用 一.简介 1.AutoCompleteTextView的作用 2.AutoCompleteTextView的类结构图 也就是拥有EditText的各种功 ...

  2. HDU6071-最短路

    http://acm.hdu.edu.cn/showproblem.php?pid=6071 四个点围成一个环,相邻两点之间存在路径,问从2号点出发最后再次回到二号点,在路程大于等于K的情况下的最小路 ...

  3. Redis 有序集合(sorted set),发布订阅,事务,脚本,连接,服务器(三)

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  4. 【转载】Git,Github和Gitlab简介和基本使用Gitlab安装和使用

    http://blog.csdn.net/u011241606/article/details/51471367

  5. jsp中解决乱码问题

    解决中文乱码 a) 第一种: String name=new String(name.getBytes("ISO-8859-1"),"UTF-8"); b) 第 ...

  6. SPS和PPS有哪些重要的参数?

    SPS: Level_idc: Bit_depth_luma_minus8: Bit_depth_chroma_minus8: Pic_order_cnt_type: Num_ref_frames: ...

  7. 浅析Java基本数据类型

    作为一种强类型语言,Java针对每一种数据都定义了明确的数据类型.大体来讲可分为:基本数据类型和引用数据类型:在此,主要讨论前者,后者以后再继续探究. Java基本数据类型分为四类八种: 1: 整数 ...

  8. 机器学习算法实现解析——libFM之libFM的模型处理部分

    本节主要介绍的是libFM源码分析的第三部分--libFM的模型处理. 3.1.libFM中FM模型的定义 libFM模型的定义过程中主要包括模型中参数的设置及其初始化,利用模型对样本进行预测.在li ...

  9. [QT]QToolBox 抽屉控件初步学习使用

    创建一个不带界面的widget工程201701100038. main.c #include "widget.h" #include <QApplication> #i ...

  10. 【ES6】蛋疼