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

__image_copy_start 即CONFIG_SYS_TEXT_BASE设置为gd->relocaddr=0x33000

即可跳过搬移。

uboot dcc的更多相关文章

  1. 调试dcc 试图将u-boot放入ocm运行碰到的问题

    1. 起因: gd->mon_len = (ulong)&__bss_end - (ulong)_start; 在u-boot.map中查找,发现__bss_end并不是u-boot.b ...

  2. 用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 ...

  3. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

  4. uboot环境配置

    uboot环境配置 通过配置uboot让它在启动过程中从tftp获取内核和设备树,并从在加载内核之后把通过启动参数将"从nfs挂载根文件系统"传入内核.这个配置主要是通过uboot ...

  5. u-boot-2015.04 在tq2440上的移植(使用spl引导u-boot)

    本次移植跟以往的不同之处是采用了spl来引导u-boot,参考了博客http://blog.csdn.net/fulinus/article/details/42738641 下载链接:http:// ...

  6. u-boot源码分析之C语言段

    题外话: 最近一直在学习u-boot的源代码,从代码量到代码风格,都让我认识到什么才是真正的程序.以往我所学到的C语言知识和u-boot的源代码相比,实在不值一提.说到底,机器都是0和1控制的.感觉这 ...

  7. u-boot源码汇编段简要分析

    Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ...

  8. u-boot的配置、编译及链接

    第一次写技术博客,还有些兴奋呢.我是CrazyCatJack,大家可以叫我CCJ或者疯猫.我即将成为一名嵌入式Linux的驱动工程师,现在还是一枚大四狗,呼呼~大学期间做了一些项目和比赛,都是基于32 ...

  9. uboot的配置流程分析

    简单介绍一下uboot的基本配置流程.和绝大多数源码编译安装一样,uboot在执行make之前需要执行make XXXconfig来配置相关信息,而且uboot本身是针对多种平台的bootloader ...

随机推荐

  1. 代码实现:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%; 20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%; 60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元

    import java.util.Scanner; /* 企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成 ...

  2. 封装cookie,自定义过期时间,domain,path

    在使用Cookie进行存储的时候,遇到了许多不可思议的bug,特地标识出来,以作总结. 是这样一个项目,登录是放在官网进行操作的,而登录进入的是后台,后台和官网属于同一域名的不同目录,那么常规进行co ...

  3. javase程序设计上机作业1

    package javaxgp.teacher.test; import java.math.BigInteger; import java.util.Scanner; import java.uti ...

  4. python基本成分详解

    字符串 一.需要了解的 msg = 'HelloWorld' 1.isdecimal判断是否是十进制(整数)w print(msg.isdecimal()) 2.endswith判断字符串末尾是否是指 ...

  5. https原理以及golang基本实现

    关于https 背景知识 密码学的一些基本知识 大致上分为两类,基于key的加密算法与不基于key的加密算法.现在的算法基本都是基于key的,key就以一串随机数数,更换了key之后,算法还可以继续使 ...

  6. 9.Jmeter 多个threadgroup 中的配置元件会一次性进行初始化

    例如3个threadGroup,每一个threadGroup中都会定义了 一些配置原件,例如 用户定义变量,  jdbc 链接配置等.  当执行testplan(测试计划)时, 这些配置元件会一起初始 ...

  7. RSA加密 抛异常 algid parse error, not a sequence

    JDK1.8环境 参考:BouncyCastle的使用:https://blog.csdn.net/qq_29583513/article/details/78866461 可解决 公钥解密 私钥加密 ...

  8. spring boot-15.缓存

    为了减轻数据库压力和提高访问速度,从spring3.1开始映入了基于注解的缓存机制. 1.Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, ...

  9. IOMETER的简单使用

    1. 网上下载文件: 一般至少包含两个: 2. 使用IOmeter 进行 功能测试. 注意选择 测试需要的盘 注意 选择的磁盘 会被充满. 会产生一个特别大的文件 3. 选择测试对象 4. 可以查看实 ...

  10. [转帖]2017年新闻: 中国CPU还在“群雄割据” ,印度已确定了国家指令集

    中国CPU还在“群雄割据” ,印度已确定了国家指令集 时间:2017-12-21 作者:观察者网 https://www.eet-china.com/news/201712210610.html   ...