uboot dcc
arch\arm\lib crt0.S
1.设置sp为CONFIG_SYS_INIT_SP_ADDR
include/configs/xxx.h
#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_INIT_RAM_ADDR + \
CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
#define CONFIG_SYS_INIT_RAM_ADDR 0x20000
#define CONFIG_SYS_INIT_RAM_SIZE 0x1000
include/generated/generic-asm-offsets.h
#define GENERATED_GBL_DATA_SIZE 192 /* (sizeof(struct global_data) + 15) & ~15 @ */
CONFIG_SYS_INIT_SP_ADDR=0x20F40
2.调用board_init_f_alloc_reserve
没有定义SYS_MALLOC_F_LEN,不执行。这里不对
make distclean后,CONFIG_SYS_MALLOC_F_LEN默认值0x400
top初始值0x20F40
#if CONFIG_VAL(SYS_MALLOC_F_LEN)
top -= CONFIG_VAL(SYS_MALLOC_F_LEN); #top=0x20B40
#endif
top = rounddown(top-sizeof(struct global_data), 16); #top=0x20A80
3. r9(gd) = sp = top;
gd地址定了。CONFIG_SYS_INIT_SP_ADDR=0x20A80

4.调用board_init_f
注意:串口初始化之后才能打印输出。
setup_dest_addr
#ifdef CONFIG_SYS_SDRAM_BASE
gd->ram_top = CONFIG_SYS_SDRAM_BASE;
#endif
gd->ram_top += get_effective_memsize();
gd->ram_top = board_get_usable_ram_top(gd->mon_len);
gd->relocaddr = gd->ram_top;
debug("Ram top: %08lX\n", (ulong)gd->ram_top);
gd->ram_top=0x20000+0x40000=0x60000
gd->relocaddr=gd->ram_top=0x60000
reserve_uboot --> Reserving 192k for U-Boot at: 0002f000 gd->relocaddr到此为止,之后gd->start_addr_sp出场
reserve_malloc --> Reserving 4k for malloc() at: 0002de70
reserve_board --> Reserving 80 Bytes for Board Info at: 0002de20
reserve_global_data --> Reserving 192 Bytes for Global Data at: 0002dd60 gd->new_gd
reloc_fdt --> 因为CONFIG_OF_EMBED,所以不执行什么
reloc_bootstage --> 因为没有定义CONFIG_BOOTSTAGE,所以不执行什么
reserve_arch --> 空
reserve_stacks --> gd->start_addr_sp -= 16; gd->start_addr_sp &= ~0xf; 调用arch_reserve_stacks(定义在arch\arm\lib\stack.c)gd->start_addr_sp -= 16; 一共减32byte
display_new_sp --> New Stack Pointer is: 0002dd40
setup_reloc --> gd->reloc_off = gd->relocaddr - (unsigned long)__image_copy_start; gd->relocaddr=0002f000 __image_copy_start就是CONFIG_SYS_TEXT_BASE=0x2f000
Relocation Offset is: 00000000
Relocating to 0002f000, new gd at 0002dd60, sp at 0002dd40
ldr r0, [r9, #GD_START_ADDR_SP] /* sp = gd->start_addr_sp */
bic r0, r0, #7 /* 8-byte alignment for ABI compliance */
mov sp, r0 //定义新sp 之前为0x21000
ldr r9, [r9, #GD_BD] /* r9 = gd->bd */
sub r9, r9, #GD_SIZE /* new GD is below bd */
adr lr, here
ldr r0, [r9, #GD_RELOC_OFF] /* r0 = gd->reloc_off */
add lr, lr, r0
#if defined(CONFIG_CPU_V7M)
orr lr, #1 /* As required by Thumb-only */
#endif
ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
b relocate_code
如果gd->relocaddr和__image_copy_start相等
ldr r1, =__image_copy_start /* r1 <- SRC &__image_copy_start */
subs r4, r0, r1 /* r4 <- relocation offset */
beq relocate_done /* skip relocation */
就跳过搬移。
所以整个过程中,搬移的就只有gd_t。
如何计算defconfig中的CONFIG_SYS_TEXT_BASE
vi u-boot.map
setup_mon_len中
gd->mon_len = (ulong)&__bss_end - (ulong)_start;
reserve_uboot
gd->relocaddr -= gd->mon_len;
__bss_end
0x000000000005f3a0
.__image_copy_start
0x0000000000033000
gd->mon_len=0x2c3a0
gd->relocaddr=gd->ram_top-gd->mon_len(u-boot)=0x60000-0x2c3a0=0x33c60
后三位清零,4K对齐 gd->relocaddr &= ~(4096 - 1);
gd->relocaddr=0x33000
即CONFIG_SYS_TEXT_BASE设置为gd->relocaddr=0x33000__image_copy_start
即可跳过搬移。
uboot dcc的更多相关文章
- 调试dcc 试图将u-boot放入ocm运行碰到的问题
1. 起因: gd->mon_len = (ulong)&__bss_end - (ulong)_start; 在u-boot.map中查找,发现__bss_end并不是u-boot.b ...
- 用Qemu模拟vexpress-a9 (五) --- u-boot引导kernel,device tree的使用
环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...
- Linux主机上使用交叉编译移植u-boot到树莓派
0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...
- uboot环境配置
uboot环境配置 通过配置uboot让它在启动过程中从tftp获取内核和设备树,并从在加载内核之后把通过启动参数将"从nfs挂载根文件系统"传入内核.这个配置主要是通过uboot ...
- u-boot-2015.04 在tq2440上的移植(使用spl引导u-boot)
本次移植跟以往的不同之处是采用了spl来引导u-boot,参考了博客http://blog.csdn.net/fulinus/article/details/42738641 下载链接:http:// ...
- u-boot源码分析之C语言段
题外话: 最近一直在学习u-boot的源代码,从代码量到代码风格,都让我认识到什么才是真正的程序.以往我所学到的C语言知识和u-boot的源代码相比,实在不值一提.说到底,机器都是0和1控制的.感觉这 ...
- u-boot源码汇编段简要分析
Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ...
- u-boot的配置、编译及链接
第一次写技术博客,还有些兴奋呢.我是CrazyCatJack,大家可以叫我CCJ或者疯猫.我即将成为一名嵌入式Linux的驱动工程师,现在还是一枚大四狗,呼呼~大学期间做了一些项目和比赛,都是基于32 ...
- uboot的配置流程分析
简单介绍一下uboot的基本配置流程.和绝大多数源码编译安装一样,uboot在执行make之前需要执行make XXXconfig来配置相关信息,而且uboot本身是针对多种平台的bootloader ...
随机推荐
- 2019-7-29未命名文件 sdfsdfsdf
2019-7-29未命名文件 sdfsdfsdf 新建模板小书匠 欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过设置里的修改模板来改变新建文章的内容.
- golang入门案例之SOCKET
//服务端代码package main import ( "fmt" "net" "log" "os" "en ...
- self-training and co-training
半指导学习(Semi-supervised Learning)的概念说起来一点儿也不复杂,即从同时含有标注数据和未标注数据的训练集中学习模型.半指导学习是介于有指导学习与无指导学习之间的一种机器学习方 ...
- Hibernate框架 初识 ORM概念
Hibernate概述 Hibernate是一个ORM(对象关系映射)映射框架,它的核心思想就是在底层对JDBC进行了一次封装. 什么是框架 IT语境中的框架,特指为解决一个开放性问题而设计的具有一定 ...
- Stream流实现斐波那契数列
1.前言 我们都知道斐波那契数列有很多种实现方法,在jdk1.8以前没有流操作,只能通过递归或者迭代等其他方式来实现斐波那契数列, 但是jdk1.8以后,有了流操作,我们就可以使用流来实现斐波那契数列 ...
- 【HANA系列】SAP HANA 2.0 SPS00 SDA(Smart Data Access)连接Hadoop
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA 2.0 SPS ...
- LeetCode.1033-移动石头直到连续(Moving Stones Until Consecutive)
这是小川的第386次更新,第414篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第247题(顺位题号是1033).在a,b和c位置的数字线上有三块石头.每次,你在一个终点 ...
- Alias sample(别名采样)
应用场景:加权采样,即按照随机事件出现的概率抽样 具体算法: 举例如上,随机事件出现的概率依次是1/2,1/3,1/12,1/12;记随机事件的个数为N,则所有事件概率乘以N后概率为2,4/3,1/3 ...
- 跨域设置之corsheaders
安装 pip install django-cors-headers 注册应用 INSTALLED_APPS = ( ... 'corsheaders', ... ) 中间层设置 MIDDLEWARE ...
- Akka系列(六):Actor解决了什么问题?
前言..... 文档来源于 : What problems does the actor model solve? Actor解决了什么问题? Akka使用Actor模型来克服传统面向对象编程模型的 ...