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分析的整体的思路,然后呢我以后的博客会按照这个内容更新,希望大家关注. 言归正传, ...
随机推荐
- 如何查询centos查看系统内核版本,系统版本,32位还是64位
查看centos内核的版本: 1)[root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@build ...
- css3- border
css3-border 1.border-color 2.border-image 3.border-radius ( none | <length>{1,4} [ / <leng ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(七)-- 结构化配置
本篇将记录.Net Core里颇有特色的结构化配置的使用方法. 相比较之前通过Web.Config或者App.Config配置文件里使用xml节点定义配置内容的方式,.Net Core在配置系统上发生 ...
- swiper 页面双向设置
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- js8月-4号,,思想
1.js使用观察者模式,做异步编程.面向事件编程. 2.事件执行 (1)用户触发事件(2)定时执行 作业:选项卡,导航栏.
- python内建函数-数字相关
本篇对于数字有关的内置函数进行总结. 数字包括 int() , long() , float() , complex() ,这些函数都能够用来进行数值类型的转换.同时这些函数也接受字符串参数,返回字符 ...
- Java中HashMap,LinkedHashMap,TreeMap的区别[转]
原文:http://blog.csdn.net/xiyuan1999/article/details/6198394 java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类 ...
- hdu 2112 HDU Today
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的 ...
- java intellij 写控制台程序 窗口程序
建一个空项目,建一个main函数 用application,就可以运行了 /** * Created by robin on 15/10/11. */public class hello { pu ...
- scjp考试准备 - 5 - 重载和重写
如下代码,在所指示的位置插入代码能够正常编译: class Alpha{ public void bar(int... x){}; public void bar(int x){}; } public ...