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: ...
随机推荐
- 浅谈Struts2拦截器的原理与实现
拦截器与过滤器 拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...
- AC自动机 - 多模式串匹配问题的基本运用 + 模板题 --- HDU 2222
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- Orleans之Hello World
接触Orleans 有一段时间了,之前也翻译了一系列官网文档,今天我们就来一个实际的例子,来看看到底如何用这个东西来开发项目,当然经典的也是醉人的,我们就从HelloWorld开始吧. 通过前面的知识 ...
- .Net 自定义应用程序配置
.Net 自定义应用程序配置 引言 几乎所有的应用程序都离不开配置,有时候我们会将配置信息存在数据库中(例如大家可能常会见到名为Config这样的表):更多时候,我们会将配置写在Web.config或 ...
- easyui-treegrid节点选择
easyui-treegrid本身不能实现选中父节点子节点全选,必须通过另外的方法来实现,这里说下如何通过修改节点样式添加checkbox来实现级联选择效果 首先需要格式化节点的样式 formatte ...
- css3中的zoom元素属性值测试
在样式表里头看到zoom:1的设置,很是好奇就去找了一些资料发现关于这个的讲述还是比较少. 理论知识 语法: zoom:normal | <number> | <percentage ...
- Ext.NET 4.1.0 GridPanel数据分页
针对大量数据在前端展示,需要进行分页显示,这里我使用的数据量为100万,数据存储在MongoDb中(也可以存储在本地文件或其它数据库中).最终显示效果如下: 步骤如下: 1.新建程序并配置,详见htt ...
- 常用SQL查询语句
一.简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ...
- No.011:Container With Most Water
问题: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...
- mysql内存消耗分析
最近有些生产服务器老是mysql内存不停得往上涨,开发人员和维护反馈,用了不少的临时表,问题时常线上发生,测试又一直比较难重现. 经观察mysql内存的os占用趋势,发现从8:40开始,mysql内存 ...