《存储空间分配》word版

《存储空间分配》word版

ID:22703821

大小:50.51 KB

页数:11页

时间:2018-10-31

《存储空间分配》word版_第1页
《存储空间分配》word版_第2页
《存储空间分配》word版_第3页
《存储空间分配》word版_第4页
《存储空间分配》word版_第5页
资源描述:

《《存储空间分配》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、第4章存储空间分配$Revision:2.3$$Date:1999/06/1503:30:36$链接器或加载器的首要任务是存储分配.一旦分配了存储空间后,链接器就可以继续进行符号绑定和代码调整.在一个可链接目标文件中定义的多数符号都是相对于文件内的存储区域定义的,所以只有存储区域确定了才能够进行符号解析.与链接的其它方面情况相似,存储分配的基本问题是很简单的,但处理计算机体系结构和编程语言语义特性的细节让问题复杂起来.存储分配的大多数工作都可以通过优雅和相对架构无关的方法来处理,但总有一些细节需要特定机器的专门技巧来解决.段和地址每个目标或可执行文件都会采用目标地址空间

2、的某种模式.通常这里的目标是目标计算机的应用程序地址空间,但某些情况下(例如共享库)也会是其它东西.在一个重定位链接器或加载器中的基本问题是要确保程序中的所有段都被定义并具有地址,并且这些地址不能发生重叠(除非有意这样).每一个链接器输入文件都包含一系列各种类型的段.不同类型的段以不同的方式来处理.通常,所有相同类型的段,诸如可执行代码段,会在输出文件中被合并为一个段.有时候段是在其它段的基础上合并得到的(如Fortran的公共块),以及在越来越多的情况下(如共享库和C++专有特性),链接器本身会创建一些段并将其放置在输出中.存储布局是一个"两遍"的过程,这是因为每个段

3、的地址在所有其它段的大小未确定前是无法分配的.简单的存储布局在一种简单而不现实的情形下,链接器的输入文件包含一系列的模块,将它们称为M1,M2,...Mn,每一个模块都包含一个单独的段,从位置0开始长度依次为L1,L2,...Ln,并且目标地址空间也是从0开始.如图1所示.---------------------------------------------------------------------------图4-1:单独段的存储空间分配从位置0开始的多个段按照一个跟着另一个的方式重定位------------------------------------

4、---------------------------------------链接器或加载器依次检查各个模块,按顺序分配存储空间.模块Mi的起始地址为从L1到Li-1相加的总和,链接得到的程序长度为从L1到Ln相加的总和.多数体系结构要求数据必须对齐于字边界,或至少在对齐时运行速度会更快些.因此链接器通常会将Li扩充到目标体系结构最严格的对齐边界(通常是4或8个字节)的倍数.例1:假定一个称为main的主程序要与三个分别称为calif,mass和newyork的子例程链接(按照地理位置划分风险投资).每个例程的大小为(16进制数字):名称尺寸--------------

5、-----ain1017calif920ass615newyork1390假定从16进制的地址1000处开始分配存储空间,并且要求4字节对齐,那么存储分配的结果可能是:名称位置-------------------------ain1000-2016calif2018-2937ass2938-2f4cnewyork2f50-42df由于对齐的原因,2017处的一个字节和2f4d处的三个字节被浪费了,但无须忧虑.多种段类型除最简单格式外所有的目标格式,都具有多种段的类型,链接器需要将所有输入模块中相应的段组合在一起.在具有文本和数据段的UNIX系统上,被链接的文件需要将所

6、有的文本段都集中在一起,然后跟着的是所有的数据,在后面是逻辑上的BSS(即使BSS在输出文件中不占空间,它仍然需要分配空间来解析BSS符号,并指明当输出文件被加载时要分配的BSS空间尺寸).这就需要两级存储分配策略.现在每一个模块Mi具有大小为Ti的文本段,大小为Di的数据段,以及大小为Bi的BSS段,如图2所示.---------------------------------------------------------------------------图4-2:多种段的存储分配按类型将文本,数据和BSS段分别归并------------------------

7、---------------------------------------------------在读入每个输入模块时,链接器为每个Ti,Di,Bi按照(就像是)每个段都各自从位置0处开始的方式分配空间.在读入了所有的输入文件后,链接器就可以知道这三种段各自总的大小Ttot,Dtot和Btot.由于数据段跟在文本段之后,链接器将Ttot加到每一个数据段所分配的地址上,接着,由于BSS跟在文本和数据段之后,所以链接器会将Ttot,Dtot的和加到每一个BSS段分配的地址上.同样,链接器通常会将分配的大小按照对齐要求扩充补齐.段与页面的对

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。