如何从库中获取地址信息以在所有进程之间共享?

时间:2015-12-30 07:19:57

标签: c linux linux-kernel

了解Linux内核,第3版中,它说:

  

共享库在提供文件内存映射的系统上特别方便,因为它们减少了执行a请求的主内存量   程序。当动态链接器必须将共享库链接到进程时,它不会复制目标代码,而只会执行库文件相关部分到进程地址空间的内存映射。 这允许包含库的机器代码的页面框架在使用相同代码的所有进程之间共享。显然,如果程序已静态链接,则无法共享。 (第817页)

我对此感兴趣,想要在C中编写一个小程序来验证,给出两个pid作为输入,例如两个gedit进程,然后从页面帧中获取要共享的地址信息。有谁知道怎么做?从那本书中,我认为来自两个或更多gedit进程的bss段和文本段地址是相同的,这是正确的吗?

2 个答案:

答案 0 :(得分:2)

不是gedit(或其他)的textbss部分具有相同的地址,而是libc.so共享库的内容 - 以及所有其他共享库由两个gedit进程使用。

正如引用文本所说,这允许共享库为一个副本,这是共享库的主要优点。

bss通常不会共享 - 因为这是每个流程数据。在Linux中运行相同可执行文件的两个进程的text部分将共享相同的代码。

不幸的是,证明这一点的目的是查看页面的物理映射(进程A中的地址X的页面位于物理地址Y,进程B中的地址X的页面也位于物理地址Y)进程,据我所知,如果不在操作系统内核中进行操作,就不容易获得。

答案 1 :(得分:0)

查看/proc/*/maps的内容。