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并写入


未完....

最新文章

  1. Entity Framework 6 Recipes 2nd Edition(10-3)译 -&gt; 返回结果是一个标量值
  2. 搭建SVN服务器
  3. svn 应该忽略的文件(visual studio)
  4. linux_脚本应用
  5. Beyond Compare
  6. 关于匿名类无法转换为object
  7. boot.img的分析
  8. IntelliJ IDEA 14.0.2破解注册码文件(2015年06月08日)
  9. 一个简单的Makefile的编写【用自己的话,解释清楚这些】
  10. Swift中类的两段式构造(类的构造过程)
  11. uva 10192 Vacation(最长公共子)
  12. linux input如何固定设备event handler
  13. 【jsp 防盗链】Referer的简单使用
  14. "SQLServer复制需要有实际的服务器名称才能连接到服务器,请指定实际的服务器名"转
  15. Python实战之IO多路复用select实例
  16. 【APP问题定位(一)】夜神模拟器安装及问题
  17. MongoDB $type条件操作符
  18. Android项目的targetSDK&gt;=23,在低于Android6.0的部分测试机(类似华为)上运行时出现的系统权限问题
  19. Linux之常用命令【service】
  20. 为何IT开发人员如此辛苦?

热门文章

  1. [转]10分钟入门python
  2. 通过jquery 获取文本框的聚焦和失焦方法
  3. sql 基本操作
  4. angularJS 数组更新时重新排序之解决方案一:这个坑,绕开吧,不跳了……
  5. Google账户无法登陆-Solved
  6. HDU1006
  7. 实习感悟——SQL语句
  8. XMLCDataSection
  9. Node.js:util.inherits 面向对象特性【原型】
  10. hdu 5112 A Curious Matt