uboot启动流程分析,针对S5PV210

BL1阶段,SPL,u-boot-spl.bin

1、首先运行arch/arm/cpu/armv7/start.S 里面的_start函数,进行异常向量表设置,然后跳转到reset复位处理函数,设置处理器SVC模式,关闭IRQ和FIQ中断。设置cp15协处理器

  的SCTRL寄存器V(bit13)为0,设置异常向量表在0x00000000-0x0000001C,设置异常向量表地址为_start。跳转到cpu_init_cp15初始化协处理器,清除TLB,关闭cache,

  关闭MMU,如果没有定义CONFIG_SYS_ICACHE_OFF则打开icache。继续执行cpu_init_crit,跳转到board/samsung/tiny210/lowlevel_init.S里面的lowlevel_init,

  进行时钟初始化,DDR初始化。

2、跳转到arch\arm\lib\crt0.S里面的_main,调用copy_bl2_to_ram把BL2从SD卡或是nand flash拷贝到SDRAM的0x20000000,然后跳转到SDRAM开始运行BL2。

BL2阶段,u-boot.bin

1、还是运行arch/arm/cpu/armv7/start.S 里面的_start函数,然后是reset,再次设置异常向量表地址,设置cp15,跳转到cpu_init_crit,调用lowlevel_init,

  但没做任何时事情,因为BL1已经做了初始化,然后跳转到_main,设置sp,预留空间给全局变量gd,gd在sp之上,gd指针保存在r9里面,跳转到board_init_f执行。

2、执行arch\arm\lib\board.c里面的board_init_f,清空gd,设置gd里面变量mon_len为uboot大小,执行init_sequence里面的初始化序列函数,初始化定时器, 

  串口,环境变量,设置dram banks等等。继续gd的初始化,如果定义了宏CONFIG_SYS_MEM_TOP_HIDE则预留CONFIG_SYS_MEM_TOP_HIDE ram隐藏空间,

  如果定义了CONFIG_LOGBUFFER,则预留LOGBUFF_RESERVE空间给kernel logbuffer,设置TLB大小和空间,如果定义了CONFIG_LCD则预留fb,

  设置TOTAL_MALLOC_LEN大小为malloc空间,预留空间给bd,预留空间给gd,得到addr_sp为栈指针,addr为uboot起始地址。设置波特率,

  设置dram地址地址和大小,设置uboot重定位地址为addr,起始栈指针为addr_sp,设置重定位偏移,把gd数据由当前r9处拷贝到新的gd空间。

3、设置新的gd地址到r9,计算重定位后here的地址保存在lr,这样在执行relocate_code进行uboot重定位之后返回时,直接跳转到重定位后的uboot继续执行。

  设置r0为重定位地址,调用relocate_code进行uboot重定位。

4、执行arch\arm\lib\relocater.S里面的relocate_code进行uboot重定位。uboot中ld使用-pie而cc没有使用-fPIC或-fPIE,目标文件中就不会生成GOT。

  首先拷贝__image_copy_start和__image_copy_end之间的代码到重定位地址空间,在调整.rel.dyn段里面的地址,对__rel_dyn_start和__rel_dyn_end

  之间类型为R_ARM_RELATIVE(23)的entry加上偏移进行调整。

5、重定位代码后清零bss段,设置r0为r9,即r0指向gd,r1为重定位地址,然后调用board_init_r。

6、执行arch\arm\lib\board.c里面的board_init_r继续初始化,设置gd标志为GD_FLG_RELOC,使能ceche,调用board\samsung\tiny210\tiny210.c里面的board_init初始化

  sromc设置机器类型和启动参数地址,调用serial_initialize注册串口设备,初始化malloc,初始化nand flash,执行env_relocate设置环境变量,

  设置中断,初始化网卡,最后跳转到main_loop死循环,在main_loop中会调用process_boot_delay检测启动阶段有没有键按下,如果有就进入uboot命令行,

  如果没有就默认加载kernel,如果加载失败也会进入uboot命令行。

对于代码重定位的一些说明

  需要注意的是,在uboot的整个relocate_code中rel.dyn不仅没有拷贝,也没有修改,修改只是针对rel.dyn中值+offset为地址上的值!查阅网上资料,compiler在cc时加入-fPIC或-fPIE选项,会在目标文件中生成GOT(global offset table),将需要relocate的值存放在GOT中,函数尾部的 Label来存储GOT的offset以及其中变量的offset,变量寻址首先根据尾部Label相对寻址找到GOT地址,以及变量地址在GOT中的位置,从而确定变量地址,这样对于目标文件统一修改GOT中的值,就修改了变量地址的offset,完成了relocation。ld时加入-pie选项,就会将GOT并入到rel.dyn段中,uboot在relocate_code中统一根据rel.dyn段修改需要relocation的数值。uboot中ld使用-pie而cc没有使用-fPIC或-fPIE,目标文件中就不会生成GOT,函数中寻址还是在尾部Label中直接存储变量的绝对地址,但这个Label同样存在rel.dyn中,uboot根据rel.dyn段修改Label上的值,就完成了relocation。这样不仅节省了每个目标文件的GOT段,而且不需要去相对寻址GOT,直接修改函数尾部Label所存储的变量地址就可以了。

参考博文:

http://blog.csdn.net/skyflying2012/article/details/37660265
http://blog.csdn.net/caiyuqing2001/article/details/7328994

uboot 2014.04 运行过程记录的更多相关文章

  1. mini2440移植uboot 2014.04(六)

    上一篇博文:<mini2440移植uboot 2014.04(五)> 代码已经上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04- ...

  2. mini2440移植uboot 2014.04(五)

    代码上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440 前几篇博文: <mini2440移植uboot 2014.04 ...

  3. Python3.x:logging模块对运行过程记录

    Python3.x:logging模块对运行过程记录 示例: import logging # 设置 logger = logging.getLogger() #set loghandler #默认路 ...

  4. mini2440移植uboot 2014.04(七)

    上一篇博文:<mini2440移植uboot 2014.04(六)> 代码已经上传到github上: https://github.com/qiaoyuguo/u-boot-2014.04 ...

  5. mini2440移植uboot 2014.04(四)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <mini2440移植u ...

  6. mini2440移植uboot 2014.04(二)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <u-boot-2011 ...

  7. mini2440移植uboot 2014.04(三)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文档: s3c2440手册(下载地址) ...

  8. mini2440移植uboot 2014.04(一)

    最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...

  9. Ubuntu14.04 Tomcat 安装过程记录

    Ubuntu14.04 Tomcat 安装过程记录 检查java的版本 zhousp@ubuntu:~$ sudo java -version [sudo] password for zhousp: ...

随机推荐

  1. Visual Studio Code初探

    作者:Grey 本文的GIF动画均使用ScreenToGif进行录制. 摘要 微软今年发布了一款运行于 OS X,Windows 和 Linux 之上的免费跨平台编辑器: Visual Studio ...

  2. Ajax学习整理

    什么是ajax?W3School中给ajax的定义是: 1.AJAX = 异步 JavaScript 和 XML. 2.AJAX 是一种用于创建快速动态网页的技术. 3.通过在后台与服务器进行少量数据 ...

  3. 【WinRT】国内外 Windows 应用商店应用开发者博客收集

    本文格式:博主名 博客链接 本人点评.排名不分先后. 中文: 博客园: webabcd http://www.cnblogs.com/webabcd/ 微软最有价值专家(MVP),他做的 Win8.1 ...

  4. iOS开发之蓝牙通讯

    iOS开发之蓝牙通讯 一.引言 蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单.相关的蓝牙操作由专门的CoreBluetooth.framework进行 ...

  5. html5 canvas雨点打到窗玻璃动画

    html5 canvas雨点打到窗玻璃动画 HTML5下雨效果 效果预览:http://hovertree.com/texiao/html5/4.htm 以下是代码: <!doctype htm ...

  6. oracle中文显示为问号

    在用PL/sql查询时,中文显示为问号.经查证,发现问题为oracle字符集不支持中文导致的.修改oracle字符集,改为支持中文即可. 方法: 第一步:修改注册表. 开始-运行-输入regedit- ...

  7. asp.net.web如何简单生成和保存二维码图片的例子

    首先,要有生成二维码图片,需要二维码生成的类库,到官网下载thoughtWorks.QRCode.dll 例子的步骤: 1.创建项目QRCodeTest1,选择asp.net.web窗体应用程序

  8. 不可或缺 Windows Native (6) - C 语言: 函数

    [源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...

  9. 【洛谷 p3382】模板-三分法(算法效率)

    题目:给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 解法:与二分法枚举中点使区间分成2份不一样,三分法是枚举三分点,再根据题目的情况修 ...

  10. MAC下 JDK环境配置、版本切换以及ADB环境配置

    网上方法,自己总结:亲测可行! 一.JDK环境配置.版本切换: 通过命令’jdk6′, ‘jdk7′,’jdk8’轻松切换到对应的Java版本: 1.首先安装所有的JDk:* Mac自带了的JDK6, ...