КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Перехват векторов прерывания
Таблица векторов прерываний Введение Механизм подпрограмм (Динамический вызов) 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 отличается только в одном, в одной строчке алгоритма выполнения команды, в одной последней микрооперации. Теперь адрес не загружается в программный счётчик из атрибута команды, а по номеру вектора прерывания (считываемого из атрибута): А) Производится вычисление адреса нужного вектора прерывания в ТВП. В) С этого вычисленного адреса считывается, и в программный счётчик загружается адрес подпрограммы. Посмотрим:
Микрооперации 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 Выполняющие необходимые "вирусописателю" действия; Г) Антивирусы – замечают присутствие вирусов, часто – именно анализируя ТВП и находя характерные изменения.
Дата добавления: 2014-01-04; Просмотров: 731; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |