Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Указание базового адреса модуля 
Author Message
MVV



PostPosted: Tue Mar 23, 2010 09:48    Post subject: Указание базового адреса модуля Reply with quote

Вот интересно, просмотрел кучу плагинов, которые валяются у меня на рабочем компе, ну и некоторых библиотек, прилагаемых к ним. И могу сказать, что практически никто при компиляции плагина не изменяет базовый адрес модуля.

Каждый модуль (динамическая библиотека) имеет характеристику 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…
View user's profile Send private message ICQ Number


Powered by phpBB © 2001, 2005 phpBB Group