免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1182 | 回复: 0
打印 上一主题 下一主题

从u-boot的启动代码理解arm代码位置的无关性 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 08:41 |只看该作者 |倒序浏览
    首先把u-boot应用于s3c2410的反汇编代码贴出来,其中第1列是行号,第2列是运行时地址。


   1  u-boot:     file format elf32-littlearm

     2  Disassembly of section .text:

     3  33f80000 <_start>:
     4  33f80000:       ea000012        b       33f80050 <reset>
     5  33f80004:       e59ff014        ldr     pc, [pc, #20]   ; 33f80020 <_undefined_instruction>
     6  33f80008:       e59ff014        ldr     pc, [pc, #20]   ; 33f80024 <_software_interrupt>
     7  33f8000c:       e59ff014        ldr     pc, [pc, #20]   ; 33f80028 <_prefetch_abort>
     8  33f80010:       e59ff014        ldr     pc, [pc, #20]   ; 33f8002c <_data_abort>
     9  33f80014:       e59ff014        ldr     pc, [pc, #20]   ; 33f80030 <_not_used>
    10  33f80018:       e59ff014        ldr     pc, [pc, #20]   ; 33f80034 <_irq>
    11  33f8001c:       e59ff014        ldr     pc, [pc, #20]   ; 33f80038 <_fiq>

    12  33f80020 <_undefined_instruction>:
    13  33f80020:       33f80140        .word   0x33f80140

    14  33f80024 <_software_interrupt>:
    15  33f80024:       33f801a0        .word   0x33f801a0

    16  33f80028 <_prefetch_abort>:
    17  33f80028:       33f80200        .word   0x33f80200

    18  33f8002c <_data_abort>:
    19  33f8002c:       33f80260        .word   0x33f80260

    20  33f80030 <_not_used>:
    21  33f80030:       33f802c0        .word   0x33f802c0

    22  33f80034 <_irq>:
    23  33f80034:       33f80320        .word   0x33f80320

    24  33f80038 <_fiq>:
    25  33f80038:       33f80380        .word   0x33f80380
    26  33f8003c:       deadbeef        .word   0xdeadbeef

    27  33f80040 <_TEXT_BASE>:
    28  33f80040:       33f80000        .word   0x33f80000

    29  33f80044 <_armboot_start>:
    30  33f80044:       33f80000        .word   0x33f80000

    31  33f80048 <_bss_start>:
    32  33f80048:       33f96c64        .word   0x33f96c64

    33  33f8004c <_bss_end>:
    34  33f8004c:       33f9b388        .word   0x33f9b388

    35  33f80050 <reset>:
    36  33f80050:       e10f0000        mrs     r0, CPSR
    37  33f80054:       e3c0001f        bic     r0, r0, #31     ; 0x1f
    38  33f80058:       e38000d3        orr     r0, r0, #211    ; 0xd3
    39  33f8005c:       e129f000        msr     CPSR_fc, r0
    40  33f80060:       e3a00453        mov     r0, #1392508928 ; 0x53000000
    41  33f80064:       e3a01000        mov     r1, #0  ; 0x0
    42  33f80068:       e5801000        str     r1, [r0]
    43  33f8006c:       e3e01000        mvn     r1, #0  ; 0x0
    44  33f80070:       e59f0360        ldr     r0, [pc, #864]  ; 33f803d8 <fiq+0x58>
    45  33f80074:       e5801000        str     r1, [r0]
    46  33f80078:       e59f135c        ldr     r1, [pc, #860]  ; 33f803dc <fiq+0x5c>
    47  33f8007c:       e59f035c        ldr     r0, [pc, #860]  ; 33f803e0 <fiq+0x60>
    48  33f80080:       e5801000        str     r1, [r0]
    49  33f80084:       e59f0358        ldr     r0, [pc, #856]  ; 33f803e4 <fiq+0x64>
    50  33f80088:       e3a01003        mov     r1, #3  ; 0x3
    51  33f8008c:       e5801000        str     r1, [r0]
    52  33f80090:       eb000018        bl      33f800f8 <cpu_init_crit>

    53  33f80094 <relocate>:
    54  33f80094:       e24f009c        sub     r0, pc, #156    ; 0x9c
    55  33f80098:       e51f1060        ldr     r1, [pc, #-96]  ; 33f80040 <_TEXT_BASE>
    56  33f8009c:       e1500001        cmp     r0, r1
    57  33f800a0:       0a000007        beq     33f800c4 <stack_setup>
    58  33f800a4:       e51f2068        ldr     r2, [pc, #-104] ; 33f80044 <_armboot_start>
    59  33f800a8:       e51f3068        ldr     r3, [pc, #-104] ; 33f80048 <_bss_start>
    60  33f800ac:       e0432002        sub     r2, r3, r2
    61  33f800b0:       e0802002        add     r2, r0, r2

    第4行"ea000012        b       33f80050 <reset>"使用了相对跳转指令b,是与位置无关的跳转指令,ea000012中的立即数0x12代表了相对于PC的指令个数:0x33f80000+2*4+0x12*4=0x33f80050<reset>
    第5-11行,使用了ldr指令,这几行是与位置相关的。以第5行为例,"ldr     pc, [pc, #20]"是取得地址pc+20处的内容到pc中,也就是把0x33f80140放到pc中,而0x33f80140处就是未定义指令异常<undefined_instruction>的服务子程序。0x33f80140的值是在链接时确定的,因而是与位置相关的。这样做是有道理的:当出现未定义指令异常时,PC自动跳转到0x04处,在此又取得0x33f80140到PC中,从而到内存中去执行服务子程序(这时已经由<reset>以后的代码把flash中的代码拷到SDRAM中了),比在flash中执行加快了响应速度。
    第28行的值是由config.mk里面的内容确定的(TEXT_BASE = 33f80000);31和33行是由连接脚本中的 __bss_start = .和 _end= .确定的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP