О ImageBase .EXE в Windows

Я только что узнал, что ImageBase указан в формате PE, и ОС загрузит его точно в позицию для .EXE , затем возникает вопрос:

что, если для двух .EXE требуется одно и то же местоположение ImageBase?


person COMer    schedule 18.09.2010    source источник


Ответы (2)


В случае двух EXE-файлов у них совершенно разные адресные пространства... Каждый исполняемый файл имеет свое собственное пространство. Это означает, что каждый раз, когда вы запускаете EXE-файл, ему назначается собственное независимое 4GB (в 32-битных системах, хотя процесс может использовать только его часть, остальное достается ядру) стоит адресное пространство. Это виртуальное адресное пространство. Она отличается от вашей физической памяти.

Так что конфликта нет.

Технически PE может загружаться где угодно, но по умолчанию ImageBase это 0x400000.

Теперь предположим, что у вас есть EXE, и он загружает пару DLL (которые имеют один и тот же ImageBase)... В этом случае первая DLL загружается нормально, вторая перемещается (или «перебазируется»). Каждая DLL имеет раздел .reloc, который содержит данные об обновлении ссылок в коде.

person st0le    schedule 18.09.2010
comment
Как может не быть конфликта, когда оба EXE загружаются в 0x4000000? - person COMer; 18.09.2010
comment
@StOle, а как насчет адреса в окне разборки Visual Studio, это виртуальный адрес или физическая память? - person COMer; 18.09.2010
comment
@harper, это виртуально. Подумайте об этом так: у процессов будет 4 ГБ адресного пространства, даже если у вас 256MB ОЗУ. Это возможно из-за виртуальной памяти (/Paging). - person st0le; 18.09.2010

вы можете использовать Process Explorer, чтобы увидеть значение адресов ImageBase и Base. любого запущенного приложения (с его DLL). Основываясь на этих значениях, вы можете увидеть, произошло ли перебазирование.

person mox    schedule 18.09.2010