技术员博客      html  css  js  c++  java
  • 代码的加载地址与运行地址

    下面内容是技术讨论群里的读者的提问:
    问:
    程序下载到NOR中,在ADS中加载地址却是0x30000000,是SDRAM的地址,难道是调试器自动搬运的?

    答:
    一个地址是加载地址一个是运行地址不一样的
    你下载到Nor里,是加载地址,ADS里ROBase设置的是运行地址

    问:

    加载地址是从0开始的吧

    答:
    Yes

    问:
    是谁将其复制到RAM中的啊?
    ARM核吗?

    答:
    你所谓的复制是什么意思?
    你的代码不复制,没有人会帮忙的

    问:
    NOR里的代码可以直接运行的啊

    答:
    是啊
    ARM上电就从0开始执行
    所以直接运行啊

    问:
    那那个0x30000000起什么作用?
    我要是写成0.。。

    答:
    那是运行地址,意思是说,代码将来要运行在以这个地址为基地的空间里
    所以,运行地址和加载地址可以不一样
    所以,运行地址和加载地址不一样的地方,只能用相对跳转

    问:
    我可不可以这样理解,不超过NOR的容量的代码,那个运行地址意义不大.

    答:
    你对运行地址和加载地址的概念理解的不深刻

    问:
    是的

    答:
    我们的C和汇编要编译成二进制对吧
    编译器会把C代码和汇编在链接的时候要给定每一条指令,变量,函数的地址

    问:
    是的

    答:
    那这个地址是固定的
    这个地址的基址就是运行地址
    也就是说,代码在运行的时候,都是在运行地址空间里运行的
    但是,通常在嵌入式设备里
    内存是需要先初始化的,没有初始化不能使用,代码也就不能运行在里面,而我们编译的二进制文件又是烧写到了Nor之类的ROM里
    这样,所以我们要将代码从NOR里搬运到SDRAM里
    保证正常运行
    所以我们只能将代码的运行地址设置为SDRAM里的一个地址
    而烧写的时候的地址,是加载地址

    问:
    运行地址是作为参数给编译器是这样吧?

    答:
    只要你保证在NOR里,没有绝对地址跳转就可能运行
    但是并不是所有的代码都使用相对跳转的
    所以,这也必须要求你的代码搬运到SDRAM里
    上面你说的很对

    问:
    嗯,谢谢

    答:
    因为编译器要知道地址后,在你的运行地址基础上编址
    你可以将运行地址设置为0x30000000
    然后将其在ADS里右键反汇编,看看其指令的地址就知道了

    问:
    好的

    答:
    然后你再将运行地址设置为0x0
    再反汇编,对比一下,你就理解了
    这个理解了,你也就理解了,什么是PIC代码了
    你自己去调查一下吧
  • 相关阅读:
    git学习六:git提交忽略不必要的文件或文件夹
    【web开发】spring+hibernate4支持中文排序
    最新分享_分享_百度空间
    近百余款最新HTML5应用案例给大伙儿共享了 狼人:
    Design of a ProxySharing Proxy Server
    Get Started With Chickenfoot
    Sphinx中文入门指南
    3.3.2 Rhino与env.js
    PHP会员找回密码功能的简单实现
    master + worker模式的node多核解决框架——nodecluster
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458030.html
Copyright © 2011-2022 技术员博客