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)文件

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

相关资讯

    暂无相关的资讯...

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

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