Перехват векторов прерывания
Таблица векторов прерываний
Введение
Механизм подпрограмм (Динамический вызов)
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 Выполняющие необходимые "вирусописателю" действия;
Г) Антивирусы – замечают присутствие вирусов, часто – именно анализируя ТВП и находя характерные изменения.