什么是 8086 可重定位?

什么是 8086 可重定位?

我正在运行一些 Fortran 软件(LBLRTM),准备输入的 shell 脚本生成了许多名为 、 等的文件TAPE3TAPE4出于调试目的,我用来file识别文件类型。file告诉我:

TAPE3:  8086 relocatable (Microsoft)

我猜想file这里是错误的,它只是一个看起来像的二进制文件8086 relocatable。但是A 8086 relocatable

答案1

我认为可重定位代码早于虚拟内存 (VM)。另一种选择是绝对代码,它必须加载到物理内存中的特定位置(例如,因为它包含以物理地址为目标的“跳转”指令)

8086 向后兼容旧处理器,旧处理器只能使用 16 位地址寄存器寻址 64KB 内存。8086 还具有 16 位段寄存器,考虑到(例如,执行跳转指令时)实际地址基本上为 = 地址 + 段 <<4。这允许(可重定位)程序位于 1MB 内存中的任何位置,与 16 字节“段”边界对齐(上面计算中的 4 位移位)。此类程序只能寻址 64KB。显然,操作系统会在上下文切换时适当地更改段寄存器。

很明显,如果您的程序操作了段寄存器,也许它可以使用超过 64 KB 的内存,则无法以这种方式重新定位。

Intel 8086/8088 程序有时是可重定位的,或者更准确地说,是位置无关的,只要它们不尝试操作段寄存器即可。在这种情况下,操作系统可以在 16 字节边界上的可用内存中的任何位置加载程序,相应地设置段寄存器,程序就可以正确运行。然而,在这种模式下,程序只能访问四个 64KB 的内存段。

还可以与位置无关并可以访问程序的更多内存,采用将所有段操作偏置为程序启动时存在的初始值的方法。

请注意,本讨论并未考虑加载模块格式本身可重定位(需要加载器进行重定位)的可能性。这是第三种可能性。

http://wiki.answers.com/Q/Why_are_8086_programs_called_relocatble_programs

8086 目标模块格式允许指定可相互链接的可重定位内存映像。提供的功能允许高效使用 8086 微处理器的内存映射功能。

8086 可重定位目标模块格式
Intel 技术规范

http://en.wikipedia.org/wiki/Intel_8086#Segmentation

相关内容