Как правило, в системе существуют одновременно кроме программы пользователя различные системные программы и обработчики прерывания.
Разумеется, это необязательно - можно писать самодостаточные программы, совершенно ни в ком не нуждающиеся.
Однако как правило программа запускается ОС и часто вызывает сервисы ОС. В свою очередь ОС вызывает программы БИОС(дос-семейства) или собственные обработчики (WinNT, Unix) или и те и другие (Win98) прерываний для доступа к устройствам (дискам, звуковой карте и проч.).
Как организовать вызовы таких обработчиков ? Ставим задачу: пусть выполняется программа пользователя и существуют аппаратные прерывания от таймера. При возникновении прерывания процессор (он не может выполнять одновременно несколько программ) должен "временно отложить" выполнение программы пользователя, выполнить некую "программу обработки события прерывания от таймера" и вернуться к выполнению основной программы; при этом он должен:
- обеспечить "прозрачность" работы программы-обработчика относительно программы пользователя, т.е. не нарушить работу основной программы;
- уметь вернуть управление пользовательской программе без разрушения оной.
- Знать, где находится программа-обработчик прерывания.
Начнем с конца. В процессоре 8086 для конкретизации места обработчиков прерываний в памяти в памяти начиная с адреса 0 расположена ТАБЛИЦА АДРЕСОВ обработчиков прерываний. Каждый адрес дальний (far), он состоит из сегмента обработчика и его смещения в этом сегменте. В таблице 256 элементов. Размер каждого адреса 4 байта: seg:offset. Заполняет эту таблицу адресами обработчиков кто угодно: bios - своими адресами, дос-другим, вирус - своими ;)
Аппаратно прерывания имеют свои номера: те процессор в момент прерывания знает лишь:
1) Произошло прерывание;
2) Номер прерывания.
Далее по номеру прерывания он вычисляет адрес обработчика по ТАБЛИЦЕ АДРЕСОВ:
Номер прерывания x 4 = Адрес в памяти Адреса Обработчика;
Извлекая найденный адрес, Он передает на него управление и запоминает в стеке адрес той точки основной программы, которая выполнялась на момент прерывания, чтобы вернуться к ней впоследствии, а также регистр флагов:
Действия процессора по сохранению контекста прерванной программы:
push Flags
push segment
push offset
jmp dword ptr 0000:[Номер прерывания x 4]
Вызванный обработчик прерывания может сразу же вернуть управление прерванной программе одной командой:
iret
Которая пользуясь сохраненным контекстом прерванной программы на стеке (выше) вернет управление:
Действия процессора по возвращению управлению прерванной программе:
Flags <- Флаги со стека
Восстановить стек
jmp на сохраненный адрес в стеке.
Таким образом, в памяти находятся программы, выполняющиеся в момент того или иного прерывания.
А теперь ответ на вопрос. Их можно вызывать программно. Те не процессор переключает задачу на них, а сам программист специальной командой int:
int NN, NN - Номер прерывания, опкод 0xCD,0xNN (2 байта).
После выполнения этой команды ДЕЙСТВИЯ ПРОЦЕССОРА АБСОЛЮТНО ЭКВИВАЛЕНТЫ его реакции на аппартное прерывание.
Разумеется, вызвать код обработчика можно не только командой int, а и call far, jmp far, retf... и т.д. Просто так удобнее ;)
Таким образом появляется возможность вызывать сервисы ОС, БИОС и всякие другие через Таблицу Адресов прерываний. Это удобно прежде всего тем, что вызов можно осуществить лишь ЗНАЯ НОМЕР ПРЕРЫВАНИЯ (иногда говорят "номер вектора") в отличии от того случая, когда вызов осуществляется по заданному адресу. Так, например в ОСь Linux осуществляется всего лишь вызовом int 80h в отличии от других Unix, где, к примеру, системную программу можно вызвать через дальний call:
call 0000007 ; Вызов системы в одном из unix.
ДОС может быть вызван по нескольким прерываниям:
int 20h, int 21h, int 23h, int 24h, ... ,int 25h, int 26h...
БИОС:
int 10h, int 13h, int 15h, ...
А вот в winNT можно вызвать систему также, в отличии от win98:
int 2Eh ; Вызов WinNT и ее наследников из пользовательского кода.
Опубликовал Kest
June 19 2009 07:57:54 ·
0 Комментариев ·
11573 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.