两个不同的程序是否在同一物理内存位置加载共享库函数

时间:2014-02-03 19:12:13

标签: c linux operating-system shared-libraries shared-memory

我使用OpenSSL共享库使用AES_cbc_encrypt()函数进行简单加密。我想知道我是否在两个不同的程序中使用这个AES_cbc_encrypt()函数,两个程序是否都指向物理内存中相同的位置以获得此AES_cbc_encrypt()函数?

我的其他问题是

1>如果我使用共享库,它将被所有使用它的程序自动指向相同的物理内存位置?

或者

2>我是否需要遵循其他一些技术来强制程序将共享库加载到RAM中的相同物理内存中。 (我不认为这是真的,因此没有使用共享内存的概念。这是我的理解)。

3> 如何检查两个程序是否在同一物理位置加载共享库函数。

4>我通过使用(& AES_cbc_encrypt)计算两个程序中函数的位置(虚拟地址),然后使用工具capture,我将此虚拟地址(VPN)转换为物理地址(PFN)。但是,我不知道如何从这个VPN,PFN信息计算物理地址。所以无法进一步比较。任何线索?

例如我的虚拟地址是

=0x400cb0

虚拟地址

开始地址 - 结束地址

 00400000-00402000  

物理页面

 : A600000000036E26

 : A60000000008A4C3

在我的系统中

* *虚拟地址空间:48位

物理地址空间:36位**

我在Linux下使用GCC。任何帮助或指针/链接将受到高度赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:2)

阅读Drepper的论文How To Write Shared Libraries

共享库使用position independent code(以最小化relocation)。它们由动态链接器mmap(2) ld-linux(8)编辑。 Linux processes address space virtual memory linux kernelpagingtext segment管理。

内核通常会共享读取段(例如proc(5))的共享库(因此它们的页面对不同的进程使用相同的RAM)。

您可以使用/proc/self/maps(或/proc/1234/maps进行pid 1234的过程)来查找进程的内存映射。请参阅RAM

您不应该关心(并且应用程序不会直接看到)RAM页面。只有内核管理物理MMU(它可以移动RAM中的页面,将它们分页到磁盘等)通过mincore(2)

另见mlock(2)& OOM。另请阅读thrashing& swap space& Advanced Linux Programming

阅读{{3}}!

答案 1 :(得分:0)

当我使用选项-fPIC进行编译时,我得到了相同的虚拟地址(可能是巧合)以及来自两个程序的整个库的物理地址相同。

  

gcc -fPIC -o aes openssl_aes.c -lcrypto

这证明共享库被加载到相同的物理位置。