返回介绍

8.1 装载器

发布于 2025-03-09 23:09:33 字数 1842 浏览 0 评论 0 收藏 0

装载器是一个操作系统程序,它把一个可执行文件或二进制程序装入内存,如果有足够的自由内存给该程序装入和运行的话。大多数二进制程序包含关于运行该程序所需要的内存大小、重定位地址、和最初的段寄存器值等信息。该程序被装入内存以后,装载器通过设置代码与指令段把控制转移给二进制程序。

不同操作系统的二进制程序结构是不同的,因此,二进制程序的装载依赖它的运行平台——操作系统和机器。二进制程序的最简单形式只包含该程序的二进制映像,亦即,按程序原样把一个完全链接的映像装入内存,没有对二进制映像做任何改变。在 DOS 操作系统下的.com 就是使用这个二进制结构。而大多数二进制程序不仅包含二进制映像,也包含决定二进制程序类型 (即,对于相同的操作系统或者相同机器上的不同操作系统,有不同类型的可执行程序) 和初始寄存器值的头部信息,以及包含一个重定位表保存相对于二进制映像开始处的字偏移地址——在这些位置上需要根据程序装入到内存中的位置重新定位。在 DOS 和 Windows 下使用的 exe 文件就是这一类型的二进制文件。二进制程序的一般格式见图 8-2 所示。

头部

二进制映像

重定位表

图 8-2: 二进制程序的一般格式

将一个程序装入内存的算法如下:先确定二进制文件的类型 (对于允许不同类型二进制文件的系统),如果该文件本身是一个二进制映像,需要分配的内存大小等于文件大小,因此,分配一个文件大小的内存块,把该文件按原样装入该内存块,不做任何的修改,然后设置默认的段寄存器。对于二进制文件带有头部信息和重定位表信息的情况,先读入头部以确定需要用多少内存来装入程序、重定位表的位置、并取得其它用来设置寄存器的信息。根据头部信息指定的大小分配一个内存块,然后将该文件的二进制映像装入内存块,把重定位表里的各元素在内存中重新定位,并根据头部里的信息设置段寄存器。算法见图 8-3 所示。

procedure loader (name: fileName)

/* Pre: name is the name of a binary file.

* Post: the binary program name has been loaded into memory. */

determine type of binary program.

if (only binary image) then

S = size of the binary file.

allocate free block of memory of size S.

load file into allocated memory block, at a predefined offset.

setup default segment registers.

else

read header information.

S = size of the binary image (from the header information).

allocate free block of memory of size S.

load binary image into allocated memory block.

relocate all items from the relocation table in memory.

setup segment registers with information from the header.

end if

end procedure

图 8-3: 装载器算法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文