【发布时间】:2011-04-22 20:30:03
【问题描述】:
elf 格式的可执行文件包含各种段,如代码、数据、bss、堆栈等。 如果我们说段 xyz 是静态重定位的,那是什么意思?
elf 格式的二进制文件包含每个段的相对地址。当我们说静态重定位时,是否意味着相对地址实际上是物理地址?
【问题讨论】:
标签: memory-management operating-system relocation
elf 格式的可执行文件包含各种段,如代码、数据、bss、堆栈等。 如果我们说段 xyz 是静态重定位的,那是什么意思?
elf 格式的二进制文件包含每个段的相对地址。当我们说静态重定位时,是否意味着相对地址实际上是物理地址?
【问题讨论】:
标签: memory-management operating-system relocation
静态重定位是指在程序开始执行之前进行地址转换。典型的硬件指令周期如下所示:
loop
w := M[instr_ctr]; (* fetch instruction *)
oc := Opcode(w);
adr := Address(w);
instr_ctr := instr_ctr + 1;
case oc of
1: reg := reg+M[adr]; (* add *)
2: M[adr] := reg; (* store *)
3: instr_ctr := adr; (* branch *)
...
end
end (* loop *)
【讨论】:
在没有内存抽象的情况下(程序直接访问物理内存) 它是这样的: 程序 A 使用地址 x 程序 B 在某些时候也使用地址 x
为了让两个程序同时运行,一些操作系统/早期计算机(例如 IBM 360)会在加载程序 B 时动态修改程序 B 的地址,以便它不会使用程序 A 使用的内存地址
在地址 16,384 加载程序时,常量 在加载过程中,每个程序地址都添加了 16,384 个。
【讨论】:
静态重定位是指在程序运行之前移动数据或编码并为其分配绝对位置。 例如:- 链接器是静态重定位的一个例子,它移动程序的几个模块并将它们组合到程序中。
【讨论】: