DLL 只会真正加载一次。如果您的应用程序开始使用特定的 DLL,例如来自 MS-Office 的某些内容,动态加载程序将链接和重定向调用。
但是,什么时候为各种不同的用户和应用程序重复引用 DLL,在系统上将 DLL 镜像推送到系统空间,以便所有应用程序都可以使用它?
否则加载的图片是否留在用户空间?
请记住:所有应用实际上都在查看相同的 2gb 系统空间,这是通过虚拟寻址为它们虚拟化的,
或者,链接器是否始终将 DLLS 加载到内核空间,以便所有应用程序都可以使用它们。
最佳答案
DLL’s are only ever really loaded once.
这是不正确的。当进程由操作系统的加载程序启动时,或者当您通过 API 函数(如 LoadLibrary)请求它时,它们被映射到虚拟地址空间。每个进程都会获得一个新拷贝,并且每次发生这种情况时都会初始化 DLL。
没有所有进程同时使用的全局“系统空间”。每个进程都有自己的私有(private)虚拟地址范围(在 32 位 Windows 上为 4GB,通常有 2GB 可用内存)。如果您在自己的虚拟内存中覆盖 DLL 的某些部分,则其他进程中的 DLL 拷贝不会受到影响。如果不是这样,一个进程很容易使整个系统崩溃。
关于c++ - DLL加载和系统镜像空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23334120/