Каскадная обработка прерывания



Рассмотренный подход дополнения прерываний можно легко распространить на случай, когда несколько одновременно находящихся в ОЗУ программ используют одно и то же прерывание. Этот случай иллюстрируется рис.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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!