Каскадная обработка прерывания
Рассмотренный подход дополнения прерываний можно легко распространить на случай, когда несколько одновременно находящихся в ОЗУ программ используют одно и то же прерывание. Этот случай иллюстрируется рис.1
Рис.1. Совместная обработка прерывания несколькими программами
Пусть в исходном состоянии по адресу вектора NN был записан адрес системного обработчика sys_IH. Затем в память загружается пользовательская программа, которая перехватывает этот вектор и записывает на его место адрес собственного обработчика us1_IH. Вторая загружаемая в память программа перехватит прерывание у первой и запишет на место вектора адрес своего модуля us2_IH, и так далее. Если все пользовательские обработчики соблюдают правила дополнения, то при поступлении прерывания NN управление получит модуль us3_IH, который первым делом вызовет модуль us2_IH, тот вызовет us1_IH, а тот - sys_IH. Системный обработчик, выполнив свои функции, вернет управление в us1_IH, этот модуль отработав вернет управление в us2_IH, и так далее. Таким образом, возможность выполнить какие-то свои действия по прерыванию NN будет предоставлена всем программам. Здесь, однако, возникает трудноразрешимая проблема в связи с восстановлением векторов. Действительно, если в нашем примере первой завершится программа, чей модуль обработки прерывания us2_IH, то она восстановит тот вектор, который она перехватила, то есть us1_IH, исключив таким образом из цепочки us3_IH.
|
|
Основы построения и использования вычислительных процессов в MS DOS
Загрузка и запуск программ MS DOS
Загрузка com- и exe-программ происходит по-разному, однако есть некоторые действия, которые операционная система выполняет в обоих случаях одинаково:
· определяется сегментный адрес свободного участка памяти для загрузки программы;
· создаются два блока памяти - блок памяти для переменных среды, а также блок памяти для PSP и программы;
· в блок памяти переменных среды помещается путь к файлу программы;
· заполняются поля префикса сегмента программы PSP в соответствии с характеристиками программы;
· адрес области Disk Transfer Area (DTA ) устанавливается на вторую половину PSP (PSP:0080);
· анализируются параметры запуска программы на предмет наличия в первых двух параметрах идентификаторов дисковых устройств.
Загрузка COM – программы:
- сегментные регистры CS, DS, ES, SS устанавливаются на начало PSP;
- регистр SP устанавливается на конец сегмента PSP;
- вся область памяти после PSP распределяется программе;
- в стек записывается слово 0000;
- указатель команд IP устанавливается на 100h (начало программы) с помощью команды JMP по адресу PSP:100h;
Загрузка EXE – программы:
|
|
ü Считывается во внутренний буфер DOS форматированная часть заголовка файла.
ü Определяется размер загрузочного модуля
ü Определяется смещение начала загрузочного модуля в EXE-файле
ü Вычисляется сегментный адрес для загрузки START_SEG, обычно используется значение PSP+10h
ü Загрузочный модуль считывается в память по адресу START_SEG:0000
ü Сканируются элементы таблицы перемещений, располагающейся в EXE-файле со смещением relt_off
Для каждого элемента таблицы:
Ø Считывается содержимое элемента таблицы как два двухбайтных слова (OFF,SEG).
Ø Вычисляется сегментный адрес ссылки перемещения
Ø Выбирается слово по адресу REL_SEG:OFF, к этому слову прибавляется значение START_SEG, затем сумма записывается обратно по тому же адресу.
ü Заказывается память для программы, исходя из значений min_mem и max_mem.
ü Инициализируются регистры, и программа запускается на выполнение.
2. Заголовок *. exe
Заголовок EXE-файла состоит из форматированной зоны (табл. 1) и таблицы расположения сегментов (Relocation Table).
Таблица расположения сегментов программы начинается сразу после форматированной области и состоит из четырехбайтовых значений в формате "смещение:сегмент". Область файла после таблицы расположения сегментов выравнивается на границу параграфа с помощью байта-заполнителя, и дальше начинается сама программа.
|
|
Программа второго типа (exe-программа) может иметь любой размер. В самом начале файла программы содержится заголовок (у файла com-программы заголовка нет). Этот заголовок используется операционной системой в процессе загрузки программы в память для правильной установки сегментных регистров. Заголовок exe-файла нужен только при загрузке; когда программа загружена и готова к работе, самого заголовка уже нет в памяти.
Заголовок exe-файла состоит из форматированной зоны и таблицы расположения сегментов (Relocation Table).
Смещение, байт | Размер, байт | Имя поля | Описание |
0 | 2 | signature | Два байта 'MZ' (4Dh, 5Ah), идентифицирующие exe-файл |
2 | 2 | part_pag | Размер последней страницы программы в байтах (страница содержит 512 байт) |
4 | 2 | file_size | Размер программы в страницах по 512 байт |
6 | 2 | rel_item | Количество элементов в таблице расположения сегментов |
8 | 2 | hdr_size | Размер заголовка файла в параграфах (длина параграфа - 16 байт) |
10 | 2 | min_mem | Минимальное количество памяти в параграфах, которое нужно зарезервировать после области загруженной программы |
12 | 2 | max_mem | Максимальное количество памяти в параграфах, которое нужно зарезервировать после области загруженной программы |
14 | 2 | ss_reg | Начальное значение для загрузки сегментного регистра SS |
16 | 2 | sp_reg | Начальное значение для загрузки регистра SP |
18 | 2 | chk_summ | Контрольная сумма всех слов в файле |
20 | 2 | ip_reg | Значение, которое будет загружено в регистр IP при запуске программы |
22 | 2 | cs_reg | Смещение от начала программы для установки сегментного регистра кода CS |
24 | 2 | relt_off | Смещение таблицы расположения сегментов программы от начала exe-файла |
26 | 2 | overlay | Номер оверлея, равен 0 для основного модуля программы |
Табл. 3. Формат заголовка EXE программы
|
|
Таблица расположения сегментов программы начинается сразу после форматированной области и состоит из четырехбайтовых значений в формате <смещение:сегмент>.
PSP текущей задачи
Для программы, вызванной на выполнение, DOS выделяет блок памяти, называемый программным сегментом. Программный сегмент всегда начинается на границе параграфа. В начале программного сегмента DOS строит PSP (Program Segment Prefix - Префикс Программного Сегмента), который занимает 256 байт. (Для построения PSP в DOS имеются функции 0x26, 0x55, но это чисто внутренние функции DOS, мы оставим их без внимания).
Программы могут получить из PSP такую информацию, как параметры командной строки при запуске, размер доступной памяти, найти сегмент области переменных среды и т.д.
Структура PSP
Адрес сегмента psp иногда называют идентификатором процесса или PID. Каждая программа, работающая под управлением MS-DOS, называется процессом. Каждому процессу соответствует уникальный PID, по которому процессы различаются опеpационной системой. Адрес сегмента psp всегда совпадает с PID.
PSP - это управляющая область в 256 байт, которая строится в памяти в начале каждой программы. Она содержит различные поля, используемые ДОС для управления выполнением программы. В операциях DOS по управлению программами, данными и памятью программа представляется прежде всего адресом своего PSP. Этот адрес в системе часто именуется. Функции 0x51, 0x62 позволяют программе получить сегментный адрес активного PSP.
00h | 2 БАЙТА | ПРЕРЫВАНИЕ ПРОГРАММЫ. Первые два байта psp всегда содержат значения CD и 20. Эти два шестнадцатеричных числа являются кодом прерывания "нормальное завершение программы" (INT 20H). |
02h | СЛОВО | ГРАНИЦА ПАМЯТИ. В поле находятся начальные адреса сегментов (записанные в "обратном порядке") свободных участков памяти (не занятые выполняемыми программами пользователя). |
04h | БАЙТ | Резерв |
05h | 5 БАЙТ | ДИСПЕТЧЕР ФУНКЦИЙ. |
0Ah | ДВ. СЛОВО | АДРЕС ПРЕРЫВАНИЯ. В поле (в "обратном" порядке) находится адрес, на который передается управление при завершении работы программы. |
0Eh | ДВ. СЛОВО | ЗАПИСЬ Ctrl-Break. Поле содержит адрес (записанный в "обратном" порядке), по которому передается управление при нажатии клавиш Ctrl-Break. |
12h | ДВ. СЛОВО | ЗАПИСЬ КРИТИЧЕСКОЙ ОШИБКИ. Поле содержит адрес (в "обратном" порядке), по которому передается управление в случае критической ошибки. |
16h | СЛОВО | PSP ВЫЗЫВАЮЩЕЙ ПРОГРАММЫ. В поле хранится адрес сегмента psp вызывающей программы (в "обратном" порядке). |
18h | 20 БАЙТ | ТАБЛИЦА ССЫЛОК НА УПРАВЛЯЮЩУЮ ЗАПИСЬ ФАЙЛА. Поле используется для хранения ссылок на управляющие записи файлов, занятых в данном процессе. |
2Ch | СЛОВО | АДРЕС СРЕДЫ. Поле содержит адрес сегмента (в "обратном" порядке) операционной среды данной программы. |
2Eh | ДВ. СЛОВО | Резервируются для системного пользования. |
32h | СЛОВО | РАЗМЕР ТАБЛИЦЫ ССЫЛОК НА УПРАВЛЯЮЩУЮ ЗАПИСЬ ФАЙЛА. В поле содержится размер памяти, занимаемый таблицей ссылок на управляющую запись файла. |
34h | ДВ. СЛОВО | АДРЕС ТАБЛИЦЫ ССЫЛОК. В первых двух байтах поля содержится короткий адрес таблицы (в "обратном" порядке). Вторые два байта - адрес сегмента, в котором расположена таблица. |
38h | 24 БАЙТА | Резервируется для системного пользования |
50h | 3 БАЙТА | ВОЗВРАТНЫЙ КОД ФУНКЦИИ-ДИСПЕТЧЕРА. |
53h | 2 БАЙТА | Резервируется для системного пользования. |
55h | 7 БАЙТ | Расширение первого FCB |
5Ch | 16 БАЙТ | БЛОК УПРАВЛЕНИЯ ФАЙЛОМ. Данный блок используется, если первым параметром в командной строке после имени программы является имя файла. |
6Ch | 16 БАЙТ | БЛОК УПРАВЛЕНИЯ ФАЙЛОМ. |
7Сh | ДВ. СЛОВО | Резервируется для системного пользования. |
80h | 128 БАЙТ | ХВОСТ КОМАНДНОЙ СТРОКИ, DTA. |
Дата добавления: 2019-02-13; просмотров: 263; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!