我使用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。任何帮助或指针/链接将受到高度赞赏。提前谢谢。
答案 0 :(得分:2)
阅读Drepper的论文How To Write Shared Libraries。
共享库使用position independent code(以最小化relocation)。它们由动态链接器mmap(2) ld-linux(8)编辑。 Linux processes address space virtual memory linux kernel由paging至text 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
这证明共享库被加载到相同的物理位置。