Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Обработка прерываний микропроцессорами семейства x86 в защищенном режиме.
7.1. Цель работы: ознакомление с системой обработки прерываний микропроцессора в защищенном режиме.
7.2. Теоретические сведения. Ключевыми элементами обработки прерываний в защищенном режиме являются таблица IDT и связанный с ней системный регистр idtr. При возникновении прерывания от источника с номером N микропроцессор, находясь в защищенном режиме, выполняет следующие действия (в самом общем виде): 1) Определяет местонахождение таблицы IDT, адрес и размер которой содержатся в регистре idtr/ 2) Складывает значение адреса, по которому размещена таблица IDT, и значение N× 8. По данному смещению в таблице IDT должен находиться 8-байтовый дескриптор, определяющий местоположение процедуры обработки прерывания. 3) Переключается на процедуру обработки прерывания. Прерывания и исключения в защищенном режиме можно разделить на три группы: - сбои - ловушки - аварийные завершения Сбой (ошибка) – прерывание или исключение, при возникновении которого в стек записываются содержимое регистров cs: ip, указывающее на команду, вызвавшую данное прерывание. Это позволяет получив доступ к сегменту кода, исправить ошибочную команду в обработчике прерывания и, вернув управление программе, выполнить команду, вызвавшую ошибку. Ловушка – прерывание или исключение, при возникновении которого в стек записываются содержимое регистров cs: ip, указывающее на команду, следующую за командой, вызвавшей данное прерывание. Так же как и в случае ошибок возможен рестарт команды. Для этого необходимо лишь исправить в обработчике прерывания соответствующие код или данные, послужившие источником ошибки. После этого перед возвратом управления нужно скорректировать значение ip в стеке на длину команды, вызвавшей данное прерывание. Механизм ловушек похож на механизм прерываний, но не во всем. Если прерывание типа ловушки возникло в команде передачи управления jmp, то содержимое пары cs: ip в стеке будет отражать результат этого перехода, т.е. соответствовать команде назначения. Аварийное завершение – прерывание, при котором информация о месте его возникновения недоступна или не полна, и поэтому рестарт практически не возможен, если только данная ситуация не была запланирована заранее. Микропроцессор жестко определяет, какие прерывания являются ошибками, какие ловушками и авариями и соответствующие алгоритмы-обработчики будут отличаться алгоритмами работы. Некоторые прерывания при своем возникновении дополнительно генерируют и записывают в стек так называемый код ошибки. Этот код в дальнейшем может быть использован для установления источника прерывания. Код ошибки, если он генерируется записывается в стек вслед за содержимым регистров eflags, cs и eip. Формат таблицы IDT подобен формату таблиц GDT и LDT, т.е. представляет собой совокупность 8-байтовых дескрипторов. Отличия таблицы IDT от указанных таблиц состоит в следующем: - нулевой дескриптор в отличии от таблицы GDT используется; он описывает шлюз для программы обработки исключительной ситуации 0 (ошибка деления); - дескрипторы в таблицы IDT строго упорядочены в соответствии с номерами прерываний; - размерность таблицы IDT – не более 256 элементов размером по восемь байт, по числу возможных прерываний. В отдельных случаях есть смысл описывать все 256 дескрипторов этой таблицы, формируя для неиспользуемых номеров прерываний шлюзы-заглушки. Это позволяет корректно обрабатывать все прерывания, даже если они не планируются к использованию в данной задаче. Если этого не сделать, то при незапланированном прерывании с номером, превышающим пределы IDT для данной задачи, будет возникать исключительная ситуация нарушения общей защиты - #GP (с номером 13); - при работе с прерываниями микропроцессор всегда определяет местоположение таблицы IDT по полю базового адреса в регистре idtr. Это он делает независимо от режима в котором работает. В реальном режиме содержимое поля базового адреса в регистре idtr равно нулю, поэтому работа с таблицами векторов прерываний выполняется без проблем. Из всего этого следует, что возможно произвольное размещение в памяти этой таблицы не только в защищенном, но и в реальном режиме. Дескрипторы в таблице IDT обычно называются шлюзами. Шлюзы предназначены для указания точки входа в программу обработки прерывания. В дескрипторной таблице IDT могут содержаться шлюзы трех типов – ловушки, прерывания и задачи. Шлюз ловушки – элемент таблицы IDT, имеющий формат, показанный на рис. 7.1.
|