uboot源码分析(3)
来源:互联网 发布:周相 与太祖 知乎 编辑:程序博客网 时间:2024/05/18 17:40
正式开始了第二阶段:
relocate部分的代码负责把U-Boot Stage2的代码从Flash存储器加载到内存,代码如下:
- 163
#ifndef CONFIG_SKIP_RELOCATE_UBOOT - 164
relocate : - 165
adr r0, _start -
// 获取当前代码存放地址 00000000 - 166
ldr r1, _TEXT_BASE -
// 获取内存存放代码地址 33f80000 - 167
cmp r0, r1 -
// - 168
beq stack_setup - 169
//开始加载 - 170
ldr r2, _armboot_start // 获取stage2代码存放地址 - 171
ldr r3, _bss_start // 获取内存代码段起始地址 - 172
sub r2, r3, r2 -
// 不包括向量表,U-BOOT的整个大小 - 173
add r2, r0, r2 -
33f80000 size // 计算stage2代码结束地址 - 174
- 175
copy_loop: - 176
ldmia r0!, {r3-r10} -
// 从Flash复制代码到内存 - 177
stmia r1!, {r3-r10} - 178
cmp r0, r2 - 179
ble copy_loop - 180
#endif - 181
- 182
-
// 在内存中建立堆栈 - 183
stack_setup: - 184
ldr r0, _TEXT_BASE - 185
sub r0, r0, #CFG_MALLOC_LEN // 分配内存区域 - 186
sub r0, r0, #CFG_GBL_DATA_SIZE - 187
#ifdef CONFIG_USE_IRQ - 188
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) - 189
#endif - 190
sub sp, r0, #12 - 191
- 192
clear_bss: // 初始化内存bss段内容为0 - 193
ldr r0, _bss_start -
// 查找bss段起始地址 - 194
ldr r1, _bss_end // 查找bss段结束地址 - 195
mov r2, #0x00000000 // 清空bss段内容 - 196
- 197
clbss_l: str r2, [r0] - 198
add r0, r0, #4 - 199
cmp r0, r1 - 200
ble clbss_l - 223
ldr pc, _start_armboot // 设置程序指针为start_armboot()函数地址 - 224
- 225
_start_armboot: - .word
start_armboot //这里是个C的函数名字,也就是入口地址
代码解释:
- uboot源码分析(3)
- uboot源码分析(3)
- uboot源码分析(3)
- uboot源码分析(1)
- uboot源码分析(2)
- uboot源码分析(4)
- uboot源码分析(1)
- uboot源码分析(2)
- uboot源码分析(4)
- uboot源码分析(1)
- uboot源码分析(2)
- uboot源码分析(4)
- UBOOT源码分析(详细)
- uboot 源码分析(2)uboot 环境变量实现简析
- Uboot 分析(3)
- uboot的源码目录分析2~3
- uboot Makefile源码分析
- uboot源码简要分析
- android 多线程断点续传下载 二
- gdb 调试
- poj 1523 (统计割点,及割点所分割的块数)
- 用来JTable控制输入数字判断
- 在Windows Server2008R2中导入Excel不能使用Jet 4.0的解决方法
- uboot源码分析(3)
- 库函数调用和系统调用的区别
- ORA-00600: internal error code, arguments: [15764] 引起的宕机及处理过程
- 浙江移动手机停机复机业务办理工具 最近做的
- 调试流程(暂定)
- 关于bitset 的一段代码--初级
- 快速傅里叶变换(FFT)的原理、实现及代码解析(附C#源码)
- SSO解决方案 - CAS/SMAL 介绍
- ABAP 使用DYNP_VALUES_READ来获取屏幕字段值