关于SPV210链接地址与运行地址的笔记

来源:互联网 发布:json.net dynamic 编辑:程序博客网 时间:2024/06/15 08:44

理解概念:位置无关编码:可以理解为汇编编码方式与内存地址无关

 位置有关编码:汇编编码方式与内存地址有关

                 位置无关码取值 是通过指令间相对地址取值,而有关码是通过绝对地址来寻址。在ARM中最开始的几句代码都是位置无关代码,采用BL或者B进行跳转,而有关码通过LDR PC,=Lable 进行跳转,其中Lable为链接地址。位置有关码保证链接地址与运行地址一致程序才能正常运行。

                 链接地址:是由程序员指定地址,在程序链接后就智定下来

                运行地址:芯片厂商指定程序运行地址,出厂固定,在SPV210中,出厂运行地址在IRAM中的0XD0020010,在写代码时链接地址设为0x00,但程序依旧可以运行,是因为SPV210厂家把0XD0020010地址映射到0X00000000中,从datasheet中可以看到IRAM&IROM有两个区域,这两个其实可以理解为同一片内存单元的两个门。

adr r0 , _start        ;加载运行地址到r0当中

                ldr   r1, _start         ;加载链接地址到r1当中

              在SPV210代码重定位实验当中,指定链接地址为 0xD0024000

  以上两句都是伪指令,反汇编内容如下:

             adr r0, _start  

    d0024020:e24f0028subr0, pc, #40; 0x28

           最左边为链接地址,其次为机器码,反汇编代码,注释。

           运行地址推断:  根据链接地址0xd0024020得出偏移量为0x20,则pc地址为0xd0020010+0x20+8(流水线) = 0xd0020038,pc--0x28 正好等于0xd0020010,也就是运行地址的起始地址。注意:8级流水线。

           ldr r1, _start

       d0024024: e59f1048 ldr r1, [pc, #72]; d0024074 

         根据偏移量,这句运行的地址为0xd0020034, 此处的pc为链接地址,也就是0xd0024024+8,则[pc,#72]中的内容为地址0xd0024024+8+72内容,及备注中的d0024074,在反汇编代码中查看0xd0020074中存放的数据正好是0xd0024000,相当于把链接地址赋值r1.

    d0024074:   d0024000 andle r4, r2, r0

       注:当直接读取pc的值时访问的是运行时地址,而当你读取[pc]的值时访问的是链接地址。从而明白adr加载的是运行地址,而ldr加载的是链接地址。

整体过程分析;

程序在运行之前先编译链接,链接完成之后,每句程序对应一个链接地址,如同反汇编那样,而链接地址的起始地址往往是DDR的起始地址。

  但是一开始程序是在SRAM中运行的,运行地址的起始位置往往是SRAM的起始位置,那么一开始运行的代码他的链接地址和运行地址不同,但是代码本身不知道这件事,程序员明白,所以这段代码只能是位置无关码,主要负责一些初始化和重定位。知道搬运完成,pc的值还是运行时地址的值,也就是说pc不等于[pc].

     通过绝对跳转修改pc的值为当前链接地址的值:如果用相对跳转就是当前运行地址加上一个偏移量,此时pc运行还是运行地址,这样就无法到DDR上执行程序。执行完ldr pc,=on_sdram 后 pc=[pc].





     参考:http://www.cnblogs.com/douzi2/p/4970632.html

         

      

                

原创粉丝点击