共享库地址空间

当我在研究共享库时,我读了一个声明

尽pipe共享库的代码在多个进程之间共享,但其variables却不是。 每个使用该库的进程都有自己的在库中定义的全局variables和静态variables的副本。

我只是有一点怀疑。

  1. 每个进程的代码部分是否在单独的地址空间中?
  2. 共享库代码部分是否在某些全局(唯一)地址空间中。

我只是一个首发,所以请帮助我理解。

谢谢!

共享库通过将文件映射到进程地址空间的某个部分来加载到进程中。 当多个进程加载相同的库时,操作系统只是让他们共享相同的物理RAM。

可以修改的库的一部分(如静态全局变量)通常以写入时复制模式加载,以便在尝试写入时发生页面错误,内核通过将受影响的页面复制到另一个物理页面的RAM(仅针对该进程),将映射重定向到新页面,最后写入操作完成。

回答你的具体问题:

  1. 所有进程都有自己的地址空间。 进程之间的物理内存共享对于每个进程是不可见的(除非他们通过共享内存API故意这样做)。
  2. 所有的数据和代码都在物理RAM中,这是一种地址空间。 但是,您可能看到的大部分地址都是属于某个进程或另一个进程的地址空间的虚拟内存地址,即使该“进程”是内核。