среда, 11 ноября 2015 г.

Балансировка списка Known DLLs

Это перевод The Known DLLs Balancing Act. Автор: Реймонд Чен.

Неформально названная "Known DLLs" ("Известные DLL") возможность Windows является простым списком DLL (Dynamic Link Library), с которым специально сверяется системный загрузчик. Когда загрузчик загружает DLL со ссылкой на "известную" DLL, то копия "известной" DLL загружается сразу же, стандартный список поиска DLL игнорируется. Некоторые люди могут рассматривать этот механизм как механизм безопасности (хотя и довольно слабый), но в действительности же безопасность никогда не была целью этой возможности. Known DLLs создавались исключительно для улучшения производительности системы.

Механика Known DLL менялась со временем. В некоторых версиях Windows ядро использовало список "известных DLL" в качестве отправной точки, затем выясняло, с какими другими DLL они связаны, с каким DLL связаны DLL, связанные с "известными DLL" - и так далее. Этот процесс создавал транзитивное замыкание всех зависимостей и рассматривал все DLL в нём как "известные". В других версиях Windows такое транзитивное замыкание не строилось; вместо этого "известными" считались только DLL из данного списка. В некоторых версиях "известные DLL" загружались ядром при старте системы; в других версиях предзагрузки вообще не было, ядро просто использовало этот список для экономии времени для поиска полного пути.

Но не только интерпретация списка менялась от версии к версии. Менялось и содержимое самого списка. Команда производительности Windows меняла на основе своего видения того, как приложения используют Windows, и список и правила, по которым список преобразовывался во множество DLL. Как это обычно бывает, это была игра в компромиссы. Предзагрузка "известных DLL" при старте системы позволяла приложениям быстрее запускаться - но ценой увеличения времени загрузки системы и повышенному расходу памяти, поскольку кэшируемые DLL находятся в памяти постоянно, вне зависимости от того, используют ли их приложения. В общем, это вопрос улучшения одного аспекта системы за счёт другого. Добиться нужной пропорции - это сложная задача. Как вы можете видеть, список постоянно подстраивается под возникающие новые сценарии использования.

Одно из следствий механизма "известных DLL", которое не явно очевидно - "известные DLL" имеют приоритет над локально перенаправленными DLL. Если вы задумаетесь, то поймёте, что это, вообще-то, ожидаемое поведение, а не подводный камень. В самом деле, цель списка "известных DLL" - обойти поиск пути и, следовательно, ускорить загрузку DLL. Если бы ядру нужно было проверять локально перенаправленные DLL, то это просто замедлило бы всё обратно. Вы можете подумать, что добавление всего одной папки к поиску не скажется слишком сильно на производительности, но если эта папка - сетевой путь, то такая операция быстро станет узким местом.

Хотите верьте, а хотите нет, но мы видели программы, которые рассчитывали на то, что определённая DLL всегда будет находится в списке "известных DLL". Есть одна программа, которая хранит файл Version.dll в своей папке (папке приложения). В обычных условиях этот файл имел бы приоритет над Version.dll из системного каталога, но в Windows XP Version.dll перечислен в списке "известных DLL". Это означает, что Version.dll из папки приложения игнорируется и не используется, вместо неё используется Version.dll из системной папки. И это работало нормально (в Windows XP).

Однако в Windows Vista Version.dll больше не входит в список "известных DLL" - вероятно, команда производительности Windows решила, что эта библиотека не используется приложениями достаточно часто, так что игра не стоит свеч. В результате указанная программа перестала работать в Windows Vista, потому что приложение было разработано именно для Version.dll из системной папки, а не для Version.dll из своего собственного каталога программы. Иными словами, программа сама устанавливала DLL в один из путей поиска DLL, а затем рассчитывала на то, что Windows будет игнорировать эту DLL! Разумеется, если вы хотите, чтобы Windows игнорировала бы файл, то самым прямолинейным способом будет просто не устанавливать этот файл. Вишенка на торте: компания-разработчик этого приложения отправила в Microsoft баг-отчёт о найденной в Vista уязвимости безопасности.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.