网站重新上线,多谢朋友们的关心
Jul
14
Jul
11
Linker Script在Embedded系统中很常用,也很重要,主要用来指定哪些数据到底存在哪里,在哪里执行。因为嵌入式系统有各种不同的Memory,不像桌面系统,基本都是从硬盘Load,从内存运行。
网上没有找到非常权威又易读的中文教材,于是就只好东拉西扯东拼西凑出一个对Linker Script大概的印象。
资料一:
英文版 - http://www.bilmuh.gyte.edu.tr/gokturk/introcpp/gcc/ld_toc.html
部分中文版 - http://hi.baidu.com/sohunini/blog/item/60fa1f0f60b200286159f361.html
内容是很好,只是例子分析不够详细,很多地方还需要多看几遍或者结合实例。
资料二:Xilinx Xapp 642
讲到的问题都分析清晰,知其然知其所以然。当然这篇文档不是专门讲LD的,因此不全面也是理所应当。
一些主要的概念:
1. 输入输出
SECTIONS
{
.text : { *(.text)}
}
第一个.text代表输出段,大括号里的内容表示输入内容。星表示所有的目标文件,需要的话可以指定.o文件。括号中的.text表示前面指定的输入文件中的.text段。这样,整句话的意思就是把所有目标文件中的.text集合起来,组成输出文件的.text段。
2. 位置计数器
3. Symbol
4. LMA和VMA
LMA - Load Memory Address - 一个段应该从哪里加载
VMA - Virtual/Logical/Run-time Memory Address - 一个段在什么地址运行
一般情况下是一样的。如果需要把一个段从Flash中Copy到RAM中,然后再在RAM中使用,那么LMA应该是Flash地址,VMA是RAM中的地址。
5. 指定LMA
AT命令
6. 指定VMA
用LinkerScript来解决问题
问题1:让程序从Flash中运行,需要RW的段拷贝到RAM中
- Xapp983和Xapp642-Example1就做了这样的功课
问题2:把某个函数放在BRAM中运行以加快运行速度(比如有实时要求的中断程序),别的仍然在DDR RAM中运行
- 像Xapp642-Example2中给函数加__attribute (( section(".bram"))) 属性,或者在LinkerScript中指定一个中断程序的.oe文件输出到一个单独的段——反正目的就是把需要加速的程序独立出来,然后用bootloader把这个段放在BRAM中运行。
例子:
extern void foobar (void) __attribute__ ((section ("bar")));
.bar : { *(.bar)} > bram
附段名
.text - Program Code (RO)
.bss - Uninitialized Data (RW)
.data - Initialized Data (RW)
.rodata - Constants (RO)
网上没有找到非常权威又易读的中文教材,于是就只好东拉西扯东拼西凑出一个对Linker Script大概的印象。
资料一:
英文版 - http://www.bilmuh.gyte.edu.tr/gokturk/introcpp/gcc/ld_toc.html
部分中文版 - http://hi.baidu.com/sohunini/blog/item/60fa1f0f60b200286159f361.html
内容是很好,只是例子分析不够详细,很多地方还需要多看几遍或者结合实例。
资料二:Xilinx Xapp 642
讲到的问题都分析清晰,知其然知其所以然。当然这篇文档不是专门讲LD的,因此不全面也是理所应当。
一些主要的概念:
1. 输入输出
SECTIONS
{
.text : { *(.text)}
}
第一个.text代表输出段,大括号里的内容表示输入内容。星表示所有的目标文件,需要的话可以指定.o文件。括号中的.text表示前面指定的输入文件中的.text段。这样,整句话的意思就是把所有目标文件中的.text集合起来,组成输出文件的.text段。
2. 位置计数器
3. Symbol
4. LMA和VMA
LMA - Load Memory Address - 一个段应该从哪里加载
VMA - Virtual/Logical/Run-time Memory Address - 一个段在什么地址运行
一般情况下是一样的。如果需要把一个段从Flash中Copy到RAM中,然后再在RAM中使用,那么LMA应该是Flash地址,VMA是RAM中的地址。
5. 指定LMA
AT命令
6. 指定VMA
用LinkerScript来解决问题
问题1:让程序从Flash中运行,需要RW的段拷贝到RAM中
- Xapp983和Xapp642-Example1就做了这样的功课
问题2:把某个函数放在BRAM中运行以加快运行速度(比如有实时要求的中断程序),别的仍然在DDR RAM中运行
- 像Xapp642-Example2中给函数加__attribute (( section(".bram"))) 属性,或者在LinkerScript中指定一个中断程序的.oe文件输出到一个单独的段——反正目的就是把需要加速的程序独立出来,然后用bootloader把这个段放在BRAM中运行。
例子:
extern void foobar (void) __attribute__ ((section ("bar")));
.bar : { *(.bar)} > bram
附段名
.text - Program Code (RO)
.bss - Uninitialized Data (RW)
.data - Initialized Data (RW)
.rodata - Constants (RO)
Jun
25
[Command] dd
[Option]
bs
conv
[Report]
Example:
3+1 record in
4+0 record out
因为dd操作的是char模式的设备,读写都以sector为单位进行。-bs选项就是设置sector大小。report中的record in 和 record out数字是用来说明输入文件和输出文件分别占用多少个sector。前面一个数字表示占用完全的sector,后面一个数字表示占用不完全的sector。
[Reference]
http://blog.52emu.com/?action=show&id=80
http://blog.chinaunix.net/u/21908/showart_425702.html
[Option]
bs
conv
[Report]
Example:
3+1 record in
4+0 record out
因为dd操作的是char模式的设备,读写都以sector为单位进行。-bs选项就是设置sector大小。report中的record in 和 record out数字是用来说明输入文件和输出文件分别占用多少个sector。前面一个数字表示占用完全的sector,后面一个数字表示占用不完全的sector。
[Reference]
http://blog.52emu.com/?action=show&id=80
http://blog.chinaunix.net/u/21908/showart_425702.html






