在 Silberchatz 的“操作系统概念”一书中,它说
“共享代码必须出现在所有进程的逻辑地址空间中的相同位置”,
为什么它必须出现在同一个位置?我认为对于每个进程我们都有一个单独的页表,这使得在不同的逻辑地址中共享代码地址成为可能!
在 Silberchatz 的“操作系统概念”一书中,它说
“共享代码必须出现在所有进程的逻辑地址空间中的相同位置”,
为什么它必须出现在同一个位置?我认为对于每个进程我们都有一个单独的页表,这使得在不同的逻辑地址中共享代码地址成为可能!
机器代码很少完全与位置无关。如果您有一些代码在位于地址 0x10000(逻辑/虚拟)时已编译为可以工作,并且您将其移动到地址 0x70000(逻辑/虚拟),则它将无法在新位置工作。
页表对此无能为力。什么可以是相对于instruction pointer
(AKA program counter
)的代码/数据寻址模式。有些 CPU 有它,有些没有,还有一些 CPU 半生不熟(例如,它们只能用于将控制(例如jump
/ call
)转移到代码中的其他位置的指令,而对于数据(例如move
)则没有) .
库(共享代码)中使用的每个地址(如跳转地址)都固定指向特定的逻辑地址。因此,这些逻辑地址在已导入该库的所有进程中应相同。这意味着您只能将这个库放在完全相同的逻辑地址中,让库找到自己的代码