Несколько дней назад я начал играть в формате PE. Я сделал небольшой загрузчик PE, который может загружать разделы в память в соответствии с их виртуальными адресами. Например, у меня есть раздел .text
по виртуальному адресу 0x1000
, или раздел .data
на 0x2000
. С моим небольшим кодом сборки я загрузил файл PE на некоторое свободное место (0x10000
), и я загрузил разделы PE из его позиций. Так, раздел .text
на 0x11000
(0x10000 + 0x1000
), .data
на 0x12000
и т.д ... Но когда я ссылаться мои данные в сборке из .code
месте, я обнаружил (в разборке), что это указывает на 0x402000
. В Интернете я нашел что-то вроде базы изображений, которая специфична для каждого типа изображения ... Но я не понимаю, как может быть .exe
, загруженный в 0x402000
, когда есть много исполняемых файлов, запущенных в Windows, например. Кто-нибудь, почему это так, как это работает и как я могу теоретически реализовать его в моей самой базовой системе?Данные в исполняемом файле находятся в неизвестном положении
Пожалуйста, помогите.
нормально, и как ОС, выполняющая эту обычную инструкцию по сборке, адресует другое местоположение? Как это возможно? – user35443
Жаль, что все было неясно. Это функция компоновщика, а не ОС. Я обновил ответ. – nneonneo
ОК, но все же. Если это не физический адрес, как ЦП знает, где он должен читать/писать байты с/на? – user35443