共享代码的逻辑地址

问题描述:

在“操作系统概念” Silberchatz的书,它说共享代码的逻辑地址

“共享代码必须出现在所有进程的逻辑地址空间相同的位置”,

为什么它是否必须出现在相同的位置?我认为对于每个进程我们都有一个单独的页表,这使得可以在不同的逻辑地址中拥有共享代码地址!

机器码很少完全与位置无关。如果您有一些代码在位于地址0x10000(逻辑/虚拟)时被编译为可用,并且您将其移至地址0x70000(逻辑/虚拟),则它将无法在新位置工作。

页表不能帮助这个。相对于instruction pointer(AKA program counter),代码/数据寻址模式有哪些。一些CPU拥有它,有些没有它,但有些则没有它(例如它们只能用于将控制转移到其他地方(例如jump/call)的指令,但对于数据(例如move))。

+0

从我所做的你所说的, 当共享代码需要引用它自己时,它需要知道它所在的逻辑地址空间。由于共享代码无法为访问它的每个进程自行更改,这意味着逻辑地址空间必须在所有共享进程中保持不变。 这是否也意味着您不能使用2个使用相同逻辑地址空间的共享代码? – 2bigpigs 2015-12-07 06:44:22

+1

@ 2bigpigs共享代码可以处理位于不同位置的数据,只要它的设计和编译方式使得在每个地址空间中调用者为其提供数据地址或者可以以某种方式从环境中获取所述地址(例如TLS等等)。很明显,你不能同时在相同的地址空间内交叉代码/数据。但我认为,共享代码不必完全共享。如果您不能在一个地址空间中的地址与其他所有地址中的地址相同,则可以将该库的另一个副本重新定位到其他位置。 – 2015-12-07 07:16:06