MVV

|
Posted: Tue Mar 23, 2010 09:48 Post subject: Указание базового адреса модуля |
|
|
Вот интересно, просмотрел кучу плагинов, которые валяются у меня на рабочем компе, ну и некоторых библиотек, прилагаемых к ним. И могу сказать, что практически никто при компиляции плагина не изменяет базовый адрес модуля.
Каждый модуль (динамическая библиотека) имеет характеристику ImageBase, которая указывает предпочтительный адрес для размещения в памяти процесса при загрузке модуля. Все абсолютные адреса функций и данных модуля в коде указываются с рассчетом на этот адрес. Если при загрузке библиотеки в адресное пространство процесса система замечает, что данный адрес уже занят, она размещает библиотеку по некоторому свободному адресу, при этом корректируя все абсолютные адреса в коде с учетом нового базового адреса. Также, раз код изменяется, он уже не может быть общим с кодом других экземпляров той же библиотеки, и занимает дополнительную память (хотя, для плагинов это, как правило, не критично, так как они редко грузятся по несколько раз, разве что при использовании нескольких инстанций ТК). То есть, чтобы библиотека загружалась быстрее и потребляла меньше памяти, нужно на стадии компоновки выбирать уникальный базовый адрес.
Насколько я понимаю, для модулей ТК нет единой схемы или правила распределения плагинов по адресам (поправьте, пожалуйста, если я ошибаюсь), большинство плагинов (здесь могу быть неточен, т.к. имею лишь около трех десятков модулей в распоряжении на момент анализа - у кого есть интерес, проанализируйте свои, например, с помощью FileInfo, секция OPTIONAL HEADER, поле Image Base) используют стандартный адрес 0x10000000, т.е. системе приходится загружать в дополнительную память и корректировать все плагины, использующие данный базовый адрес, загруженные после первого занявшего его. Далее, некоторые используют адрес 0x400000 - это вообще ужас. Не знаю, какой компоновщик допускает это, но сами приложения (и ТК - не исключение) грузятся по этому адресу, т.е. такие модули всегда будут требовать корректировки при загрузке. Пожалуй, самый образцовый плагин среди анализируемых - Imagine. У него каждая библиотека (Imagine.dll, Imagine.wlx, Imagine.wcx, его плагины) имеет свой базовый адрес. Для своей VirtualPanel я также указал отличный от стандартного базовый адрес.
Думаю, неплохо бы как-то (разумеется, более разумно - и на офсайте) составить таблицу и распределить базовые адреса по модулям, чтобы избежать пересечения адресных пространств плагинов (особенно это будет полезно тем, кто их использует десятками и сотнями). _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|