ti-sdk-evm-am335x-05.07 uboot分析(MLO跳转到u-boot之前)
Start.s Start
continue...
lowlevel_init Start(lowlevel_init.s)
当中LOW_LEVEL_SRAM_STACK定义在asm/arch/omap.h文件中面。
lowlevel_init End(lowlevel_init.s)
call_board_init_f Start(start.s)
relocate_code Start(start.s)
* void relocate_code (addr_sp, gd, addr_moni)
*
* This "function" does not return, instead it continues in RAM
* after relocating the monitor code.
*
*/
.globl relocate_code
relocate_code:
mov r4, r0 /* save addr_sp */
mov r5, r1 /* save addr of gd */
mov r6, r2 /* save addr of destination */
/* Set up the stack */
stack_setup:
mov sp, r4
adr r0, _start
cmp r0, r6
moveq r9, #0 /* no relocation. relocation offset(r9) = 0 */
beq clear_bss /* skip relocation */
mov r1, r6 /* r1 <- scratch for copy_loop */
ldr r3, _image_copy_end_ofs
add r2, r0, r3 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r9-r10} /* copy from source address [r0] */
stmia r1!, {r9-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end address [r2] */
blo copy_loop
#ifndef CONFIG_SPL_BUILD
/*
* fix .rel.dyn relocations
*/
ldr r0, _TEXT_BASE /* r0 <- Text base */
sub r9, r6, r0 /* r9 <- relocation offset */
ldr r10, _dynsym_start_ofs /* r10 <- sym table ofs */
add r10, r10, r0 /* r10 <- sym table in FLASH */
ldr r2, _rel_dyn_start_ofs /* r2 <- rel dyn start ofs */
add r2, r2, r0 /* r2 <- rel dyn start in FLASH */
ldr r3, _rel_dyn_end_ofs /* r3 <- rel dyn end ofs */
add r3, r3, r0 /* r3 <- rel dyn end in FLASH */
fixloop:
ldr r0, [r2] /* r0 <- location to fix up, IN FLASH! */
add r0, r0, r9 /* r0 <- location to fix up in RAM */
ldr r1, [r2, #4]
and r7, r1, #0xff
cmp r7, #23 /* relative fixup?
*/
beq fixrel
cmp r7, #2 /* absolute fixup?
*/
beq fixabs
/* ignore unknown type of fixup */
b fixnext
fixabs:
/* absolute fix: set location to (offset) symbol value */
mov r1, r1, LSR #4 /* r1 <- symbol index in .dynsym */
add r1, r10, r1 /* r1 <- address of symbol in table */
ldr r1, [r1, #4] /* r1 <- symbol value */
add r1, r1, r9 /* r1 <- relocated sym addr */
b fixnext
fixrel:
/* relative fix: increase location by offset */
ldr r1, [r0]
add r1, r1, r9
fixnext:
str r1, [r0]
add r2, r2, #8 /* each rel.dyn entry is 8 bytes */
cmp r2, r3
blo fixloop
b clear_bss
_rel_dyn_start_ofs:
.word __rel_dyn_start - _start
_rel_dyn_end_ofs:
.word __rel_dyn_end - _start
_dynsym_start_ofs:
.word __dynsym_start - _start
#endif /* #ifndef CONFIG_SPL_BUILD */
clear_bss:
#ifdef CONFIG_SPL_BUILD
/* No relocation for SPL */
ldr r0, =__bss_start
ldr r1, =__bss_end__
#else
ldr r0, _bss_start_ofs
ldr r1, _bss_end_ofs
mov r4, r6 /* reloc addr */
add r0, r0, r4
add r1, r1, r4
#endif
mov r2, #0x00000000 /* clear */
clbss_l:str r2, [r0] /* clear loop... */
add r0, r0, #4
cmp r0, r1
bne clbss_l
/*
* We are done. Do not return, instead branch to second part of board
* initialization, now running from RAM.
*/
jump_2_ram:
/*
* If I-cache is enabled invalidate it
*/
#ifndef CONFIG_SYS_ICACHE_OFF
mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
mcr p15, 0, r0, c7, c10, 4 @ DSB
mcr p15, 0, r0, c7, c5, 4 @ ISB
#endif
ldr r0, _board_init_r_ofs
adr r1, _start
add lr, r0, r1
add lr, lr, r9
/* setup parameters for board_init_r */
mov r0, r5 /* gd_t */
mov r1, r6 /* dest_addr */
/* jump to it ... */
mov pc, lr
_board_init_r_ofs:
.word board_init_r - _start
ABI比API的要求更严格。它要求在寄存器级别遵守相同的接口规范。如函数调用的參数传递规则,
relocate_code End(start.s)
call_board_init_f End(start.s)
从以下的图中能够看到:
mov r4, r0 /* save addr_sp */
mov r5, r1 /* save addr of gd */
mov r6, r2 /* save addr of destination */
mov sp, r4
cmp r0, r6
moveq r9, #0 /* no relocation. relocation offset(r9) = 0 */
beq clear_bss /* skip relocation */
mov r1, r6 /* r1 <- scratch for copy_loop */
ldr r3, _image_copy_end_ofs
add r2, r0, r3 /* r2 <- source end address */
Start.s End
board_init_r Start(start.s)
spl_mmc_load_image Start(board_init_r)
board_init_r End(start.s)
转载于:https://www.cnblogs.com/zhchoutai/p/8447866.html
ti-sdk-evm-am335x-05.07 uboot分析(MLO跳转到u-boot之前)相关推荐
- ti processor sdk linux am335x evm /bin/setup-uboot-env.sh hacking
#!/bin/sh# # ti processor sdk linux am335x evm /bin/setup-uboot-env.sh hacking # 说明: # 本文主要对TI的sdk中的 ...
- ti processor sdk linux am335x evm /bin/create-sdcard.sh hacking
#!/bin/bash# # ti processor sdk linux am335x evm /bin/create-sdcard.sh hacking # 说明: # 本文主要对TI的sdk中的 ...
- ti processor sdk linux am335x evm /bin/setup-minicom.sh hacking
#!/bin/sh# # ti processor sdk linux am335x evm /bin/setup-minicom.sh hacking # 说明: # 本文主要对TI的sdk中的se ...
- uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)
项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...
- TI AWR1642BOOST-ODS EVM开发板入门
欢迎转载,请注明出处,谢谢! 最近做一个小测试要用到TI AWR1642BOOST-ODS EVM开发板,查询相关资料后,现在初步可以跑起来官方demo, 简单备忘一下. 概要 2. 可参考文档 以 ...
- U-BOOT分析(二)之顶层Makefile文件(1)
U-BOOT分析(二)之顶层Makefile文件(1) U-BOOT版本 u-boot版本: u-boot-2021.01.tar.bz2 Makefile && make简介 ...
- 2022.05.07基金策略研究
投资背景: 自2022年1月1日以来,市场环境对于投资者来说极为不友好.与2020年机构抱团,蓝筹股一路向上的趋势相反,今年来各类基金持续回调,市场环境有多差呢?查询市场上基金数据可以发现,在所有基金 ...
- 数据分析学习总结笔记05:缺失值分析及处理
数据分析学习总结笔记05:缺失值分析及处理 1 缺失值概念 2 缺失值分析的类别 2.1 按数据缺失形式划分 2.2 按缺失机制与方式划分 3 缺失值的处理方法 3.1 删除缺失值 3.2 缺失值替代 ...
- u-boot分析之编译体验(零)
目录 u-boot分析之编译体验 1. 嵌入式系统与pc系统的启动对比概述 2.如何应用补丁文件生成uboot.bin文件,步骤: 3. uboot里要实现的功能 3.1 uboot最终目的是启动内核 ...
- u-boot分析(四)---设置异常向量表|设置SVC模式
u-boot分析(四) 通过前三篇的分析,我们对u-boot已经有了整体的认识和掌握,但是我们仍然对于其部分硬件是如何初始化的不太清楚,所以接下来几篇博文我将会对我们在http://www.cnblo ...
最新文章
- python xlsx 大文件_Python这样操作能存储100多万行的xlsx文件!Python让你事半功倍!
- Android 网络通信架构学习
- android gif转jpg格式文件,android使用多张图片合成gif文件
- cron java_cron表达式
- linux驱动基础开发0——linux 设备驱动概述-转
- [译]Ocelot - Headers Transformation
- pythonturtle哪个版本好,python3.7安装turtle(单纯为了好玩)
- 软考高项-信息系统项目管理师-精华笔记
- 单片机入门 - 模电、数电与单片机
- 迷惘一代、沉默一代、X世代、Z世代……美国的几代人
- 计算机学院毕业典礼口号,大学毕业典礼横幅标语大全
- 西游记笔记与想法(1)
- 程序员生涯之我见 找到自己的兴趣所在
- 网约车和社交融合靠不靠谱?
- 基于 SoC 的卷积神经网络车牌识别系统设计(4-4)基于 Verilog 的 Dilate Erode IP 设计
- Android 自定义View颜色选择器( 条形、水平),使用HSV颜色模型实现取色器并反向定位颜色所在位置
- Maya: Rendering with Arnold 5 Maya教程之Arnold5渲染 Lynda课程中文字幕
- 新动力计算机学校怎么样,东莞新动力Dj学校怎么样
- 记一次使用mybatisplus新增功能出现Could not set property ‘id‘ of class XXXXXXXX
- oracle创建record,oracle record | 学步园
热门文章
- OpenHarmony代码操作总结
- python 变量后加逗号的含义
- Android用悬浮按钮实现翻页效果
- 明清时期华北宗族的发展——以山西洪洞刘氏为例
- APK 签名:v1 v2 v3 v4
- 是你的栈啊-求你了告诉我逆波兰表达式
- 无盘服务器磁盘4k对齐,4K对齐:Win7磁盘管理分区教程_硬盘_内存硬盘技巧-中关村在线...
- 如何正确地在Spring Data JPA和Jackson中用上Java 8的时间相关API(即JSR 310也即java.time包下的众神器)...
- Java:计算代码耗时的5种方法
- 论文阅读《A Large Dataset to Train Convolutional Networks for Disparity, Optical Flow, and Scene Flow Es》