u-boot-2014.10移植第10天----深入分析代码(五)

硬件平台:tq2440

开发环境:Ubuntu-3.11

u-boot版本:2014.10

本文允许转载,请注明出处:http://blog.csdn.net/fulinus

b   relocate_code

ENTRY(relocate_code)
    ldr r1, =__image_copy_start /* r1 <- SRC &__image_copy_start */  //r1为u-boot.lds文件中__image_copy_start的地址。
    subs    r4, r0, r1      /* r4 <- relocation offset */  //r0 = gd->reloc_off , r4 = r0 - r1
    beq relocate_done       /* skip relocation */
    ldr r2, =__image_copy_end   /* r2 <- SRC &__image_copy_end */

copy_loop:

ldmia   r1!, {r10-r11}      /* copy from source address [r1]    */      //r1中放在u-boot代码的起始位置__image_copy_star,将r1地址中的8个字节拷贝到r10和r11寄存器中,r1自加8(?不确定)
    stmia   r0!, {r10-r11}      /* copy to   target address [r0]    */     //r0中放在要拷贝到那里去的目的地址,即r0 = gd->reloc_of,将r10和r11寄存器中的值,放在r0地址中的8个字节。

cmp r1, r2          /* until source end address [r2]    */ //比较r1和r2的值,r2也就是要拷贝代码的结束地址__image_copy_end。
    blo copy_loop //如果r1小于r2跳转

/*
     * fix .rel.dyn relocations
     */
    ldr r2, =__rel_dyn_start    /* r2 <- SRC &__rel_dyn_start */
    ldr r3, =__rel_dyn_end  /* r3 <- SRC &__rel_dyn_end */

http://blog.csdn.net/skyflying2012/article/details/37660265,按照这篇博文中的说法,这里拷贝一些和地址有关系的内容。毕竟重定位了,有些依赖绝对地址的值在这里据需要修改,但是不是在rel.dyn段中修改,而是将值加上偏移量,即加上relocation offset的值,并把它按照原先的顺序放到重定位的rel.dynl段中。
fixloop:
    ldmia   r2!, {r0-r1}        /* (r0,r1) <- (SRC location,fixup) */   //__rel_dyn_start起始的值拷贝到r0和r1寄存器中。
    and r1, r1, #0xff  //r1和0xFF相与运算,下面会用来判断是否等于0x17,上面说的博文中说“网上查阅资料,这里对于rel.dyn段中每一个rel section(8个字节)第二个4字节,0x17,是一种label的类型R_ARM_RELATIVE”

80eba944:       80e9d40c        rschi   sp, r9, ip, lsl #8
80eba948:       00000017        andeq   r0, r0, r7, lsl r0

80ebc18c:       80eaa54c        rschi   sl, sl, ip, asr #10
80ebc190:       00000017        andeq   r0, r0, r7, lsl r0
    cmp r1, #23         /* relative fixup? */
    bne fixnext //不相等就跳,说明这不是一个与地址相关的内容所以就不用拷贝。

/* relative fix: increase location by offset */
    add r0, r0, r4   //上面 /* r4 <- relocation offset */  //r0 = gd->reloc_off , r4 = r0 - r1,这四条语句就是在将内存中表示的地址加上重定位的偏移量,再将这个地址中的值(估计是另一个地址)也加上重定位的偏移量
    ldr r1, [r0]  获取地址中的值
    add r1, r1, r4 //值再加上偏移量。
    str r1, [r0] 保存到重定位的rel.dyn段中去。
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 */

//记得前面lr的值已经加上了偏移量,所以这里就跳到了重定位的地方去执行了。

#ifdef __ARM_ARCH_4__
    mov        pc, lr
#else
    bx    
#endif

ENDPROC(relocate_code)

时间: 2024-07-31 09:03:50

u-boot-2014.10移植第10天----深入分析代码(五)的相关文章

u-boot-2014.10移植第9天----深入分析代码(四)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus ENTRY(_main) /* * Set up initial C runtime environment and call board_init_f(0). */ #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK) //在smdk2410开发板的相

u-boot-2014.10移植第8天----深入分析代码(三)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 接着第七天的代码分析,下面是cpu_init_crit的代码段,同样位于文件arch/arm/cpu/arm920t/start.S中: /* ************************************************************************* * * CPU_init_cri

u-boot-2014.10移植第11天----深入分析代码(六)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus "从relocate_code回到_main中,接下来是main最后一段代码"也就是arch/arm/lib/crt0.S文件中: b   relocate_codehere://从这里开始u-boot已经在重定位的地方运行了 /* Set up final (full) environment */ bl  c

u-boot-2014.10移植第6天----深入分析代码(一)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 前面我们看到了一个lds文件,我们这里深入的了解一下: section.c: /* * Copyright: (C) 2014 EAST fulinux <[email protected]> */ #include <stdio.h> #include <stdlib.h> int localm

u-boot-2014.10移植第12天----深入分析代码(七)

c_runtime_cpu_setup函数在arch/arm/cpu/arm920t/start.S文件中: .globl  c_runtime_cpu_setupc_runtime_cpu_setup:  mov pc, lr //没做什么就返回了 回到arch/arm/lib/crt0.S文件中: bl  c_runtime_cpu_setup /* we still call old routine here */ //bss段清零    ldr r0, =__bss_start    /

u-boot-2014.10移植第7天----深入代码分析(二)

现在从代码的角度来分析启动的流程: 从u-boot.lds文件知: ENTRY(_start) SECTIONS { . = 0x00000000; . = ALIGN(4); .text : { *(.__image_copy_start) *(.vectors) CPUDIR/start.o (.text*) *(.text*) } 文件中__image_copy_start位映像文件复制起始地址,它在文件arch/arm/lib/sections.c中如下定义: char __image_

2014年7月10日,我人生的最重要Upgrade

2014年7月10日上午,我的小公主顺利的出生于国妇婴.之前各种紧张,各种不安.在不安中的前天晚上陪着来上海的董博士于方先生在人民广场聚餐.大家都是工作几年的,各种感慨,对于工作中的零零种种.还有对未来的模糊规划.在近11点,散伙回家,在酒精的刺激下,终于睡了个好觉. 在10号的六点半,起床,快速的洗漱后打车到国妇婴,要赶到早高峰之前到达,要知道,从浦东到浦西还是有很多红绿灯的,尽管只有15公里.到达了,陪着老婆做产前的各种检查.当确定了产后还是住六人间的小床后,觉得不可思议,怎么能让产妇和新生

u-boot-2014.10移植第25天----nand flash启动(三)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 在实现u-boot从nand flash启动之前,我们将前面asm_led程序放在nand flash第一个块的前4Kbit之中,因为asm_led没有系统初始化功能,所以还需要将bootstrap程序,放在nand flash的0地址处.bootstrap初始化完2440后,跳转到asm_led程序去执行.这对于掌握从n

2014年5月10日

时间是毫不留情的,一晃,半年的时间又将过去. 这不仅仅是焦虑,也有无从着手之感. 北京,郊区的出租屋,月薪5K,单身:其实,我过得不错.每天回家,第一件事就是打开电脑,打开chrome,打开央广网的中国之声直播,如果它在播广告,就换到经济之声.这是从大学当播音员以来一直的习惯,也是为了房间里有点声音. 从去年5月到这座我不太喜欢的城市,已经一年,我才想起写些什么东西.By the way,除了空气,并没有什么不满,北京给我机会,给我工作,上天待我很优厚了(笑). 前两年,浑浑噩噩的,毕业两年的时