U-Boot是一个通用的Boootloader,它是在系统上电后执行的第一段程序,先初始化硬件设备,再准备软件环境,最后引导系统内核。

一般来说Bootloader的启动过程来说一般分两个阶段:

第一阶段:

- 硬件设备初始化(关闭看门狗,关闭中断,设置CPU的速度,时钟频率,RAM初始化)
- 为加载Bootloader的第二阶段代码准备RAM空间
- 复制Bootloader第二阶段代码到RAM空间中。
- 设置好栈
- 转到第二阶段代码的C语言入口

第二阶段:

- 初始化本阶段要使用到的硬件设备
- 检测系统内存映射
- 将内核映像和根文件系统映像从Flash上读到RAM空间中
- 为内核启动设置启动参数

U-Boot源码结构

我的U-Boot版本是1.1.6
Uboot根文件夹里面共有26个子目录
board ---------------> 开发板相关(对应不同电路板)
cpu ---------------> 平台相关(对应不同CPU)
lib_XX ---------------> 平台相关(某一架构下的通用文件)
include ---------------> 通用函数(头文件和开发板的配置文件)
lib_generic ---------------> 通用函数库
common ---------------> 通用函数,多是对下一层驱动程序的进一步封装
disk,drivers,dtt,fs,nand_spl,net,post,rtc通用设备驱动程序
doc ---------------> 文档
example ---------------> 实例程序
tools ---------------> 工具

U-Boot的makefile分析

对一个工程的分析当然是从makefile开始看

对于s3c2410的开发板,执行make smdk2410_config,然后执行make all生成U-Boot.bin

根据第一条指令来看makefile

找到

 smdk2410_config	:	unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

@$(MKCONFIG) $(@:_config=)翻译过来就是./mkconfig smdk2410

也就是说该命令是

./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
# $1 $2 $3 $4 $5 $6

再看U-Boot根文件的mkconfig

if [ "$SRCTREE" != "$OBJTREE" ] ; then
mkdir -p ${OBJTREE}/include
mkdir -p ${OBJTREE}/include2
cd ${OBJTREE}/include2
rm -f asm
ln -s ${SRCTREE}/include/asm-$2 asm
LNPREFIX="../../include2/asm/"
cd ../include
rm -rf asm-$2
rm -f asm
mkdir asm-$2
ln -s asm-$2 asm
else
cd ./include #进入include
rm -f asm #删除asm文件夹
ln -s asm-$2 asm #再次建立asm文件夹,并链接向asm-arm
fi rm -f asm-$2/arch #删除asm-arm/arch文件夹 if [ -z "$6" -o "$6" = "NULL" ] ; then #如果$6变量是空
ln -s ${LNPREFIX}arch-$3 asm-$2/arch #重新建立asm-arm/arch文件夹,并链接向asm-smdk2410/arch
else #否则
ln -s ${LNPREFIX}arch-$6 asm-$2/arch #重新建立asm-arm/arch文件夹,并链接向asm-s3c24x0/arch
fi if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi #
# Create include file for Make
# echo "ARCH = $2" > config.mk #向config.mk写入"ARCH = $2"
echo "CPU = $3" >> config.mk #向config.mk写入"CPU = $3"
echo "BOARD = $4" >> config.mk #向config.mk写入"BOARD = $4" [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk #$5不为空 向config.mk写入"VENDOR = $5" [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk #$6不为空 向config.mk写入"SOC = $6" #
# Create board specific header file
#
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else > config.h # Create new config file #创建一个config.h文件 fi #向config.h写入
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h exit 0

可见make smdk2410_config执行后的结果为

1.创建include/asm并链接向asm-arm

2.创建asm-arm/arch文件夹并链接向asm-smdk2410/arch

3.创建config.mk并写入

4.创建config.h并写入


未完....

UBOOT分析的更多相关文章

  1. Linux之uboot分析与移植20160601

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

  2. u-boot分析(十一)----MMU简单分析|u-boot分析大结局|学习规划

    u-boot分析(十一) 通过前面十篇博文,我们已经完成了对BL1阶段的分析,通过这些分析相信我们对u-boot已经有了一个比较深入的认识,在BL2阶段大部分是对外设的初始化,并且有的我们已经分析过, ...

  3. u-boot分析(十)----堆栈设置|代码拷贝|完成BL1阶段

    u-boot分析(十) 上篇博文我们按照210的启动流程,分析到了初始化nand flash,由于接下来的关闭ABB比较简单所以跳过,所以我们今天按照u-boot的启动流程继续进行分析. 今天我们会用 ...

  4. u-boot分析(九)----nand flash初始化|nand flash读写分析

    u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...

  5. u-boot分析(八)----串口初始化

    u-boot分析(八) 上篇博文我们按照210的启动流程,分析到了内存初始化,今天我们继续按照u-boot的启动流程对串口的初始化进行分析. 今天我们会用到的文档: 1.        2440芯片手 ...

  6. u-boot分析(七)----内存初始化

    u-boot分析(七) 上篇博文我们按照210的启动流程,分析到了时钟初始化,今天我们继续按照u-boot的启动流程对内存的初始化进行分析. 今天我们会用到的文档: 1.        2440芯片手 ...

  7. u-boot分析(六)----时钟初始化

    u-boot分析(六) 上篇博文我们按照210的启动流程,分析到了关闭看门狗,今天我们继续按照u-boot的启动流程进行分析,今天我们会主要分析时钟的初始化. 今天我们会用到的文档: 1.       ...

  8. u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗

    u-boot分析(五) 上篇博文我们按照210的启动流程,对u-boot启动中的设置异常向量表,设置SVC模式进行了分析,今天我们继续按照u-boot的启动流程对以下内容进行分析. 今天我们会用到的文 ...

  9. u-boot分析(四)---设置异常向量表|设置SVC模式

    u-boot分析(四) 通过前三篇的分析,我们对u-boot已经有了整体的认识和掌握,但是我们仍然对于其部分硬件是如何初始化的不太清楚,所以接下来几篇博文我将会对我们在http://www.cnblo ...

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

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

随机推荐

  1. CSS中属性position位置详解功能讲解与实例分析

    position有五个值:static.relative.absolute.fixed.inherit. static 是默认值.就是按正常的布局流从上到下从左到右布局,平常我们做网页制作时,没有指定 ...

  2. (二)、NodeJS 、Express4安装使用方法

    第一步:安装Nodejs 第二步:安装express等部件 1.打开命令窗口,安装express.jade npm install -g express npm install -g express- ...

  3. foreach 和 list.foreach 初步测试

    单纯从速度上讲 小数据量下foreach 较快,list.Foreach 由于 public void ForEach(Action<T> action) { ; i <this._ ...

  4. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  5. 入门级的PHP验证码

    参考了网上PHP 生成验证码很多是类封装了的,没有封装的验证码其实只是几个GD函数而已,初学者可以看看,可以尝试自己封装. <?php   session_start();      $im = ...

  6. QQl聊天消息

    Activity: package com.zzw.qqchat; import java.util.ArrayList; import java.util.HashMap; import andro ...

  7. 百度 迷你版 UMeditor富文本编辑器 使用方法

    第一步:下载编辑器 到官网下载 umeditor 最新版源码版本,下载之后打开 _examples/index.html 就可以看到演示例子.[下载页面] 第二步:部署编辑器到页面 解压下载的包,放到 ...

  8. Python Ogre Blender(转载)

    http://www.cppblog.com/Charlib/archive/2010/05/31/python_ogre_blender_1.html PyOgre入门以及如何使用Blender制作 ...

  9. 浅谈Objective-C异常处理

    -----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  10. 软件工程个人作业4(课堂练习&&课堂作业)

    题目:返回一个整数数组中最大子数组的和. 要求:1.输入一个整型数组,数组里有正书和负数. 2.数组中连续的一个或者多个整数组,每个子数组都有一个和. 3.求所有子数组的和的最大值.要求时间复杂度为0 ...