【发布时间】:2017-04-25 14:18:03
【问题描述】:
我正在研究 Windows 系统内部,问题只是猜测。
我了解到 DLL 是共享库的一种形式,因此至少同一个 DLL 的代码部分在使用它的进程之间共享。 (通过将相同的页条目添加到这些进程的页表中)代码段通常有类似跳转表的东西,在它准备好执行之前需要重新定位(即写入运行时虚拟地址以修复指针) .
假设同一个 DLL aa.dll 映射到不同虚拟地址的两个不同进程中。 (例如a.exe 0x00400000 b.exe 0x00410000)相同的指针(.text+0x100)将被固定到不同的地址。 (例如a.exe 0x00400100 b.exe 0x004100100)。因此,我们必须复制代码部分并对其进行更改以适应一个流程。那么代码段怎么共享呢?
我说的对吗?
【问题讨论】:
-
RAM 页面当然不能共享。
-
我投票结束这个问题,因为它不是(还)一个编程问题。你能解释一下你的程序遇到的问题吗?然后我们可以尝试解决它。
-
@RaymondChen 我不同意,关于操作系统内部的问题are, in fact, on topic。事实上,程序员甚至能够理解这样的问题(远远不能回答它)。
-
@EJoshuaS 感谢指正
-
如果可能的话,共享 DLL通常会被加载到不同进程的相同地址。但是,据我所知,无法保证。 (实际上无法保证,因为第二个进程可能已经在使用相关地址空间。)