Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 33
Текст из файла (страница 33)
Значения регистров CS и IP сохраняются в стеке вслед за PSW.4. Вычисляется адрес вектора прерывания и из вектора, соответствующего номеру прерывания, загружаются новые значения IP и CS.Когда системная подпрограмма принимает управление, она может разрешить снова маскируемые прерывания командой STI (Set Interrupt Flag — установить флагпрерываний), которая переводит флаг IF в состояние 1, что разрешает микропроцессору вновь реагировать на прерывания, инициируемые внешними устройствами, поскольку стековая организация допускает вложение прерываний друг в друга.Закончив работу, подпрограмма обработки прерывания должна выполнить командуIRET (Interrupt Return), которая извлекает из стека три 16-разрядных значения изагружает их в указатель команд IP, регистр сегмента команд CS и регистр PSWсоответственно.
Таким образом, процессор сможет продолжить работу с того места, где он был прерван.В случае внешних прерываний процедура перехода на подпрограмму обработкипрерывания дополняется следующими шагами.1. Контроллер прерываний получает заявку от определенного периферийногоустройства и, соблюдая схему приоритетов, генерирует сигнал INTR (запрос напрерывание), который является входным для микропроцессора.2.
Микропроцессор проверяет флаг IF в регистре PSW. Если он установлен в 1, топереходим к шагу 3. В противном случае работа процессора не прерывается.Часто говорят, что прерывания замаскированы, хотя правильнее говорить, чтоони отключены. Маскируются (запрещаются) отдельные линии запроса на прерывания посредством программирования контроллера прерываний.3. Микропроцессор генерирует сигнал INTA (подтверждение прерывания). В ответ на этот сигнал контроллер прерываний посылает по шипе данных номерпрерывания.
После этого выполняется описанная ранее процедура передачиуправления соответствующей программе обработки прерывания.Номер прерывания и его приоритет устанавливаются на этапе инициализации системы. После запуска ОС пользователь, как мы уже отмечали, может изменитьтаблицу векторов прерываний, поскольку она ему доступна.Работа системы прерыванийв защищенном режимеВ защищенном режиме работы система прерываний микропроцессора i80x86 работает совершенно иначе.
Прежде всего, вместо таблицы векторов, о которой МЫПистема прерываний 32-разрядных микропроцессоров J80x86125говорили выше, она имеет дело с таблицей дескрипторов прерываний (InterruptDescriptor Table, IDT). Дело здесь не столько в названии таблицы, сколько в том,что таблица ЮТ представляет собой не таблицу с адресами обработчиков прерываний, а таблицу со специальными системными структурами данных (дескрипторами), доступ к которой со стороны пользовательских (прикладных) программ невозможен.
Только сам микропроцессор (его система прерываний) и код операционнойсистемы могут получить доступ к этой таблице, представляющей собой специальный сегмент, адрес и длина которого содержатся в регистре IDTR (см. рис. 4.2).Этот регистр аналогичен регистру GDTR в том отношении, что он инициализируется один раз при загрузке системы. Интересно заметить, что в реальном режимеработы регистр IDTR также указывает на адрес таблицы прерываний, но при этом,как и в процессоре i8086, каждый элемент таблицы прерываний (вектор) занимаетвсего 4 байт и содержит 32-разрядный адрес в формате селектор -.смещение (CS:IP).Начальное значение этого регистра равно нулю, но в него можно занести и другоезначение.
В этом случае таблица векторов прерываний будет находиться в другомместе оперативной памяти. Естественно, что перед тем, как занести в регистр IDTRновое значение, необходимо подготовить саму таблицу векторов. В защищенномрежиме работы загрузку регистра IDTR может произвести только код с максимальным уровнем привилегий.Каждый элемент в таблице дескрипторов прерываний, о которой мы говорим ужев защищенном режиме, представляет собой 8-байтовую структуру, более похожуюна дескриптор шлюза, нежели на дескриптор сегмента.Как мы уже знаем, в зависимости от причины прерывания процессор автоматически индексирует таблицу прерываний и выбирает соответствующий элемент,с помощью которого и осуществляется перенаправление в исполнении кода, то естьпередача управления на обработчик прерывания. Однако таблица IDT содержиттолько дескрипторы шлюзов, а не дескрипторы сегментов кода, поэтому фактически получается что-то типа косвенной адресации, но с рассмотренным ранеемеханизмом защиты с помощью уровней привилегий.
Благодаря этому пользователи уже не могут сами изменить обработку прерываний, которая предопределяется системным программным обеспечением.Дескриптор прерываний может относиться к одному из трех типов:Qкоммутатор прерывания (interrupt gate);Qкоммутатор перехвата (trap gate);Q коммутатор задачи (t,ask gate).Нри обнаружении запроса на прерывание и при условии, что прерывания разрешены,процессор действует в зависимости от типа дескриптора (коммутатора), соответствуюЩего номеру прерывания.
Первые два'типа дескрипторов прерываний вызываютПереход на соответствующие сегменты кода, принадлежащие виртуальному адресноМУ пространству текущего вычислительного процесса. Поэтому про них говорят, что°работка прерываний по этим дескрипторам осуществляется под контролем (в конексте) текущей задачи. Последний тип дескриптора (коммутатор задачи) вызывает°лное переключение процессора на новую задачу со сменой всего контекста в соответвии с сегментом состояния задачи (TSS). Рассмотрим оба варианта.126Глава 4. Особенности архитектуры м и к р о п р о ц е с с о р о в i80x86Обработка прерываний в контексте текущей задачиОбработку прерывания в контексте текущей задачи поясняет рис. 4.12.Прерывание (исключение)Регистр EIPРегистр дескрипторасегментаРегистр CS1Индекс iРегистр EFLAGSТаблицаIDT4Дескриптор 225RPLТаблица GDTДескриптор МTi=0— •СтекДескриптор iДескриптор jДескриптор 0Таблица LDTДескриптор 1Дескриптор М2.3Дескриптор О2.2•Ti - 1Дескриптор i2.1Дескриптор 0Р и с .
4 . 1 2 . Схема передачи управления при прерывании в контексте текущей задачиПри возникновении прерывания процессор по номеру прерывания индексируеттаблицу IDT, то есть адрес соответствующего коммутатора определяется путемсложения содержимого поля адреса в регистре IDTR и номера прерывания, умноженного на 8 (справа к номеру прерывания добавляется три нуля). Полученныйдескриптор анализируется, и если его тип соответствует коммутатору перехватаили коммутатору прерывания, то выполняются следующие действия.1.
В стек на уровне привилегий текущего сегмента кода помещаются:• значения SS и SP, если уровень привилегий в коммутаторе выше уровняпривилегий ранее исполнявшегося кода;Q регистр флагов EFLAGS;• регистры CS и IP.2. Если рассматриваемому прерыванию соответствовал коммутатор прерывания,то запрещаются прерывания (устанавливается флаг IF = 0 в регистре EFLAGS)В случае коммутатора перехвата флаг прерываний не сбрасывается, и обработка новых прерываний на период обработки текущего прерывания тем самым незапрещается.рлгугема прерываний 32-разрядных микропроцессоров J80x86127Я Поле селектора из дескриптора прерывания используется для индексированиятаблицы дескрипторов задачи.
Дескриптор сегмента заносится в теневой регистр, а смещение относительно начала нового сегмента кода определяется полем смещения из дескриптора прерывания.Таким образом, в случае обработки прерываний, когда дескриптором прерывания является коммутатор перехвата или коммутатор прерывания, мы остаемся в том же виртуальном адресном пространстве, и полной смены контекста текущей задачи не происходит. Просто мы переключаемся на исполнение другого (как правило, болеепривилегированного) кода, доступного исполняемой задаче. Этот код создается системными программистами, и прикладные программисты его просто используют.
В тоже время механизмы защиты микропроцессора позволяют обеспечить недоступностьэтого кода для его исправления (со стороны приложений, его вызывающих) и недоступность самой таблицы дескрипторов прерываний. Удобнее всего код обработчиков прерываний располагать в общем адресном пространстве, то есть селекторы, указывающие на такой код, должны располагаться в глобальной таблице дескрипторов.Обработка прерываний с переключением на новую задачуСовершенно иначе осуществляется обработка прерываний в случае, если дескриптором прерываний является коммутатор задачи.
Формат коммутатора задачи отличается от формата коммутаторов перехвата и прерывания прежде всего тем, чтов нем вместо селектора сегмента кода, на который передается управление, указывается селектор сегмента состояния задачи (рис. 4.13). В результате осуществляется процедура перехода на новую задачу с полной сменой контекста, ибо сегментсостояния задачи полностью определяет новое виртуальное пространство и адресначала программы, а текущее состояние прерываемой задачи аппаратно (по микропрограмме микропроцессора) сохраняется в ее собственном сегменте TSS.При этом происходит полное переключение на новую задачу с вложением, то естьвыполняются следующие действия.1.
Сохраняются все рабочие регистры процессора в текущем сегменте TSS, базовыйадрес этого сегмента берется в регистре TR (см. раздел «Адресация в 32-разрядных микропроцессорах i80x86 при работе в защищенном режиме»).2. Текущая задача отмечается как занятая.3. По селектору из коммутатора задачи выбирается новый сегмент TSS (поле селектора помещается в регистр TR) и загружается состояние новой задачи. Напомним, что загружаются значения регистров LDTR, EFLAGS, восьми регистров общего назначения, регистра EIP и шести сегментных регистров.4- Устанавливается бит NT (Next Task),.* В поле обратной связи TSS помещается селектор прерванной задачи."• С помощью значений CS:IP, взятых из нового сегмента TSS, обнаруживается11выполняется первая команда обработчика прерывания.аким образом, коммутатор задачи дает указание процессору произвести переклюние задачи, и обработка прерывания осуществляется под контролем отдельной1ешней задачи.