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

C 两个不同的程序是否在同一物理内存位置加载共享库函数,c,linux,operating-system,shared-libraries,shared-memory,C,Linux,Operating System,Shared Libraries,Shared Memory,我正在使用OpenSSL共享库使用AES_cbc_encrypt()函数进行简单加密。我想知道,如果我从两个不同的程序中使用这个AES_cbc_encrypt()函数,两个程序是否都指向这个AES_cbc_encrypt()函数在物理内存中的相同位置 我的其他问题是 1>如果我使用共享库,它是否会被所有使用它的程序自动指向相同的物理内存位置 或 2>我是否需要遵循其他技术来强制程序在RAM中的相同物理内存中加载共享库。(我不这么认为,共享记忆的概念是没有用的,这是我的理解) 3> 如何检查两个程

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

我的其他问题是

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

2>我是否需要遵循其他技术来强制程序在RAM中的相同物理内存中加载共享库。(我不这么认为,共享记忆的概念是没有用的,这是我的理解)

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

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

例如,我的虚拟地址是

=0x400cb0
虚拟地址

起始地址-结束地址

 00400000-00402000  
物理页

 : A600000000036E26

 : A60000000008A4C3
在我的系统中

**虚拟地址空间:48位

物理地址空间:36位**

我在Linux下使用GCC。任何帮助或指针/链接将不胜感激。提前感谢。

请阅读德雷珀的论文

共享库使用(以最小化)。它们由动态链接器定义。Linux的in由thru管理

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

您可以使用
/proc/self/maps
(或
/proc/1234/maps
查找进程的内存映射。看

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

另见&。还可以阅读&&


当我使用option-fPIC编译时,我从两个程序中获得了整个库的相同虚拟地址(可能是巧合)和物理地址

gcc-fPIC-o aes openssl_aes.c-lcrypto


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

@Basile,感谢您的回答。我试图验证这两个程序是否指向RAM中的同一物理位置,但无法做到。任何关于那个方向的线索。我从另一个地方读到它提到(理论上)两个程序指向同一个位置。我想按程序检查,你不必在意。RAM由内核管理,应用程序代码看不到它。应用程序只能看到虚拟内存。@bholanath:通常您找不到该映射。物理映射可能会从一个瞬间变为另一个瞬间。你的问题没有任何意义。内核可以随意调出RAM页面(但通常不会这样做,除非在压力下)。当您查询内核时,信息可能已经过时了。。。。我认为
clflush
只能在内核内部使用。我是从申请的角度讲的。如果你不太熟悉Linux应用程序代码,不要在内核中编写代码。我不明白你为什么关心物理RAM。把它的管理留给内核,它做得很好。你为什么要问?看来你误解了。