Перехват векторов прерывания

Таблица векторов прерываний

Введение

Механизм подпрограмм (Динамический вызов)

1) Недостатком рассмотренного выше статического вызова является то, что в команде статического вызова подпрограммы присутствует адрес подпрограммы. Это - делает невозможным перемещение подпрограммы из одного места в памяти в другое, без перекомпиляции программы.

 

2) Статический вызов обычно применяют только к вызову внутренних программ. В данном случае – перекомпилировать совместно программу и вызываемую подпрограмму возможно.

 

3) Если речь идёт о вызове внешних подпрограмм – нужен другой способ вызова, а именно – такой механизм вызова подпрограмм, при котором в программе отсутствует явное указание адреса размещения подпрограммы.

 

4) И такой способ – есть! Динамический вызов с использованием команды INT #N

В данном случае N – не адрес, а условный номер подпрограммы. Говорят так "номер вектора прерывания через который вызывается подпрограмма" Почему говорят именно так "номер вектора прерывания"? Сейчас разберёмся.

 

5) Пока заметим: В ходе выполнения INT #N - все равно потребуется определять адрес размещения в памяти подпрограммы. Это определение будет происходить уже по ходу выполнения команды INT. Для определения адреса подпрограммы по ее номеру в ЭВМ ОС поддерживается специальная структура данных, специальный "справочник" - называемый "таблица векторов прерываний".

 

 

1) Таблица Векторов Прерываний (ТВП) для оперативной памяти ЭВМ - выполняет роль оглавления книги. Т.е. - для каждой программы и подпрограммы, вызываемой динамически – содержит адрес размещения в OЗУ соответствующей подпрограммы. В ходе выполнения INT #N по номеру подпрограммы – из ТВП будет выбираться адрес её размещения в OPE

 

2) Отдельные записи в ТВП принято называть векторами. Отсюда и терминология: "номер вектора прерывания".

 

Формат ТВП следующий:

 

 

3) Каждый вектор В0, В1.. содержат адрес вызываемой программы или динамически вызываемой подпрограммы.

 

4) n – число векторов ТВП

А0 – адрес ТВП (он никогда не изменяется), известен как аппаратуре так и программисту.

 

5) ТВП создается ОС во ходе загрузки и далее "поддерживается операционной системой" - для каждой очередной загружаемой в память программы или динамически вызываемой подпрограммы – в ТВП прописывается новый вектор.

 

 

3.14.3 Алгоритм INT #N

 

Команда INT от CALL отличается только в одном, в одной строчке алгоритма выполнения команды, в одной последней микрооперации. Теперь адрес не загружается в программный счётчик из атрибута команды, а по номеру вектора прерывания ( считываемого из атрибута):

А) Производится вычисление адреса нужного вектора прерывания в ТВП.

В) С этого вычисленного адреса считывается, и в программный счётчик загружается адрес подпрограммы. Посмотрим:

RC <– [PC]
Дешифрация
[SP] <– RF
SP <– SP + LR
PC <– PC + LK
[SP] <– PC
SP <– SP + LR
PC <– [A0 + LB*N]

 

 

 

Микрооперации 1-7: полностью соответствуют микрооперациям команды CALL #Adr. [3.11.3]

 

Теперь о единственном отличии: Микрооперация 8 – загрузка в программный счетчик адреса подпрограммы.

 

Рассмотрим микрооперацию подробнее:

 

N – номер вектора прерывания;

LB – длина вектора;

LB*N – смещение вектора с номером N от начала ТВП;

A0+ LB*N – адрес в ОЗУ вектора N;

[A0+ LB*N] – содержимое вектора N, а именно адрес подпрограммы в памяти.

Вот это "содержимое вектора" как мы видим, и загружается в программный счётчик.

 

1) Механизм динамического вызова подпрограмм предоставляет новые возможности, а именно замена одной подпрограммы на другую подпрограмму. Прием, при помощи которого это выполняется называется "перехват вектора прерывания".

 

2) Пусть необходимо заменить выполнение подпрограммы А на выполнение подпрограммы В. Тогда программист выполняет следующие:

- размещает подпрограмму В – либо на месте А, либо - в любом другом свободном месте памяти;

- в ТВП, в векторе где был прописан адрес подпрограммы А - прописывается адрес подпрограммы В.

 

 

3) Использование механизма:

А) Модификация работы программ.

В) Динамическое управление программой в ходе ее выполнения (динамическая перегрузка) – вместо одних подпрограмм – подгружаются другие.

В) Вирусы используют перехват векторов, чтобы заменить "неправильные" J подпрограммы, на свои – правильные. J Выполняющие необходимые "вирусописателю" действия;

Г) Антивирусы – замечают присутствие вирусов, часто – именно анализируя ТВП и находя характерные изменения.