Memory management 进程地址空间中的共享代码逻辑地址

Memory management 进程地址空间中的共享代码逻辑地址,memory-management,operating-system,Memory Management,Operating System,在Silberchatz的《操作系统概念》一书中,它说 “共享代码必须出现在所有进程的逻辑地址空间中的同一位置” 为什么它必须出现在同一个位置?我认为对于每个进程,我们都有一个单独的页表,这使得在不同的逻辑地址中共享代码地址成为可能 机器代码很少完全独立于位置。如果您有一些代码在位于地址0x10000(逻辑/虚拟)时被编译为可以工作,并且您将其移动到地址0x70000(逻辑/虚拟),那么它将无法在新位置工作 页面表对此无能为力。与指令指针相关的代码/数据寻址模式可以是什么(也称为程序计数器)。有

在Silberchatz的《操作系统概念》一书中,它说

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


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

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


页面表对此无能为力。与指令指针相关的代码/数据寻址模式可以是什么(也称为程序计数器)。有些CPU有,有些没有,但有些CPU还不成熟(例如,它们只能在将控制权(例如,
跳转
/
调用
)转移到代码中的其他位置的指令中使用它,而对数据(例如,
移动
)则没有。库中使用的每个地址(如跳转到地址)都可以使用它(共享代码)已修复指向特定逻辑地址的错误。 因此,在导入此库的所有进程中,这些逻辑地址应相同。
这意味着您只能将此库放在完全相同的逻辑地址中,以便让库找到自己的代码

根据我对您所说内容的理解,当共享代码必须引用自身时,它需要知道它所在的逻辑地址空间。由于共享代码不能为访问它的每个进程更改自身,这意味着逻辑地址空间必须在所有共享进程中保持不变。这难道不意味着你不能使用两段使用相同逻辑地址空间的共享代码吗?@2biggies共享代码可以处理位于不同位置的数据,如果它的设计和编译方式是,在每个地址空间中,调用者向它提供数据的地址,或者可以通过某种方式从环境(如TLS等)。显然,不能同时在同一地址空间中有交叉代码/数据。但我认为,共享代码并不一定要完全共享。如果一个地址空间中的库不能与所有其他地址空间中的库位于同一地址,则可以将库的另一个副本重新定位到其他位置。