uboot 2014.04 运行过程记录
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 运行过程记录的更多相关文章
- mini2440移植uboot 2014.04(六)
上一篇博文:<mini2440移植uboot 2014.04(五)> 代码已经上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04- ...
- mini2440移植uboot 2014.04(五)
代码上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440 前几篇博文: <mini2440移植uboot 2014.04 ...
- Python3.x:logging模块对运行过程记录
Python3.x:logging模块对运行过程记录 示例: import logging # 设置 logger = logging.getLogger() #set loghandler #默认路 ...
- mini2440移植uboot 2014.04(七)
上一篇博文:<mini2440移植uboot 2014.04(六)> 代码已经上传到github上: https://github.com/qiaoyuguo/u-boot-2014.04 ...
- mini2440移植uboot 2014.04(四)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <mini2440移植u ...
- mini2440移植uboot 2014.04(二)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <u-boot-2011 ...
- mini2440移植uboot 2014.04(三)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文档: s3c2440手册(下载地址) ...
- mini2440移植uboot 2014.04(一)
最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...
- Ubuntu14.04 Tomcat 安装过程记录
Ubuntu14.04 Tomcat 安装过程记录 检查java的版本 zhousp@ubuntu:~$ sudo java -version [sudo] password for zhousp: ...
随机推荐
- Scrum 项目5.0--软件工程
1.燃尽图: 2.每日立会更新任务板上任务完成情况.燃尽图的实际线,分析项目进度是否在正轨. 每天的例会结束后的都为任务板拍照并发布到博客上 团队贡献分: 蔡舜 : 21 卢晓洵 : 1 ...
- 设置数据库为SINGLE_USER模式,减少锁定时间
--SQL Server开启READ_COMMITTED_SNAPSHOT ----设置数据库为SINGLE_USER模式,减少锁定时间 ALTER DATABASE ENDV_SOA SET SIN ...
- How to remove replication in SyteLine V2
以前曾经写了一篇<How to remove replication in Syteline>http://www.cnblogs.com/insus/archive/2011/12/20 ...
- jQuery的事件one
如果你只想你设计的对象只能让用户执行一次的话,可以使用jQuery的事件one()来实现. 演示一个,创建视图, 看看效果:
- asp.net的code-Behind技术
新建一个VS.NET下的项目..看到ASPX,RESX和CS三个后缀的文件了吗??这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理. code-Behind:asp.net中的 ...
- 数据库一次性插入10w条数据,怎么插入效率快
在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题 下面介绍SQL Server支持的两种批量 ...
- DataTable 获取列名 DataTable批量更新至数据库
好久没写东西了,这几个月也没下功夫钻研技术,愧疚啊.说下最近刚学会的DataTable 的用法吧,新手适合看下. 1 DataTable 获取列名 在处理数据的时候大家都会用到模型,从datatabl ...
- HTML5 Wijmo:控制 Wijmo Grid 插件的编辑模式
Wijmo jQuery 插件经常应用于在财务类网站中创建平滑和良好用户体验的交互表格.WijGrid 插件用于显示.排序.分组和编辑数据.今天我们来分享下如何控件WijGrid插件的编辑模式. 在本 ...
- Win7配置Go环境
最近想学习下Go语言,先从最基本的Hello Go开始,搭建Go开发环境 一.下载Go包 由于Go官网国内访问经常有问题,可以从国内的镜像下载: http://www.golangtc.com/ 二. ...
- Access-Control-Allow-Origin: Dealing with CORS Errors in Angular
https://daveceddia.com/access-control-allow-origin-cors-errors-in-angular/ Getting this error in you ...