将共享库映射到物理内存

时间:2018-11-05 08:27:51

标签: operating-system virtual-memory

最近,我一直在阅读“计算机系统”。它说共享库与进程之间的共享对象映射到同一物理内存页,包括它的.data节和.text节。并且一个进程中共享对象的写操作也可以被另一进程“共享”。问题是:构建共享库时,数据部分以GOT开头,该GOT包含全局变量的地址。动态加载程序负责为与共享库链接的每个程序填写地址,这意味着将地址写入物理内存的相应页面上,因此它如何不影响与共享库链接的另一个进程库,因为它包含一个完全不同的GOT。

2 个答案:

答案 0 :(得分:0)

GOT中的值引用虚拟内存而不是物理内存。因此,共享库可以在多个进程中多次映射到同一虚拟内存地址,而无需使用linker设置的虚拟地址进行任何进一步的重定位。

如果由于虚拟内存已经被别的东西占用而无法映射,则loader会将库映射到空闲的虚拟内存区域,并创建一个副本并将其重新放置。

答案 1 :(得分:0)

  

最近,我一直在阅读“计算机系统”。它说共享库与进程之间的共享对象映射到同一物理内存页,包括它的.data节和.text节。并且一个进程中共享对象的写操作也可以被另一进程“共享”。

共享库的行为完全取决于系统。首先,与多个进程一起使用时,共享库可能会共享也可能不会共享物理内存。在共享内存的系统上,共享库通常由操作系统以某种方式安装,以指示该库的首选版本。否则,您将有一个巨大的安全漏洞。

某些系统确实在共享库中共享数据。那是早期Windoze的怪物痛苦。但是,如果没有某种安装,没有可靠的系统会允许这样做。