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

zhpforbiancheng 2013-04-12 04:24:44
众所周知,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内存镜像的只读代码段还会是在本质上共享的同一份吗?
恳求大神指教,不胜感激
...全文
507 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhpforbiancheng 2013-04-23
  • 打赏
  • 举报
回复
唔,Copy-On-Write原则,我貌似懂了
myjisgreat 2013-04-18
  • 打赏
  • 举报
回复
你说的地址是虚拟地址,是系统帮你映射到物理内存,不同的虚拟地址可以映射到同一块物理地址,地址看上去不同,其实是一样的
wocow3 2013-04-13
  • 打赏
  • 举报
回复
引用 2 楼 zhpforbiancheng 的回复:
引用 1 楼 ydfivy 的回复:嗯哪,同一份。 物理页面中只有一份。 假设dll_test代码段中有这么一段代码: mov eax, 0x40100; 0x40000是基址,0x40100是一函数地址 则dll_test首次被process_a加载到内存后,这一条指令被重定位为: mov eax, 0x50100 再假如dll_test被process_b……
如果DLL基址重定位,而代码段中有基于重定位地址的访问,该访问指令会由loader修改,而该代码段所在页就不能作为共享的代码页存在了
一个傻冒 2013-04-13
  • 打赏
  • 举报
回复
而且这也只是几个页面的事。不算影响dll的本质。
一个傻冒 2013-04-13
  • 打赏
  • 举报
回复
呵呵,dll也有写时复制这一说
zhpforbiancheng 2013-04-12
  • 打赏
  • 举报
回复
引用 1 楼 ydfivy 的回复:
嗯哪,同一份。 物理页面中只有一份。
假设dll_test代码段中有这么一段代码: mov eax, 0x40100; 0x40000是基址,0x40100是一函数地址 则dll_test首次被process_a加载到内存后,这一条指令被重定位为: mov eax, 0x50100 再假如dll_test被process_b加载到地址为0x60000的地方,那么这条指令应该为: mov eax, 0x60100 请问我说的可对? 如果对的话,那么阁下“物理页面中只有一份”的说法则是不正确的啊,呵呵
一个傻冒 2013-04-12
  • 打赏
  • 举报
回复
嗯哪,同一份。 物理页面中只有一份。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧