gpt4 book ai didi

linux - 共享库如何被不同的进程共享?

转载 作者:太空狗 更新时间:2023-10-29 11:34:41 25 4
gpt4 key购买 nike

我阅读了一些使用 -fPIC 参数编译的共享库的文档,.so 的 .text seqment 将在进程 fork 的动态链接阶段共享(例如,进程会将 .so 映射到相同的物理地址)

我对谁(内核或 ld.so )以及如何完成它感兴趣?也许我应该跟踪代码,但我不知道从哪里开始。

尽管如此,我尝试验证这个说法。
我决定检查 libc. 中的函数地址,如 printf,以便所有 c 程序都将链接。得到了进程的printf虚拟地址,需要得到物理地址。尝试编写内核模块并将地址值传递给内核,然后调用 virt_to_phys。但它不起作用,因为 virt_to_phys 仅适用于 kmalloc 地址。

因此,进程页表查找可能是找到虚拟地址映射到物理地址的解决方案。有什么方法可以查看页表吗?或者其他方法可以适合验证实验?

提前致谢!

最佳答案

动态加载器使用具有 MAP_PRIVATE 和适当权限的 mmap(2)。您可以通过从 strace -e file,mmap 运行命令来查看它的确切作用。例如:

strace -e file,mmap ls 

所有的魔法都来自 mmap(2)mmap(2) 在调用过程中创建映射,它们通常由文件或交换(匿名映射)支持。在文件支持的映射中,MAP_PRIVATE 意味着写入内存不会更新文件,并导致该页面从该点开始由交换支持(写时复制)。

动态加载器从 ELF 的程序头中获取它需要的信息,您可以通过以下方式查看:

readelf -l libfoo.so

根据这些,动态加载器确定将什么映射为代码、只读数据、数据和 bss(文件中零大小的零填充段,内存中的非零大小,以及仅在隐秘性上匹配的名称Lisp 的汽车和 cdr)。

因此,事实上,代码还有数据是共享的,直到写入导致写时复制。这就是为什么将常量数据标记为常量是一种潜在的重要空间优化(参见 DSO howto)。

您可以在 mmap(2) 联机帮助页和 Documentation/nommu-mmap.txt 中获得更多信息(MMU 案例,无 MMU 适用于嵌入式设备,如 ADSL 路由器和任天堂 DS)。

关于linux - 共享库如何被不同的进程共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com