我们要生成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. Django进阶Template篇002 - 模板包含和继承

    包含 {% include %} 允许在模板中包含其他模板的内容. {% include "foo/bar.html" %} {% include template_name %} ...

  2. poj3311 状压dp+floyd

    先floyd预处理一遍dis,枚举所有状态,dp[ i ] [ j ]表示 以  j  为终点的状态 i 使用最小的时间 #include<map> #include<set> ...

  3. Spring Struts2 整合

    Spring整合Struts2 整合什么?——用IoC容器管理Struts2的Action如何整合?第一步:配置Struts21.加入Struts2的jar包.2.配置web.xml文件.3.加入St ...

  4. List排序共通代码

    此共通方法可以根据特定字段进行排序 package com.gomecar.index.common.utils; import java.lang.reflect.Method; import ja ...

  5. webservice SOAP WSDL UDDI简介

    WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...

  6. Android中Application是什么?

    Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象, ...

  7. 前端之JavaScript 补充

    1. BOM window location.href = "https://www.sogo.com" location.reload() // 重新加载当前页 location ...

  8. python操作excel xlrd和xlwt的使用

    最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究&q ...

  9. loj #6136. 「2017 山东三轮集训 Day4」Left

    题目: 题解: 我们可以发现所有的交换器都是一个位置连接着下一层左侧的排序网络,另一个位置连着另一侧的排序网络. 而下一层是由两个更低阶的排序网络构成的. 两个网络互不干扰.所以我们可以通过第一行和最 ...

  10. 16.Selenium+Python关于句柄的小Demo

    前言:有些链接点击之后,会重新打开一个窗口,对于这种情况,就要切换窗口了,获得窗口的唯一标识是用句柄(handle) 代码如下所示: from selenium import webdriver dr ...