![]() |
1
12
修补可重定位地址并不是什么大问题,它以微秒级的内存速度运行。更大的问题是,包含此代码的页面现在需要由分页文件而不是dll文件进行备份。换句话说,当包含代码的页面被取消映射时,它们需要被写入分页文件,而不是被丢弃。 这种方法的成本并不容易测量,尤其是在拥有大量RAM的现代机器上。它只在机器开始承受大量进程争用内存的负载时才起作用。以及分页文件的碎片。 但显然,重新平衡是一种非常廉价的优化。在debug+window s+modules窗口中很容易看到,重新设定的DLL上有一个明亮的图标。地址列给您一个很好的提示,什么基地址是一个好的选择。在它们之间留有足够的空间,这样你就不必随着程序的增长而不断地调整它。 |
![]() |
2
7
我想自己提供一个答案,尽管 answers of Hans Passant 其他人已经很好地描述了这种权衡。 最近在我们的应用程序中处理了dll基地址之后,我将在这里给出我的结论: 我认为,除非您能够证明,否则为DLL提供一个非默认的基地址是徒劳的。这包括重新设置我的DLL。
综上所述,我认为重新平衡 不值得麻烦 除了特殊情况,如系统DLL。 我想添加一个我在旧的新事物上发现的历史片段: How did Windows 95 rebase DLLs? ——
看看这个过程是如何完成的( read the whole thing )我个人怀疑“重新平衡是邪恶的”立场的一部分可以追溯到旧时代的Win9x和低内存条件。 看,现在有一个 non-historical piece on Old New Thing :
|
![]() |
3
4
加载时间的变化是最小的,因为v-table是用新地址更新的。但是,如果您的内存不足,以至于页面文件中的内容被加载/加载,那么系统必须将DLL保存在页面文件中(因为地址被更改)。如果重新设定了DLL的基-并且重新设定的DLL不会与任何其他DLL发生冲突-那么,系统只会覆盖内存并从硬盘驱动器上的原始DLL重新加载DLL,而不是将它们交换到页面文件(和背面)。 只有当系统对主存中的东西进行分页时,这个好处才是相关的。上次我努力保存应用程序数据库及其基地址的时间是在vb6天,那时我们办公室和数据中心的计算机甚至幸运地拥有256MB的RAM。
目前,ASLR只影响具有动态重定位标志集的DLL和可执行文件。这包括Vista/Win7系统DLL和可执行文件,以及任何开发人员制作的项目。 在构建期间,开发人员故意设置该标志 . 如果您要设置动态重定位标志,那么就不必重新设置DLL。如果您的所有客户机都有4GB的RAM,那么就不用麻烦了。如果你的老板是个小气鬼,那也许吧。 |
![]() |
4
3
您必须考虑必须从HDD读取用户DLL(尚未加载到其他进程中)。通常内存映射用于此目的(它使用延迟加载),因此如果必须重新定位它们,则必须在进程启动之前从HDD中实际读取它们。 对于由其他进程加载的那些进程,使用copy-on-write机制。因此,同样地,重新定位它们意味着额外的操作。 ASLR的目的是为了安全,而不是为了性能。 |
![]() |
5
1
是的,你应该这样做。 ASLR只影响“系统”DLL,因此您正在编写的DLL不应受到ASLR的影响。此外,ASLR并没有完全“随机化”这些系统二进制文件的位置,它只是简单地将它们在VM映射的基本位置上随机移动。 |
|
Guilherme Albertini · DLL中的类 7 年前 |
![]() |
Naomi · C#dll资源文件更改语言 7 年前 |
![]() |
AidanH · C#DLL语言翻译实现[关闭] 7 年前 |
![]() |
subham · DLL函数调用不工作 7 年前 |
![]() |
PixelThis · 为什么我的DLL要求我的程序有一个特定的名称? 7 年前 |
![]() |
nemo · DLL的“好”调用约定是什么? 7 年前 |