- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
试图搞懂MDK程序到flash(二)--分散加载文件scatter
试图搞懂MDK程序下载到flash(二)--分散加载文件scatter
分散加载文件概念
???? 对于分散加载文件的概念,在《ARM体系结构与编程》书第11章有明确介绍。
???? 分散加载文件(即 scatter file,后缀为 .scf)是一个文本文件,通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配RO、RW、ZI等数据的存放地址。
???? 如果不用? SCATTER文件指定,那么ARM连接器会按照默认的方式来生成映像文件,一般情况下我们是不需要使用分散加载文件的。但在某些场合,我们希望把某些数据放在知道那个的地址处,那么这时候SCATTER文件就发挥了非常大的作用,而且SCATTER文件用起来非常简单好用。我越看这个分散加载文件越感觉它的作用和uboot的连接脚本lds一样。
分散加载文件的格式
??? 分散加载描述文件是一个文本文件,它向链接器描述目标系统的存储器映射。如果通过命令行使用链接器,则描述文件的扩展名并不重要。分散加载文件指定:
??? ① 每个加载区的加载地址和最大尺寸;
??? ② 每个加载区的属性;
??? ③ 从每个加载区派生的执行区;
??? ④ 每个执行区的执行地址和最大尺寸;
??? ⑤?每个执行区的输入节。
??? 从描述文件的格式就可以看出加载区、执行区和输入节的层次关系。?
分散加载文件基本点
???? ① 编译后输出的映像文件中各段是首尾相连的,中间没有空闲的区域,他们的先后关系是根据链接时参数的先后次序决定的armlinker -file1.o file2.o ...
???? ② scatter用于将编译后的映像文件中的特定段加载到多个分散的指定内存区域
???? ③ 有两类域(region):执行域(execution region,一般是ram区域)和加载域(load region,一般是rom区域)
???? ④ 加载域:就是编译之后得到的二进制文件烧写到rom中的这一段区域,所有的代码R0、预定义变量RW、堆栈之类和清不清空无关紧要的大片内存区域ZI,都包括在其中。
???? ⑤ 执行域:就是把加载域进行“解压缩”后的样子。比如:RO没有变动还是在ROM中,RW被移到了SRAM中,而ZI被放置在SDRAM中
???? ⑥ scatter本身并不能对映像实现“解压缩”,编译器读入scatter文件之后会根据其中的各种地址生成启动代码了,实现对映像的加载,而这一段代码就是*(InRoot$$Sections)它是__main()的一部分。这就是在汇编启动代码的最后跳转到__main()而不是跳向main()的原因之一。
???? ⑦ 起始地址与加载域重合的执行域称为root region,*(InRoot$$Sections)必须放在这个执行域中,否则链接的时候会报错。*(+RO)包含了*(InRoot$$Sections),所以如果在root region 中用到了*(+RO)可以不再指定*(InRoot$$Sections)。
scatter文件分析:
???? ⑧ 程序正确编译生成目标文件以后,就会链接成可执行的文件,这个过程中,要用到分散加载文件,它决定可执行代码在存储器中存放的位置,这在复杂的程序(例如VIVI读Linux内核的引导)中时很重要的。
???? 文件1:
?????LR_ROM1??? 0 0?????????????;? 第一个加载域,名字为LR_ROM1,起始地址为0x0,
???? {????????????????????????????????????????????????????????????????????????????;? 大小为0x80000
????????????ER_ROM1???0 0??????;? 加载域中的运行时域,名字为ER_ROM1,起始地址为
????????????{???????????????????????????????????????????????????????????????????? ; 0x0,大小为0x80000,如上述第⑦条所示
???????????????????vectors.o? (VECT,+First)????????????????????????;将vectors.c编译后生成的文件vector.o中的代码、init.c编译
?????????????????? init.o??????? (INIT)????????????????? ;后生成的init.o中的代码以及所有编译生成的RO属性的代码全部存放在
????????????????? *(+RO)????
文档评论(0)