Не означает ли ASLR перезагрузка DLL?
Я правильно понимаю, что в нашей сборке нет смысла восстанавливать наши DLL, если мы будем использовать ASLR, так как dlls снова будут пересозданы когда ядро загружается?
Я обеспокоен тем, что наше приложение часто используется на машинах служб терминалов. Таким образом, если перезагрузка происходит во время загрузки, мы можем в конечном итоге переупаковать dll для каждого процесса, в который они загружены (будет один процесс за сеанс). И это приведет к увеличению использования памяти и поискового вызова, чем мы хотим заплатить. Мне нужно быть обеспокоенным?
Я нашел следующее сообщение в блоге, в котором говорится, что перезагрузка происходит только один раз, и она является системной: Matt Evans - включение ASLR для экономии памяти?. Я не видел никаких других ссылок об этом, поэтому просто хотел быть уверенным, что если я использую ASLR и не переустанавливаю во время нашей сборки, я не буду вызывать проблемы с памятью в окне служб терминалов?
Ответы
Ответ 1
Поэтому, основываясь на моем чтении, у вас не должно быть проблем. ASLR заставляет dll загружаться в полуаудитный адрес памяти и не должен начинать перезагрузку для каждого процесса. Если вы хотите проверить использование dll в памяти, есть бесплатный инструмент MassiveRebase, который позволяет динамически загружать две dll и просматривать информацию об их использовании в памяти. Он был разработан для просмотра изменений, которые могут быть сохранены в памяти.
Инструмент и многое другое можно найти здесь: http://www.tmurgent.com/appv/index.php/en/resources/tools/137-massive-rebase
Надеюсь, это поможет.
Ответ 2
Rebasing все еще помогает. Когда операционная система загружается, она применяет фиксированное случайное значение к базе DLL.
В результате загружается DLL, типичная для одной загрузки, но отличается между машинами и загрузками.
Это означает, что данная DLL в большинстве процессов может быть разделена между процессами, поскольку все ее данные кода разделяются с тем же значением.
Когда DLL перемещается из-за того, что оно занимает адресное пространство, оно должно изменять исправления, и меньше DLL является общим, что увеличивает загрузку системы.
Если ваша DLL не является общей, то это не влияет на ресурсы.
Стоимость исправления DLL была дешевле, если она была загружена в нужное место, не уверен, что это верно для ASLR, но может сохранить время загрузки ресурсов.