在“ 了解Linux内核”第3版中 ,它说:
共享库在提供文件内存映射的系统上特别方便,因为它们减less了执行程序所需的主内存量。 当dynamic链接器必须将共享库链接到进程时,它不会复制目标代码,而是仅执行库文件的相关部分到进程地址空间的内存映射。 这允许在使用相同代码的所有进程之间共享包含库的机器代码的页面框架。 显然,如果程序被静态链接,共享是不可能的。 (第817页)
我对此感兴趣,想在C中编写一个小程序来validation,给出两个pid作为input,比如两个gedit进程,然后从页面中获取地址信息进行共享。 有谁知道如何做到这一点? 从这本书中,我认为来自两个或更多gedit进程的bss段和文本段地址是相同的,是正确的吗?
这不是gedit(或其他)具有相同地址的text
和bss
部分,而是libc.so
共享库的内容以及两个gedit进程使用的所有其他共享库。
正如引用的文本所说,这允许共享库成为一个副本,这是共享库的主要优点。
bss
通常是不共享的 – 因为这是每个进程数据。 在Linux中运行相同可执行文件的两个进程的text
部分将共享相同的代码。
不幸的是,这样做的证据将是在进程内查看页面的物理映射(进程A中的地址X处的页面处于物理地址Y处,处理B中的地址X的页面也处于物理地址Y处)就我所知,如果不在操作系统内核内部进行操作,就不容易获得。
看看/proc/*/maps
。