Рубрики
Windows информация

Структура и процесс загрузки EXE-программы

Описание:

В отличии от COM-программы, EXE-программы могут состоять из нескольких сегментов.
Кодов, данных, стека.
EXE-программы могут занимать больше 64Кбайт.
EXE-файл имеет заголовок, который используется при его загрузке.
Заголовок состоит из: форматированной части содержащей сигнатуру и данные,
необходимые для загрузки EXE-файла, и таблицы настройки адресов (Relocation Table)
Таблица состоит из значений в формате сегмент:смещение.

Запуск EXE-программы:

0. вызов функции DOS4Bh
1. Определяется сегментный адрес свободного участка памяти, размер которого достаточен для размещения программы.
2. Создается и заполняется блок памяти для переменной среды.
3. Создается блок памяти для PSP  и программы (сегмент:0000h - PSP; сегмент+0010h:0000h - программа)
В поле PSP заносятся соответствующие значения.
4. Адрес DTA устанавливается равным PSP:0080h.
5. В рабочую область загрузчика считывается форматированная часть заголовка EXE-файла.
6. Вычисляется длина загрузочного модуля по формуле:
Size=((PageCnt*512)-(HdrSize*16))-PartPag.
7. Определяется смещение загрузочного модуля в файле, равное HdrSize*16.
8. Вычисляется сегментный адрес (START_SEG) для загрузки - обычно это PSP+10h
9. Считывается в память загрузочный модуль (начиная с адреса START_SEG:0000).
10. Для каждого входа таблицы настройки:
  а) читается слово I_OFF и I_SEG
  б) вычитается RELO_SEG=START_SEG+I_SEG
  в) читается слово по адресу RELO_SEG:I_OFF
  г) к прочитанному слову прибавляется START_SEG
  д) результат заполняется по тому же адресу(RELO_SEG:I_OFF)
11. Распределяется память для программ в соответствии  с MaxMEM и MinMem
12. Инициализируются регистры, выполняются программа:
  а) ES=DS=PSP
  б) AX=результат проверки правильности идентификаторов драйверов, указанных в командной строке
  в) SS=START_SEG+ReloSS, SP=ExeSP
  г) CS=START_SEG+ReloCS, IP=ExeIp