6

在 MSVC 中,Base Address Randomizaiton 是默认选项。(从 VS2005 开始?)

因此,我不再手动重新设置 dll 的基地址。

但是当我使用 VS2003 时,我重新设置了所有 dll 以提高加载性能。

如果我使用 ASLR 选项,加载性能总是下降?
(当然我可以得到其他好处)

4

1 回答 1

10

最简洁的答案是不。

在没有 ASLR 的系统(例如 XP)上,在非首选地址加载 DLL 有几个成本:

  1. 必须解析重定位部分,并且必须将修复应用于整个图像。
  2. 应用修复的行为会导致写入时复制错误,这在 CPU 方面相对昂贵,并且即使应用程序本身没有引用页面,也会强制从磁盘读取页面。
  3. 在非首选地址加载 DLL 的每个进程都会获得写入的每个页面的私有副本,从而导致内存使用量增加。

项目 2 和 3 是迄今为止最大的成本,并且是过去需要手动重新设置 DLL 的主要原因。

使用 ASLR,修复程序由操作系统透明地应用,使得 DLL 看起来像是实际加载到其首选地址。没有写时复制错误,也没有创建进程私有页面。此外,修复仅应用于应用程序实际访问的页面,而不是整个图像,这意味着不会从磁盘读取额外数据。

除此之外,手动变基方案不能防止所有基地址冲突(例如,来自不同供应商的 DLL 可能会相互冲突,或者 OS DLL 可能会由于修补程序而增加大小并溢出到保留的范围内其他一些 DLL 等)。ASLR 在处理这些问题方面效率更高,因此从整体来看,它实际上可以提高性能。

于 2010-09-08T05:42:46.807 回答