首页
社区
课程
招聘
[求助]多个进程共享同一动态链接库(DLL)的问题
发表于: 2013-4-12 16:11 6889

[求助]多个进程共享同一动态链接库(DLL)的问题

2013-4-12 16:11
6889
众所周知,windows动态链接库概念的产生主要是因为可共享代码段与可读数据段,用以节约内存空间。假设有一dll_test,建议装入的内存基址为0X40000,被进程process_a加载到内存中基址为0X50000的地方去了,此时dll_test在内存中的镜像铁定被重定位过了。又有一进程process_b欲加载dll_test,假如process_b的线性地址于0X50000的一段足以容纳dll_test的地址空间已被占用,则dll_test被process_b成功加载到内存的基址就铁定不能为0X50000了,那么此时process_a与process_b的dll_test内存镜像的只读代码段还会是在本质上共享的同一份吗?
恳求大神指教,不胜感激

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1700
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
只要没修改就是同一份   和映射地址无关
2013-4-12 18:59
0
雪    币: 2859
活跃值: (2663)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
假设有一指令(建议基址400000)
mov eax,401000

因为基址不同,导致在500000的基址就变成
mov eax,501000

这就算是修改了。应该就要引发Copy-On-Write。所以就不能共享了
2013-4-12 19:33
0
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
ls正解 参看windows internals 第六版 part2 P249

If DLLs were remapped at different locations inside different processes, the code could not be shared. The loader would have to fix up address references differently for each process, thus turning what had been shareable read-only code into process-private data. Each process using a given DLL would have to have its own private copy of the DLL in physical memory
2013-4-12 21:53
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
感谢各位,那么据HOWMAP与wmbol所说,是不是这样的:
process_a与process_b在物理页面共享同一实例的必要条件是,两进程必需同时给定dll_test相同的基址,无论dll_test装载时被重定位代码于否?
2013-4-12 22:26
0
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
嗯 只要基址相同 就不需要拷贝一份了
2013-4-12 22:44
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
谢谢大神们、尤其感谢wmbol与HOWMP
2013-4-15 09:51
0
游客
登录 | 注册 方可回帖
返回
//