- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MTK Scatter文件学习
概述:
分散加载(scatter loading)是ARM?连接接器提供的一个机制,该机制可以把一个可执行映像文件(即Bin文件)分割放置到内存中不同的独立段。
映像(Image)文件有两个视图:加载视图(Load view)?和?执行视图(execution view)。在下载的时候Image regions被放置在memory map当中,而在执行Image前,或许你需要将一些regions放置在它们执行时的地址上,并建立起ZI regions。例如,你初始化的RW数据需要从它在下载时的在ROM中的地址处移动到执行时RAM的地址处。
在scatter?文件中可以为每一个代码或数据段在装载和执行时指定不同的存储区域地址,?Scatlertoading的存储区块可以分成二种类型:装载区:当系统启动或加载时应用程序的存放区。执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行区。映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。在系统启动时,C函数库中的__main初始化代码会执行必要的复制及清零操作,使应用程序的相应代码和数据段从装载状态转入执行状态。
为什么需要Scatter文件:
制定存储器映射(memory map)的方法基本上有二种,一是在link时使用命令行选项,并在程序执行前利用linker pre-define symbol使用汇编语言制定section的段初始化,二是使用scatter file,即采用“分散加载机制”。以上二种方法依应用程序的复杂度而定,一针对简单的情况,二针对复杂的情况。
手机属于复杂的情况,必须使用scatter file。
Scatter文件语法:
scatter文件是一个简单的文本文件,包含一些简单的语法(分号后面的内容是注释):My_Region 0x0000 0x1000?? ;区域名称???区起始地址?区长度{?? the context of region????? ;区内容}每个区由一个头标题开始定义,头中至少包含区的名字和起始地址,另外还有最大长度和其他一些属性选项。区定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。一个加载区必须至少含有一个执行段;实践中通常有多个执行段。一个执行区必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中所有没有在文件中定义的余下部分。
简单分散加载样例图8所示样例中,只有一个加载区,包含了所有的代码和数据,起始地址为0。这个加载区一共对应两个执行段。一个包含所有的RO代码和数据,执行地址与装载地址相同;同时另一个起始地址为0x10000的执行段,包含所有的RW和ZI数据。这样当系统开始启动时,从第一个执行段开始运行(执行地址等于装载地址),在执行过程中,有一段初始化代码会把装载区中的一部分代码转移到另外的执行段中。下面是这个scatter描述文件,该文件描述了上述存储器映射方式。LOAD_ROM?? 0x4000{?? EXE_ROM 0x0000 0x4000???{????? *〈+RO〉???????????;所有代码、常量数据???}?? RAM 0x10000 0x8000{???? *〈+RW,+ZI〉?????????;所有非常量数据???}}
在分散文件中放置对象
在大多数应用中,并不是像前例那样,简单地把所有属性都放在一起,用户需要控制特定代码和数据段的放置位置。这可以通过在scatter文件中对单个目标文件进行定义实现,而不是只简单地依靠通配符。为了覆盖标准的连接器布局规则,我们可以使用+FIRST和+LAST分散加载指令。典型的例子是在执行段的开始处放置中断向量表格:LOAD_ROM 0x0000 0x4000{?? EXEC_ROM 0x0000 0x4000{???? vectors.o〈Vect,+FIRST〉???? *〈+RO〉???}?? ;moreexecregions...}在这个scatter文件中,保证了vextors.o中的Vect域被放置于地址0x0000。
一个实际的Scatter.txt详细分析
ROM ????? 0x00 ???? 0x800000 ;名字为ROM的区,起始地址是0x00,区的长度是0x800000。区的名字是唯一的;MTK平台对第一个区的大小限制是8Mbytes
{
??? ROM 0x00 FIXED 0x3D8000?? ;名称为ROM的执行段,该名称在所有执行段中是唯一的。段的起始地址是0x00,长度固定为0x3D8000.
??? {
??
文档评论(0)