免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jeanlove
打印 上一主题 下一主题

[讨论一下!]我发现动态库并不是只存在一份内存拷贝 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2008-09-29 14:16 |只看该作者
原帖由 shenbo7 于 2008-9-29 10:30 发表
我画了张图,不知对否,请斧正....

291496

这个图不对,首先库加载的位置错了,它不是和进程的代码段数据段放在一起的。
其次“内核把用户数据段地址告诉库”不对,内核不参与这个工作,其实库的代码段根本不需要知道数据确切地址。

论坛徽章:
0
52 [报告]
发表于 2008-09-30 14:10 |只看该作者
原帖由 zx_wing 于 2008-9-29 14:12 发表
我还可以告诉你,有一种情况可能造成不同进程看到变量i的地址不一样。但我感肯定不是你所以为的“严格来说虚拟地址并不一样”,从你回复中我知道你并不知道这个虚拟地址受什么影响,在什么情况下不一样。


我如果什么都知道了还在这里浪费时间干吗?
说了半天还不是承认了虚拟地址是不一样的!我说的“严格来说”的意思是:哪怕只有0.01%的情况下,通过GOT/PLT计算出的最终虚拟地址不同,那么就必须认为虚拟地址是不同的。其实从常理就可以推断出:如果虚拟地址是一样的,那么就没必要引入GOT/PLT等复杂的手段了

至于什么情况下虚拟地址不一样,我暂时没环境去试。但我想主要跟进程地址空间的映射有关。从这个想法出发,不难构造出试验用例

论坛徽章:
0
53 [报告]
发表于 2008-09-30 18:49 |只看该作者
原帖由 ytl 于 2008-9-30 14:10 发表


我如果什么都知道了还在这里浪费时间干吗?
说了半天还不是承认了虚拟地址是不一样的!我说的“严格来说”的意思是:哪怕只有0.01%的情况下,通过GOT/PLT计算出的最终虚拟地址不同,那么就必须认为虚拟地址 ...

MD,我太无聊了,不玩了。
兄弟,你既然知道自己不懂了,我劝你就认真去学习一下,搞懂了你就知道“哪怕只有0.01%的情况下,通过GOT/PLT计算出的最终虚拟地址不同”、“说了半天还不是承认了虚拟地址是不一样的”是多么可笑的说法。
什么时候你知道怎么手工算共享库中一个全局变量在进程地址空间中的虚拟地址时,你就算懂了,在这里想当然没用的。

[ 本帖最后由 zx_wing 于 2008-9-30 19:10 编辑 ]

论坛徽章:
0
54 [报告]
发表于 2008-10-01 11:49 |只看该作者
我在电脑上试了一下,同一个动态库中的全局变量在两个不同的进程中打印出来的地址不一样啊,而且在我的系统(fedora 8, x86)上主程序访问库中那个全局变量并未通过got或plt,在编译的时候那个全局变量的地址都已经在主程序中被定死了(而不是像访问动态库中的函数那样需要重定位),这好像意味着在我这个试验中动态库中的这个全局数据并没有通过COW方式,而是在程序加载时就把它放在了主程序的数据段中(因为我发现它的地址与我在主程序中定义的几个全局变量地址在一块儿)

论坛徽章:
0
55 [报告]
发表于 2008-10-01 13:17 |只看该作者
原帖由 bobozhang 于 2008-10-1 11:49 发表
我在电脑上试了一下,同一个动态库中的全局变量在两个不同的进程中打印出来的地址不一样啊,而且在我的系统(fedora 8, x86)上主程序访问库中那个全局变量并未通过got或plt,在编译的时候那个全局变量的地址都已 ...


编译参数正确吗?怎么有点象静态库

论坛徽章:
0
56 [报告]
发表于 2008-10-01 16:26 |只看该作者
原帖由 ytl 于 2008-10-1 13:17 发表


编译参数正确吗?怎么有点象静态库



不是静态库。我在主函数中还调用了那个库的一个函数,这个函数是通过plt访问的。

论坛徽章:
0
57 [报告]
发表于 2008-10-04 18:41 |只看该作者
假设有M个进程共享一个动态库函数。设该动态库函数共占N页。在每个进程的虚拟空间里,这个动态库函数的代码都占N页。但是,所有进程的N页都映射到物理空间的同一块空间。因此,一个进程在物理内存占N页,M个进程也只占N页。

论坛徽章:
0
58 [报告]
发表于 2008-10-04 20:37 |只看该作者
我也来说两句吧

ytl你真的还是按照zx_wing的建议看看虚拟地址等知识吧。
不同进程里相同的虚拟地址,也就是LZ例子中的变量i,被操作系统映射到不同的物理地址。

论坛徽章:
0
59 [报告]
发表于 2008-10-04 21:56 |只看该作者
现在的问题是,不同进程打印出来的那个库中的全局变量地址是不一样的,好像说他们的地址是一样的没有啥子依据(或许是我不晓得)

论坛徽章:
0
60 [报告]
发表于 2008-10-05 13:41 |只看该作者
原帖由 2eye 于 2008-10-4 20:37 发表
我也来说两句吧

ytl你真的还是按照zx_wing的建议看看虚拟地址等知识吧。
不同进程里相同的虚拟地址,也就是LZ例子中的变量i,被操作系统映射到不同的物理地址。


“不同进程里相同的虚拟地址”有什么根据?你跟一开始的zx_wing一样,连问题是什么都没搞清楚就夸夸其谈

[ 本帖最后由 ytl 于 2008-10-5 14:18 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP