О bound import'e писали неоднократно, поэтому подробно останавливаться на нем не вижу смысла, напомню лишь что это, в общих чертах.
Bound import позволяет сэкономить время загрузки модуля, за счет кеширования адресов ф-ций в импорте.
То есть, системный загрузчик не делает получение адресов ф-ций из их имен, если выполнены некоторые условия для этого.
Условия следующие:
* Виртуальный адрес у директории bound import'a не должен быть равен нулю
* временные штампы в IMAGE_BOUND_IMPORT_DESCRIPTOR и в хедере импортируемого модуля совпадают
* Для dll: модуль не должен быть ребазирован (незнаю правда, насколько эта информация справедлива для систем с aslr)
Стандартные приложения windows используют bound import очень активно.
Мне стало интересно, много ли инструкций экономит эта фича.
Проверялось число инструкций для notepad.exe ( win xp sp3 ), с apc диспатчера, то есть с первых инструкций(в UM) после старта процесса и до entry point приложения.
Для notepad без bound import'a число инструкций = 2280899
Для notepad с bound import'ом число инструкций = 2268677
Разница 12222, т.е. всего пол процента от общего числа инструкций ( до точки входа ).
Однако стоит помнить, что обход импорта это рекурсивная процедура:
LdrpWalkImportDescriptor => LdrpLoadImportModule => LdrpWalkImportDescriptor
LdrpWalkImportDescriptor => LdrLoadDll => LdrpWalkImportDescriptor
То есть прирост в производительности от использования bound import'a может быть заметным, если задействовано большое количество импортируемых модулей.
Bound import позволяет сэкономить время загрузки модуля, за счет кеширования адресов ф-ций в импорте.
То есть, системный загрузчик не делает получение адресов ф-ций из их имен, если выполнены некоторые условия для этого.
Условия следующие:
* Виртуальный адрес у директории bound import'a не должен быть равен нулю
* временные штампы в IMAGE_BOUND_IMPORT_DESCRIPTOR и в хедере импортируемого модуля совпадают
* Для dll: модуль не должен быть ребазирован (незнаю правда, насколько эта информация справедлива для систем с aslr)
Стандартные приложения windows используют bound import очень активно.
Мне стало интересно, много ли инструкций экономит эта фича.
Проверялось число инструкций для notepad.exe ( win xp sp3 ), с apc диспатчера, то есть с первых инструкций(в UM) после старта процесса и до entry point приложения.
Для notepad без bound import'a число инструкций = 2280899
Для notepad с bound import'ом число инструкций = 2268677
Разница 12222, т.е. всего пол процента от общего числа инструкций ( до точки входа ).
Однако стоит помнить, что обход импорта это рекурсивная процедура:
LdrpWalkImportDescriptor => LdrpLoadImportModule => LdrpWalkImportDescriptor
LdrpWalkImportDescriptor => LdrLoadDll => LdrpWalkImportDescriptor
То есть прирост в производительности от использования bound import'a может быть заметным, если задействовано большое количество импортируемых модулей.
Комментариев нет:
Отправить комментарий