013课 代码重定位

2019/7/24 17:32:05 人评论 次浏览 分类:学习教程

一、为什么需要重定位

  1. NandFlash启动时:CPU无法直接读写NandFlash中的数据,因此当设置为NandFlash启动时,硬件会自动将NandFlash的前4k的数据复制到SRAM中,CPU会从SRAM中执行烧录到NandFlash的程序,此时SRAM的基地址是0地址。但如果启动时的程序超过了4k,则前4k的内容需将整个程序复制到SDRAM中,然后程序在SDRAM中执行。
  2. NorFlash启动时:NorFlash的特性是只能像内存一样的读,但不能像内存一样的写,因此当设置为NorFlash启动时,启动的程序无法修改和写入程序中的全局变量和静态变量,导致无法正常启动。因此需要将整个程序复制到SDRAM中,然后程序在SDRAM中执行。

二、如何重定位?

  1. 段的概念
    所有的程序在都包括:

.text 代码段 .data 数据段
.rodata 只读数据段(const全局变量)
.bss段 (初始值为0,无初始值的全局变量)
.commen 注释段

其中.bss段和.commen段不保存在bin文件汇总,但保存在elf文件中。

  1. 链接脚本:用来指导程序的链接及运行地址
    链接脚本的语法:

SECTIONS {

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

}

语法的解释

secname :段名
start :起始地址:运行时的地址(runtime addr);重定位地址(relocate addr)
AT ( ldadr ) :可有可无(load addr:加载地址) 不写时LoadAddr = runtime addr
{ contents } 的内容:
start.o //内容为start.o文件

*(.text)所有的代码段文件
start.o *(.text)文件

对于不同的段,可以设置不同的链接地址和加载地址。

相关资讯

  • 那些我们不愿意承认的事

    很久没有见的老朋友,准确的说应该是很久没有见过的老师,一个比我大两岁的老师,我上初中的时候他从高中回来教我了一年。后来又回去上高中,我上高中的时候他上大学,现在我刚大学毕业他创办了公司。昨日一见依然如故,他还是热爱销售,而我却成了纯粹的技术人员。 看到他…

    2015/6/22 13:12:47

学习教程

共有访客发表了评论 网友评论

验证码: 看不清楚?
    -->