【问题标题】:DLL loading and system image spaceDLL 加载和系统映像空间
【发布时间】:2014-04-28 18:00:34
【问题描述】:

DLL 只会真正加载一次。如果您的应用开始使用特定的 DLL(例如 MS-Office 中的某个 DLL),动态加载程序将链接和重定向调用。

但是,对于各种不同的用户和应用程序,DLL 的重复引用何时会在系统上将 DLL 映像推送到系统空间中,以便所有应用程序都可以使用它?

否则,加载的图像是否保留在用户空间中?

请记住:所有应用实际上都在查看相同的 2gb 系统空间,并且这是通过虚拟寻址为它们虚拟化的,

或者,链接器是否总是将 DLLS 加载到内核空间中,以便所有应用程序都可以使用它们。

【问题讨论】:

    标签: c++ windows dll


    【解决方案1】:

    DLL 只会真正加载一次。

    这是不正确的。当进程由操作系统的加载程序启动时,或者当您通过 API 函数(如 LoadLibrary)请求它时,它们被映射到虚拟地址空间。每个进程都会获得一个新副本,并且每次发生这种情况时都会初始化 DLL。

    没有所有进程同时使用的全局“系统空间”。每个进程都有自己的私有虚拟地址范围(在 32 位 Windows 上为 4GB,通常为 2GB 可用内存)。如果您在自己的虚拟内存中覆盖 DLL 的部分内容,则其他进程中的 DLL 副本不会受到影响。如果不是这样,一个进程很容易使整个系统崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 2010-09-25
      • 2020-05-13
      • 2022-10-24
      相关资源
      最近更新 更多