![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Рассмотрим рис. 3.13, поясняющий обработку прерывания в контексте текущей задачи. При возникновении прерывания процессор по номеру прерывания индексирует таблицу IDT, то есть адрес соответствующего коммутатора определяется путем сложения содержимого поля адреса в регистре IDTR и номера прерывания, умноженного на 8 (справа к номеру прерывания добавляются три нуля). Полученный дескриптор анализируется, и если его тип соответствует коммутатору trap gate или коммутатору interrupt gate, то выполняются следующие действия.
1. В стек на уровне привилегий текущего сегмента кода помещаются:
О значения SS и SP, если уровень привилегий в коммутаторе выше уровня
привилегий ранее исполнявшегося кода; О регистр флагов EFLAGS; О регистры CS и IP.
2. Если рассматриваемому прерыванию соответствовал коммутатор interrupt
gate, то запрещаются прерывания (флаг IF:=0 в регистре EFLAGS). В случае
коммутатора trap gate флаг прерываний не сбрасывается и обработка новых
прерываний на период обработки текущего прерывания тем самым не запре
щается.
3. Поле селектора из дескриптора прерываний используется для индексирова
ния таблицы дескрипторов задачи. Дескриптор сегмента заносится в теневой
регистр, а смещение относительно начала нового сегмента кода определяется
полем смещения из дескриптора прерывания.
Таким образом, в случае обработки прерываний, когда дескриптором прерываний является коммутатор interrupt gate или trap gate, мы остаемся в том же виртуальном адресном пространстве, и полной смены контекста текущей задачи не происходит. Просто мы переключаемся на исполнение другого (как правило, более привилегированного) кода, но также принадлежащего (или, правильнее ска-
![]() |
зать, доступного) исполняемой задаче. Этот код создается системными программистами, и прикладные программисты его просто используют. В то же время механизмы защиты микропроцессора позволяют обеспечить недоступность этого кода для его исправления (со стороны приложений, его вызывающих) и недоступность самой таблицы дескрипторов прерываний. Удобнее всего код обработчиков прерываний располагать в общем адресном пространстве, то есть селекторы, указывающие на такой код, должны располагаться в глобальной таблице дескрипторов.
Дата публикования: 2015-01-23; Прочитано: 373 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!