|
|
|
|
Загрузчик процесса .EXE MS-DOS
Теперь нам известны все составные части, входящие в программные файлы типа .EXE, и можно начать рассмотрение загрузки и выполнения программ типа
.EXE.Так же,как и для процессов типа .COM, первый шаг состоит в установке контекста процесса, начиная с блока среды.
После установки среды либо из системных таблиц, либо из таблиц владельца, в рабочую область считывается заголовок программного файла .EXE.
Используя значения MinAlloc и MaxAlloc и размер образа программы (из размера страницы и размера заголовка), MS-DOS определяет требуемый размер
блока памяти и распределяет его. Если значение параметра MaxAlloc равно 0FFFFh, то при этом будет распределена вся память.
После распределения блока памяти, в начале блока процесса создается PSP (сегмент программого префикса). PSP для программ типа .EXE не
отличается от программ типа .COM. Затем MS-DOS читает образ программы в память непосредственно выше PSP, считывает таблицу настройки и продолжает
настраивать образ программы. Рис.3-11 показывает, как элементы в таблице настройки ссылаются к образу программы. Все числа на рисунке и арифметические
действия выполняются в шестнадцатиричной системе счисления.
Первым шагом при настройке является вычисление адреса начала сегмента. Он является адресом реальной памяти, который соответствует адресу начала
образа программы в файле. На Рис.3-11 блок памяти процесса размещен по адресу сегмента, равному 1000. PSP занимает 100 байтов или 10 сегментов. Адрес
начала программного сегмента в памяти равен тогда сегменту 1010:0000, и это есть адрес, по которому загрузчик поместит образ программы.
После загрузки образа программы загрузчик должен обновить или настроить каждую ссылку сегмента. Когда компоновщик LINK начинает строить образ
программы, он использует предполагаемый базовый сегмент 0000. На самом деле, программа загружается в сегмент 1010, так что к каждой ссылке сегмента
необходимо добавить 1010. Загрузчик находит все эти ссылки путем использования таблицы настройки, которая содержит указатель на каждую ссылку сегмента в
программе.
Рис.3-11 содержит две ссылки на значения сегментов. Проследим процесс настройки для далекого (far) вызова, размещенного по 0003:1234. Действительная
ссылка сегмента находится в четвертом и пятом байтах этой инструкции по адресу 0003:1237.
Программный файл
типа .EXE
--------------- Начальные CS:IP = 0000:0010
|Заголовок прог-| Начальный сегмент = +1010
|раммного файла | ----------
--------------- Действительные
значения = 1010:0010
--------------- |
Добавление| Таблица наст- | | ОБРАЗ ПРОГРАММЫ
адреса | ройки | | В ПАМЯТИ
начала | 0003:1237 --------.| --------------- 1000:0000
сегмента | 0005:ABCE -------.|| | Префикс прог- |
1010 --------------- ||| | раммного сег- |
||| | мента |
0000:0000 --------------- ||| |---------------| 1010:0000
|Образ программы| ||| |Образ программы|
| | ||| | |
0000:0010 | START | || ->| START | 1010:0010
0003:1234 | CALL 0005:ABCD| | -->| CALL 1015:ABCD| 1013:1234
0005:ABCD | MOV AX,0007 | --->| MOV AX,1017 | 1015:ABCD
0007:0000 | Data Segment | | Data Segment | 1017:0000
--------------- ---------------
Рис.3-11. Процесс настройки для загрузки программы типа .EXE
|
Однако, этот адрес является относительным для мнимого нулевого базового сегмента, а не для действительного образа программы в памяти. Для нахождения
действительной ссылки сегмента в памяти указатель таблицы настройки сам должен быть обновлен с помощью адреса начала сегмента. Действительная ссылка на
сегмент является адресом 1013:1237.
Слова, указываемые в памяти, увеличиваются затем на адрес начала сегмента. Вызов far (далекий) для сегмента 0005 теперь станет вызовом far для
сегмента 1015 - действительное размещение подпрограммы.
После завершения настройки, регистры ES и DS процесса уста навливаются на адрес сегмента PSP, а регистры CS:IP и SS:SP инициализируются значениями,
данными в заголовке программного файла типа .EXE. Оба регистра CS и SS увеличиваются на адрес начала сегмента образа программы. Например, на
Рис.3-11 адрес начала (START) 0000:0010 является смещением действительного адреса начала сегмента 1010, для формирования действительных значений CS:IP
1010:0010, используемых при запуске программы.
|
|