浅谈高教操作系统应用加载技术研究

2022-10-02

加载是指将程序装入内存使之可以运行的过程, 分为系统加载和应用加载两种。系统加载指初始化CPU并跳转到操作系统的过程, 如PC中Linux的系统加载器LILO。应用加载是指将程序加载到内存并完成程序的相关初始化工作并使之运行的过程。加载器 (loader) 是指完成加载过程的程序, 并且在加载过程中进行一些重定位和链接处理。加载的基本步骤简单, 即解析加载的对象——程序文件格式, 获取对象的文件结构和内存映像描述, 然后根据这些描述将文件中的代码和数据搬移到相应的内存空间并完成程序的相关初始化。

1 加载过程

源文件经过编译后生成目标文件, 再进行装配或链接生成可执行文件或库文件。链接器将多个目标文件或库文件链接生成一个目标文件, 然后由加载器将文件装入内存。链接器还可细分为链接加载器和链接编辑器。链接加载器从OS获取起始地址, 如果OS支持虚存机制则程序的起始地址设置为零, 处理修改记录, 解析外部符号, 输出到内存, 将控制权转交给程序。而链接编辑器仅解析外部符号但并不真的生成绝对地址, 最后的生成的文件输出到磁盘。

加载过程可分两种情况, 一是无需在加载时进行重定位, 另一种则是需要在加载时重定位。嵌入式系统中的可执行文件通常在编译时生成绝对地址, 加载时无需再进行地址重定位计算。而加载时的重定位, 即在加载时根据程序被加载到的内存的地址对程序中的地址进行相应计算和修改, 以使程序可以正常运行。加载时重定位的不足会带来性能问题, 因为被加载到不同虚存空间的程序难以共享代码。解决办法之一是引入共享库, 即PIC (Position Independent Code) 。原理是将代码与数据分离, 生成无需根据地址空间改变的代码。

目标文件和可执行程序的地址都是按照目标地址空间模型 (内存地址分配图) 连续分配, 通常都是从零开始。链接器首要工作是为程序分配空间, 保证程序中的每个段都有被分配地址, 且这些地址如果没有被要求不能相互叠加, 分别把各个目标文件的代码段、数据段、bss段进行重新组合和空间分配。链接器通常读入所有待处理的目标文件和各个段信息, 同时搜集所有符号的定义和访问信息, 然后据段分配到的地址调整代码和数据的地址将文件头、重定位后的段内容、符号表信息等结果写入输出文件。

2 目标文件格式

Unix和Windows主流操作系统上目标文件的演化过程如图1所示。UNIX的COFF格式支持交叉编译, 但对动态链接以及C++的一些特性则无能为力, ELF格式应运而生, 它不仅支持交叉编译还支持动态链接。目标文件沿着文件结构和支持功能的简单到复杂的过程演化, 每种目标文件格式都反映出定义它的系统的要求。Unix系统延续了界面简单、定义良好的风格, 例如a.out和ELF格式都体现出相对简单性且无具体特性规定。由于应用加载的对象是文件, 不同的操作系统和规范的文件格式和设计不同, 对目标文件的生成过程以及演化并对其格式进行分析是必要的 (见图1) 。

由源文件经过编译或链接生成的文件称为目标文件, 应包含以下基本信息: (1) 头信息目标文件的概述信息, 例如代码的大小、源文件名、创建日期。 (2) 目标代码由编译器或装配器生成的二进制代码和数据。 (3) 重定位信息一张地址表, 列出目标文件中需要由链接器修改的地址。 (4) 符号在文件中定义的全局符号, 文件引用的外部符号或链接器定义的符号; (5) 调试信息包括debugger需要的信息, 例如源文件的行号、局部变量以及目标文件的数据结构描述。

3 EXE格式

对于为每个进程都分配一个内存空间的系统, a.out格式已经完全适用了, 因为它的内存映像的物理地址和目标文件的逻辑地址可以相同。但是在其它管理机制更为复杂的操作系统中, 可执行文件不能仅由可执行的代码组成, 还需要携带一些重定位信息或表项。这些重定位信息被称为回填, 用来标识程序在加载时哪些地方的地址还需要做相应的修改。MS-DOS的EXE文件就是这样一个简单的例子:支持逻辑地址到物理地址的简单重定位操作, 文件结构如图2所示。黑体标识出了“.exe”文件可重定位信息所处的位置。Fixup结构是一个3 2位的指针数组, 其结构如图2所示 (segment:offset, 如1111:2523h) 。计算时只需将segment地址加上offset即可得到目的地址。“.exe”文件的加载过程略比“.com”文件的加载过程复杂, 加载步骤: (1) 读取文件头信息, 检查文件的有效性。 (2) 根据文件头记录的信息, 检查空间是否足够。 (3) 为程序创建一个PSP。 (4) 将程序代码段搬移到内存, 并放在PSP之后。 (5) 读取文件的重定位记录对每一个重定位记录项进行处理。 (6) 设置栈指针SP和指令指针IP, 重定位并运行程序。

4 结语

通过对应用目标文件的生成和加载过程的原理分析基础上, 主要阐述表现应用加载的目标文件格式和相应处理, 同时对其应用加载中优缺点和相关技术做了分析, 对嵌入式系统中的动态加载的实现有参考意义。

摘要:应用加载与处理器和操作系统密切相关。编译后的文件格式和在操作系统中加载过程具有一致性, 不同的操作系统根据自身的特点支持不同目标文件格式。通过分析了微软的com和exe格式以及Linux和Unix普遍支持的ELF文件格式说明加载原理及其加载过程。同时阐述了应用的生成过程中的链接处理及其采用的方法。

关键词:应用加载,目标文件,链接,操作系统

参考文献

[1] Midda Zhang.Intel Corporation[M].Analysis of Object File Formats forEmbedded Systems.

[2] AT&T.System V Application BinaryInterface Intel386 Architecture pro-cessor Supplement Fourth Edition[M].

[3] Microsoft Corporation.Microsoft Por-table Executable and Common ObjectFile Format Specification[S].

本文来自 99学术网(www.99xueshu.com),转载请保留网址和出处

上一篇:新零售在汽车销售行业中的应用下一篇:把握“五点”扎实做好政务信息工作