【问题标题】:a single copy of a shared module’s code segment can be shared?共享模块代码段的单个副本可以共享吗?
【发布时间】:2020-09-04 00:32:33
【问题描述】:

我正在阅读一本教科书,上面写着:

现代系统编译共享模块的代码段,以便 它们可以加载到内存中的任何位置,而无需修改 链接器。使用这种方法,共享模块的单个副本 代码段可以被无限数量的进程共享,并且 每个进程仍将获得自己的读/写数据副本 段。

但是每个进程如何获得自己的共享模块数据段的副本?这不是冲突吗?例如共享库的数据段在内存中的地址是0x400500到0x400600,代码段的地址是0x400600到0x400700。

0x400600 到 0x400700 可以被多个进程共享,因为函数没有状态,但是如果 0x400500 到 0x400600 也被多个进程共享,任何进行修改的进程(例如对全局变量)都会影响其他进程,对吗?

【问题讨论】:

    标签: c linux gcc linker


    【解决方案1】:

    这是通过虚拟内存完成的。给定进程使用的内存空间与其他处理器使用的内存空间完全分开。内核将进程的虚拟内存映射到一块物理内存。

    因此对于共享库的数据段,两个进程可能对该段具有相同的虚拟内存地址,但每个进程都映射到不同的物理内存段。对于库的代码段,两个进程的虚拟内存可以映射到同一个物理内存,因为该段是只读的。

    【讨论】:

    • 确实如此。这里的问题是在原始引用中粗心地使用了“内存中”一词。这在现代计算中是一个模糊的术语,因为“在内存中”有多种含义。我想作者假设读者都会理解虚拟内存的概念,并会填写他或她懒得提供的细节。
    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多