【问题标题】:How are DLLs mapped into current programs virtual address spaceDLL 如何映射到当前程序的虚拟地址空间
【发布时间】:2015-08-13 00:17:43
【问题描述】:

当我在程序中加载一个 DLL 时,它是如何在内存中发生的?它会被加载到我的虚拟地址空间吗?如果是,文本和数据段存储在哪里?我正在维护一个 32 位程序,它使用大部分可用堆来进行图像处理例程,我想知道我应该为加载本身可能会占用大量空间的 DLL 担心多少。

【问题讨论】:

    标签: c++ dll


    【解决方案1】:

    是的:您的进程需要访问的所有内容都必须在其地址空间中。这也适用于您的代码和您的数据。

    在这里您可以找到有关anatomy of process memory and adress space 的更多信息 这里解释了dll are loaded into the virtual adress space

    备注:dll 可能在多个进程之间共享:然后操作系统只在内存中加载一次。但是每个使用它的进程都可能在其自己的虚拟地址空间中的不同位置看到它(另请参阅SO answer 关于相对虚拟地址)。

    【讨论】:

    • 所以术语“将DLL加载到进程的地址空间”意味着物理加载DLL(如果它尚未被另一个进程加载),然后将DLL开始的物理地址映射到进程的虚拟地址?然后大概要么必须修补进程中对 DLL 函数的所有引用(因为链接器不知道 DLL 将被加载到哪里),要么在调用它们时使用 GetProcAddress 懒惰地查找它们。对吗?
    • 大体思路。这取决于它是加载时间还是运行时间动态链接(更多在提供的第二个链接中)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2010-09-25
    • 1970-01-01
    • 2015-12-30
    • 2012-02-18
    • 2017-05-06
    相关资源
    最近更新 更多