UBOOT分析
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分析的更多相关文章
- Linux之uboot分析与移植20160601
说一下uboot分析与移植: 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2 ...
- u-boot分析(十一)----MMU简单分析|u-boot分析大结局|学习规划
u-boot分析(十一) 通过前面十篇博文,我们已经完成了对BL1阶段的分析,通过这些分析相信我们对u-boot已经有了一个比较深入的认识,在BL2阶段大部分是对外设的初始化,并且有的我们已经分析过, ...
- u-boot分析(十)----堆栈设置|代码拷贝|完成BL1阶段
u-boot分析(十) 上篇博文我们按照210的启动流程,分析到了初始化nand flash,由于接下来的关闭ABB比较简单所以跳过,所以我们今天按照u-boot的启动流程继续进行分析. 今天我们会用 ...
- u-boot分析(九)----nand flash初始化|nand flash读写分析
u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...
- u-boot分析(八)----串口初始化
u-boot分析(八) 上篇博文我们按照210的启动流程,分析到了内存初始化,今天我们继续按照u-boot的启动流程对串口的初始化进行分析. 今天我们会用到的文档: 1. 2440芯片手 ...
- u-boot分析(七)----内存初始化
u-boot分析(七) 上篇博文我们按照210的启动流程,分析到了时钟初始化,今天我们继续按照u-boot的启动流程对内存的初始化进行分析. 今天我们会用到的文档: 1. 2440芯片手 ...
- u-boot分析(六)----时钟初始化
u-boot分析(六) 上篇博文我们按照210的启动流程,分析到了关闭看门狗,今天我们继续按照u-boot的启动流程进行分析,今天我们会主要分析时钟的初始化. 今天我们会用到的文档: 1. ...
- u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗
u-boot分析(五) 上篇博文我们按照210的启动流程,对u-boot启动中的设置异常向量表,设置SVC模式进行了分析,今天我们继续按照u-boot的启动流程对以下内容进行分析. 今天我们会用到的文 ...
- u-boot分析(四)---设置异常向量表|设置SVC模式
u-boot分析(四) 通过前三篇的分析,我们对u-boot已经有了整体的认识和掌握,但是我们仍然对于其部分硬件是如何初始化的不太清楚,所以接下来几篇博文我将会对我们在http://www.cnblo ...
- u-boot分析(二)----工作流程分析
u-boot分析(二) 由于这两天家里有点事,所以耽误了点时间,没有按时更新,今天我首先要跟大家说说我对于u-boot分析的整体的思路,然后呢我以后的博客会按照这个内容更新,希望大家关注. 言归正传, ...
随机推荐
- linux环境配置
一.JDK安装 1.通过xftp工具把jdk-8u60-linux-x64.gz上传到linux 2.解压JDK命令tar -xzf jdk-8u60-linux-x64.gz 3.linux配置环境 ...
- nginx url重写 rewrite实例
本文介绍下,在nginx中实现Url重写,学习rewrite的具体用法,有需要的朋友参考下吧. 原文地址:http://www.360doc.com/content/14/0202/20/142341 ...
- 为什么for in循环不适合用于数组
首先一点无关的,使用(var i in a) 而不是( i in a),除非你想创建全局变量. 第二点,for in 循环会忽略空的数组 var a = []; a[5] = 5; // Perfec ...
- Thinking about think-time functions
You will find yourself very familier to this topic. Ok, let me ask you one question: Let me know th ...
- C#利用Attribute实现简易AOP介绍 (转载)
地址:http://dotnet.9sssd.com/csbase/art/638 http://wayfarer.blog.51cto.com/1300239/279913 http://devel ...
- kettle的windows安装
1.首先去官网下载安装包,这个安装包在所有平台上是通用的. 2.kettle是java语言开发的,所以需要配置JAVA_HOME 3.解压kettle的安装包 4.配置环境变量,KETTLE_HOME ...
- ip的正则表达式 完美版
IP地址的长度为32位2进制,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用英文句点“.”隔开.例如:IP地址为10.0.0.100. 分析IP地址的每组数特点:百位,十 ...
- struts2集成javamail发邮件(带附件)实践记录
一.代码预览 这两天在做struts2上的邮件发送.以前的项目有用到spring,用spring提供的邮件支持类很方便可以完成这个功能,但是现在只用struts2的话,就碰到了一系列的问题. 代码是从 ...
- C++实现01串排序
题目内容:将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序. 输入描述:输入数据中含有一些01串,01串的长度不大于256个字符. 输出描述:重新排 ...
- jQuery操作 input type=checkbox的实现代码
代码如下: <input type="checkbox">: 2012欧洲杯"死亡之组"小组出线的国家队是:<br> <input ...