uboot启动过程 3
uboot启动过程1描述到
_start -> reset -> save_boot_params -> save_boot_params_ret
-> cpu_init_cp15: 配置cp15, 关闭MMU什么的
ENTRY(relocate_code)
// __image_copy_start等同_start, 也就是0x87800000
ldr r1, =__image_copy_start /* r1 <- SRC &__image_copy_start */
// uboot启动过程2描述到reserve_uboot定位到了uboot的最终位置并赋值给gd->relocaddr
// uboot启动过程1由 r0 = gd->relocaddr, 并调用relocate_code, 所以这里r4为两者offset
subs r4, r0, r1 /* r4 <- relocation offset */
beq relocate_done /* skip relocation */ // 源和目标相同,不用复制
// 通过uboot.lds可知, 其实bss部分没有被复制
ldr r2, =__image_copy_end /* r2 <- SRC &__image_copy_end */
copy_loop:
ldmia r1!, {r10-r11} /* copy from source address [r1] */
stmia r0!, {r10-r11} /* copy to target address [r0] */
cmp r1, r2 /* until source end address [r2] */
blo copy_loop
/*
* fix .rel.dyn relocations
*/
ldr r2, =__rel_dyn_start /* r2 <- SRC &__rel_dyn_start */
ldr r3, =__rel_dyn_end /* r3 <- SRC &__rel_dyn_end */
fixloop:
ldmia r2!, {r0-r1} /* (r0,r1) <- (SRC location,fixup) */
and r1, r1, #0xff
cmp r1, #23 /* relative fixup? */
bne fixnext
/* relative fix: increase location by offset */
add r0, r0, r4
ldr r1, [r0]
add r1, r1, r4
str r1, [r0]
fixnext:
cmp r2, r3
blo fixloop
relocate_done:
#ifdef __XSCALE__
/*
* On xscale, icache must be invalidated and write buffers drained,
* even with cache disabled - 4.2.7 of xscale core developer's manual
*/
mcr p15, 0, r0, c7, c7, 0 /* invalidate icache */
mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */
#endif
/* ARMv4- don't know bx lr but the assembler fails to see that */
#ifdef __ARM_ARCH_4__
mov pc, lr
#else
bx lr
#endif
ENDPROC(relocate_code)
最新文章
- 【转】理解Java Integer的缓存策略
- 数据结构之图 Part2 - 3
- ionic:Build mobile apps faster with the web technologies you know and love
- redis ltrim命令
- CentOS 6下安装nodejs 0.9.0
- B题 - A+B for Input-Output Practice (I)
- Database name和SID
- 合理的keyword密度散布与黑帽SEO之躲藏文本
- 美版SOLOWHEEL与盗版SOLOWHEEL-IPS独轮车终极PK【图】_厂商资讯_太平洋电脑网
- spdlog源码阅读 (2): sinks的创建和使用
- 利用arpspoof和urlsnarf 进行ARP嗅探
- 关于APP在小米5s第一次安装启动后,点击home返回桌面,再次进入重进闪屏页问题
- 微信退款流程,以及在过程中遇见的错误和解决方式(php 语言)
- 【洛谷P1164 小A点菜】
- Ubuntu 16.04下安装zsh和oh-my-zsh
- jdk写webservice
- stm32复位引脚NRST
- 【AI科技大本营】
- SIGTERM等信号含义【转】
- kindeditor自定义插件插入视频代码
热门文章
- (GDB) GDB调试技巧,调试命令
- 一个宁静祥和没有bug的下午和SqlSession的故事
- 关于解决Failed on cp file to /system - Cross-device link 报错
- 如何理性看待国内大热的HuTool工具包
- python 之用户自定义函数
- JavaScript:控制跳转:break、continue与标签
- 6、发送验证码功能(Redis)
- vm虚拟机进入boot manager解决
- 微信小程序转发onShareAppMessage设置path参数后在onload获取不到值的原因和解决方法
- SPOJ GCDMAT - GCD OF MATRIX