zoukankan      html  css  js  c++  java
  • 运行地址和加载地址

    http://blog.csdn.net/ce123_zhouwei/article/details/6990100

    运行地址和加载地址
    在连接目标代码时,会提到运行地址和加载地址。这两者有什么区别呢?
    加载时地址就是程序放置的地址,运行地址就是程序定位的绝对地址,也即在编译连接时定位的地址。
    如果程序是在flash里运行,则运行地址和加载地址是相同的。
    如果程序是在ram里运行,但程序是存储在flash里,则运行地址指向ram,而加载地址是指向flash。

    代码一般是烧写在NAND里面,比如S3C2440 如果开机从NAND启动 其开始的4K代码会被COPY到2440内部的4KRAM 用于对关键硬件的初始化 这时候内部RAM被映射为0x0地址。
    如果从NOR启动,因为NOR支持片上运行,代码可以直接在NOR上运行 此时NOR便被映射成0x0,S3C2440 内部的4KRAM便被映射到了0x40000000处。


    下面我们看看链接文件。           
        对于.lds文件,它定义了整个程序编译之后的连接过程,决定了一个可执行程序的各个段的存储位置。先看一下GNU官方网站上对.lds文件形式的完整描述:

        SECTIONS {  
        ...  
        secname start BLOCK(align) (NOLOAD) : AT ( ldadr )  
          { contents } >region :phdr =fill  
        ...  
        } 

    secname和contents是必须的,其他的都是可选的。下面看看几个常用的:
    1、secname:段名
    2、contents:决定哪些内容放在本段,可以是整个目标文件,也可以是目标文件中的某段(代码段、数据段等)
    3、start:本段连接(运行)的地址,如果没有使用AT(ldadr),本段存储的地址也是start。GNU网站上说start可以用任意一种描述地址的符号来描述。
    4、AT(ldadr):定义本段存储(加载)的地址。

    看一个简单的例子:

    /* nand.lds */  
    SECTIONS {   
       firtst 0x00000000 : { head.o init.o }   
       second 0x30000000 : AT(4096) { main.o }   
    }

    以上,head.o放在0x00000000地址开始处,init.o放在head.o后面,他们的运行地址也是0x00000000,即连接和存储地址相同(没有AT指定);
    main.o放在4096(0x1000,是AT指定的,存储地址)开始处,但是它的运行地址在0x30000000,运行之前需要从0x1000(加载处)复制到0x30000000(运行处),
    此过程也就用到了读取Nand flash。这就是存储地址和连接(运行)地址的不同,称为加载时域和运行时域,可以在.lds连接脚本文件中分别指定。
    编写好的.lds文件,在用arm-linux-ld连接命令时带-Tfilename来调用执行,如arm-linux-ld –Tnand.lds x.o y.o –o xy.o。也用-Ttext参数直接指定连接地址,
    arm-linux-ld –Ttext 0x30000000 x.o y.o –o xy.o

    总之:
             连接地址<==>运行地址
             存储地址<==>加载地址

    既然程序有了两种地址,就涉及到一些跳转指令的区别,下面就来具体看看这些跳转指令。
    ARM汇编中,常有两种跳转方法:b跳转指令、ldr指令向PC赋值。
    (1)b step1 :b跳转指令是相对跳转,依赖当前PC的值,偏移量是通过该指令本身的bit[23:0]算出来的,这使得使用b指令的程序不依赖于要跳到的代码的位置,只看指令本身。
    (2)ldr pc, =step1 :该指令是从内存中的某个位置(step1)读出数据并赋给PC,同样依赖当前PC的值,但是偏移量是那个位置(step1)的连接地址(运行时的地址),
           所以可以用它实现从Flash到RAM的程序跳转。

  • 相关阅读:
    多测师讲解html _伪类选择器17_高级讲师肖sir
    多测师讲解html _后代选择器16_高级讲师肖sir
    多测师讲解html _组合选择器_高级讲师肖sir
    多测师讲解html _标签选择器14_高级讲师肖sir
    前端 HTML form表单标签 input标签 type属性 重置按钮 reset
    前端 HTML form表单标签 textarea标签 多行文本
    前端 HTML form表单标签 input标签 type属性 file 上传文件
    前端 HTML form表单标签 input标签 type属性 radio 单选框
    前端 HTML form表单标签 input标签 type属性 checkbox 多选框
    前端 HTML form表单目录
  • 原文地址:https://www.cnblogs.com/liulipeng/p/3368938.html
Copyright © 2011-2022 走看看