Вызывает ли ASLR медленную загрузку библиотек DLL?

В MSVC рандомизация базового адреса является опцией по умолчанию (начиная с VS2005?)

Итак, я больше не перебазирую базовый адрес dll вручную.

Но я перебазировал все свои библиотеки DLL, чтобы повысить производительность загрузки при использовании VS2003.

Если я использую опцию ASLR, производительность загрузки всегда снижается?
(Конечно, я могу получить другие преимущества)


person Benjamin    schedule 01.09.2010    source источник
comment
Должен признаться, мне интересно. ASLR, казалось бы, отменяет старые настройки производительности ОС. И я знаю, что Windows ВСЕ ЕЩЕ чертовски долго загружается.   -  person Chris Becke    schedule 01.09.2010


Ответы (1)


Краткий ответ: нет.

В системе без ASLR (например, XP) загрузка DLL по непредпочтительному адресу имеет несколько затрат:

  1. Раздел перемещений должен быть проанализирован, а исправления должны быть применены ко всему образу.
  2. Акт применения исправлений вызывает ошибки копирования при записи, которые относительно дорого обходятся процессору, а также заставляют читать страницы с диска, даже если на них не ссылается само приложение.
  3. Каждый процесс, который загружает DLL по непредпочтительному адресу, получает частную копию каждой страницы, на которую записывается запись, что приводит к увеличению использования памяти.

Пункты 2 и 3 на сегодняшний день являются самыми большими затратами и являются основной причиной, по которой раньше было необходимо вручную перемещать библиотеки DLL.

С ASLR исправления применяются ОС прозрачно, создавая впечатление, что DLL действительно загружена по предпочтительному адресу. Отсутствуют ошибки копирования при записи и не создаются личные страницы процесса. Кроме того, исправления применяются только к тем страницам, к которым фактически обращается приложение, а не ко всему образу, что означает, что с диска не считываются дополнительные данные.

Кроме того, схемы ручного перемещения не могут предотвратить все конфликты базовых адресов (например, DLL от разных поставщиков могут конфликтовать друг с другом, или DLL ОС может увеличиться в размере из-за исправления и выйти за пределы диапазона, зарезервированного для какая-то другая DLL и т.д.). ASLR намного эффективнее справляется с этими проблемами, поэтому, если смотреть на систему в целом, это действительно может повысить производительность.

person Pavel Lebedinsky    schedule 08.09.2010
comment
Я писал упаковщик/распаковщик раньше, и ваши пункты 1,2,3 верны, так как вам нужно пройтись по таблице перемещений и вручную применить все исправления в программе сборки. Но я думаю, что когда процесс разветвляется на другой, изначально они используют одну и ту же таблицу страниц, пока механизм COW не заставит их различаться (в случае ASLR), и поэтому необходимо дублирование таблицы страниц. А это также означает создание дополнительных записей TLB (иногда даже сброс кэша TLB) при переводе страницы MMU. Из-за этого пострадает производительность? - person Peter Teoh; 14.10.2011
comment
@Pavel: Откуда у тебя эта информация? Мне интересно прочитать о влиянии ASLR на производительность в Windows. Помимо вашего ответа здесь, мои поиски дали очень мало. - person mcmcc; 27.01.2012
comment
Я никогда не читал, что исправления ASLR применяются операционной системой прозрачно. У кого-нибудь есть ссылка на это? - person Adrian McCarthy; 03.09.2015