uboot工作流程分析

程序入口

1.打开顶层目录的Makefile,找到目标smdk2440_config的命令中的第三项(smdk2440)

2.进入目录board/samsung/smdk2440/,找到u-boot.lds文件。uboot的链接都是由这个链接器脚本来控制的

3.打开u-boot.lds文件,找到.text(代码段)的第一个文件cup/s3c24xx/start.o,该文件就是uboot的入口代码。链接器脚本中的ENTRY用来表明整个程序的入口,那么标号_start就是整个程序的入口

4.第一阶段入口在cup/s3c24xx/start.S文件的_start处

5.第二阶段入口在lib_arm/board.c文件的start_armboot处

第一阶段(BL1)代码分析

1.打开source insight工程,并打开start.S文件,[shift]+F8高亮显示

2.分析代码是只关心做了什么,不关怎么做。可以通过注释找到做了什么。边分析边通过思维导图记录下来。

3.通过make smdk2440_config执行相应的配置项

4.执行make,编译uboot。在顶层目录下会产生u-boot(elf)文件和u-boot.bin(二进制)文件

5.通过反汇编u-boot(elf)文件可以查看相关信息

arm-linux-objdump -D -S u-boot >dump

搜索start_armboot可以找到start_armboot的地址为0x30001100, 在内存中。说明在这个时候BL1会跳转到内存中执行BL2

6.打开顶层目录下的config.mk文件,config.mk文件会由Makefile 包含进去。搜索TEXT_BASE(代码段的基地址),会找到 -T(LDSCRIPT) -Ttext $(TEXT_BASE) 表示指定链接器脚本的地址由TEXT_BASE覆盖掉。TEXT_BASE变量在boot/samsung/smdk2440/config.mk文件中定义,该值为0x30000000

7.b指令相对跳转,只会在SteppingStone中跳转,不会跳转到内存中。ldr pc, start_armboot会修改pc指针的值,使跳转到内存中运行

8.2440、6410和210的第二阶段执行的代码都相同

9.2440和6410的BL1和BL2产生的是一个bin文件,210的BL1和BL2产生的是两个bin文件

10.210的BL1的链接脚本位于spl/u-boot-spl.lds。入口程序在arch/arm/cpu/armv7/start.S

11.BL1会把BL2复制到内存中的0x23E00000处。BL1(16KB)与BL2之间有8KB的填空,所以BL2的地址在BL1后24KB处

12.210的BL2的链接器脚本位于arch/arm/cpu/armv7/u-boot.lds。程序入口同样在arch/arm/cpu/armv7/start.S中

2440第一阶段启动流程分析

1.设置中断向量表

2.设置处理器为svc模式

3.刷新I/D cache

4.关闭mmu和cache

5.关闭看门狗

6.关闭所有中断

7.初始化时钟

8.初始化串口

9.简单初始化nand flash

10.内存初始化

11.复制nand flash中的bl2到内存中

12.设置堆栈,为C语言做准备

13.清除bss段

14.跳转到BL2

2440第二阶段启动流程分析

1.分析时,只关心硬件的初始化,不关心软件的初始化

2.初始化串口

3.初始化LCD

4.初始化网卡

5.初始化LED

6.执行用户输入的命令

[国嵌笔记][030][U-Boot工作流程分析]的更多相关文章

  1. [国嵌笔记][029][ARM处理器启动流程分析v2]

    2440启动流程 启动方式:nor flash启动.nand flash启动 地址布局: 选择nor flash启动时,SROM(nor flash)地址为0x00000000 选择nand flas ...

  2. [国嵌笔记][021-022][ARM处理器工作模式]

    [ARM处理器工作模式] 处理器工作模式 1.User(urs):用户模式,linux应用程序运行在用户模式 2.FIQ(fiq):快速中断模式 3.IRQ(irq):中断模式 4.Superviso ...

  3. [国嵌笔记][008-009][远程登录Linux]

    [国嵌笔记][008][远程登录Linux] 1.windows与Linux能够相互ping通 2.关闭Linux防火墙 /etc/init.d/iptables stop 3.通过ssh(字符界面) ...

  4. u-boot分析(二)----工作流程分析

    u-boot分析(二) 由于这两天家里有点事,所以耽误了点时间,没有按时更新,今天我首先要跟大家说说我对于u-boot分析的整体的思路,然后呢我以后的博客会按照这个内容更新,希望大家关注. 言归正传, ...

  5. 【转】Hostapd工作流程分析

    [转]Hostapd工作流程分析 转自:http://blog.chinaunix.net/uid-30081165-id-5290531.html Hostapd是一个运行在用户态的守护进程,可以通 ...

  6. 第2章 rsync算法原理和工作流程分析

    本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释. 以下是本文的姊妹篇: 1.rsync(一):基本命令和用法 2.rsync(二):ino ...

  7. rsync算法原理和工作流程分析

    本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释.本文不会介绍如何使用rsync命令(见rsync基本用法),而是详细解释它如何实现高效的增 ...

  8. nodejs的Express框架源码分析、工作流程分析

    nodejs的Express框架源码分析.工作流程分析 1.Express的编写流程 2.Express关键api的使用及其作用分析 app.use(middleware); connect pack ...

  9. Mysql工作流程分析

    Mysql工作流程图 工作流程分析 1. 所有的用户连接请求都先发往连接管理器 2. 连接管理器    (1)一直处于侦听状态    (2)用于侦听用户请求 3. 线程管理器    (1)因为每个用户 ...

随机推荐

  1. Jmeter3.2版本中Generating Report Dashboard功能浅析

    自从投入到Jmeter怀抱,一直想找到一个比较不错的测试结果报告模板用于展示,类似于Loadrunner中导出html那种,但是苦苦的寻找始终没有一款让我看上眼的,包括Jmeter自带的xsl,虽然展 ...

  2. python自动生成excel报表

    1.将SQL语句查询的内容,直接写入到excel报表中,以下为全部脚本.要求:此版本必须运维在windows平台,并且安装了excel程序,excel版本不限. python版本为2.7 if b 判 ...

  3. shell脚本异步日志分析-接口耗时、可用率

    背景:现有日志接入日志报表大盘,为了避免作业高峰期间(双十一),系统也要观测系统整体情况,因此提出了观测近五分钟,接口成功率以及耗时等工具(默认统计最近五分钟,并进行结果汇总统计) 使用说明 前提:p ...

  4. C# 将DataTable一行放入另一个DataTable中

    http://blog.csdn.net/huyu107/article/details/53509171 概述 从一个DataTable中取一行放到另一个DataTable里报错: 该行已经属于另一 ...

  5. 微信小程序之注册和入门

    一.注册 首先,在微信公众平台mp.weixin.qq.com上注册一个帐号. 小程序开放个人开发者申请注册,个人用户可访问微信公众平台,扫码验证个人身份后即可完成小程序帐号申请并进行代码开发. 这里 ...

  6. jQuery源码解析资源便签

    最近开始解读jQuery源码,下面的链接都是搜过来的,当然妙味课堂 有相关的一系列视频,长达100多期,就像一只蜗牛慢慢爬, 至少品读三个框架,以后可以打打怪,自己造造轮子. 完全理解jQuery源代 ...

  7. JDK中AbstractQueuedSynchronizer应用解析

    这个类首先是一个抽象类,定义了一个模板,很多java同步相关的类(ReetrantLock.Semaphore.CountDownLatch等)都是基于AbstractQueuedSynchroniz ...

  8. CentOS7下安装Docker-Compose

    Docker-Compose是一个部署多个容器的简单但是非常必要的工具. 安装Docker-Compose之前,请先安装 python-pip 安装 python-pip 1.首先检查linux有没有 ...

  9. .NET HttpClient的缺陷

    using (HttpClient client = new HttpClient()){} 每次发起http请求每次new httpClient,它会打开许多套接字,比你实际的需求多许多,这极大地增 ...

  10. 希尔排序(Go语言)

    func ShellSort(num []int) { //increment相隔数量 ;increment> ;increment/= { //i序号较大的数组下标,i ,j进行比较 for ...