Укажите какой флаг заставляет процессор не реагировать на поступающие к нему прерывания
Существует несколько видов экстраординарных ситуаций, в которых поведение процессора регламентируется особыми правилами. Такие ситуации возникают, когда требуется срочная реакция на внешние воздействия, когда при выполнении программы происходит какая-либо ошибка или существует вероятность получения неточного результата вычислений.
В общем случае все эти ситуации разделяются по принципу их обнаружения, источника возникновения и реакции на них на следующие три категории:
Прерывания и особые ситуации
Прерывания и особые ситуации (Interrupts and Exceptions) — это специальные средства, обеспечивающие быструю реакцию процессора на внешние воздействия и прочие неожиданные ситуации. При поступлении прерывания или генерации особой ситуации выполнение программы прерывается, а управление передается специальной процедуре — обработчику прерывания или особой ситуации. В большинстве случаев, когда обработка прерывания или особой ситуации заканчивается, управление может быть возвращено в прерванную программу, которая продолжит свое выполнение с той самой точки, в которой она была остановлена. Процессор производит автоматическое сохранение/восстановление контекста и состояния для обеспечения этой возможности.
Все прерывания и особые ситуации имеют уникальные идентификационные номера. Эти номера называются векторами прерываний и лежат в пределах от 0 до 255. Векторы от 0 до 31 отведены для особых ситуаций и немаскируемого прерывания, причем некоторые из них зарезервированы и не должны использоваться программами. Векторы от 32 до 255 свободны для любого использования пользовательскими программами и внешними устройствами.
Существует два источника поступления прерываний и три типа особых ситуаций. Кроме того, различают внутренние (программные) и внешние (аппаратные) источники генерации прерываний и особых ситуаций.
Внешние или аппаратные прерывания (External or Hardware interrupts):
Программные прерывания и особые ситуации (Software interrupts and Exceptions):
Регистр флагов содержит различные биты, отражающие текущее состояние процессора и частично управляющие его работой.
Флаг направления
Этот флаг может изменяться любыми программами с помощью специальных инструкций CLD и STD, а также загрузкой нового содержимого регистра флагов.
Регистр флагов EFLAGS отражает текущее состояние процессора, многие из его битов устанавливаются после выполнения операций и индицируют тип, полученного результата. Формат регистра флагов приведен на рис. 1.3.
Рис. 1.3. Формат регистра флагов
CF (Флаг переноса, бит 0)
Флаг переноса фиксирует значение переноса (заема), возникающего при сложении (вычитании). Иногда используется и в других ситуациях.
PF (Флаг четности, бит 2)
Флаг четности фиксирует наличие четного числа единиц в младшем байте результата операции, может быть использован, например, для контроля правильности передачи данных.
AF (Флаг вспомогательного переноса, бит 4)
Флаг вспомогательного переноса фиксирует перенос (заем) из младшей тетрады, т.е. из бита 3 в старшую тетраду при сложении (вычитании). Используется только для двоично-десятичной арифметики, которая оперирует исключительно младшими байтами.
ZF (Флаг нуля, бит 6)
Флаг нуля сигнализирует о получении нулевого (ZF = 1) или ненулевого (ZF = 0) результата операции.
SF (Флаг знака, бит 7)
Флаг знака дублирует значение старшего бита результата, который при использовании дополнительного кода соответствует знаку числа (0 – положительное число, 1 – отрицательное).
TF (Флаг трассировки, бит 8)
IF (Флаг разрешения прерываний, бит 9)
Изменение этого флага командами CLI, STI, POPF/POPFD и IRET/IRETD возможно не всегда и определяется текущими:
-
; выполняемого кода (CPL); (поле IOPL);
- значением флага CR4.PVI (отвечает за активацию специального режима с поддержкой виртуальных флагов прерываний в защищенном режиме).
- значением флага CR4.VME (отвечает за активацию специального режима виртуальных прерываний в режиме V86);
DF (Флаг направления, бит 10)
Флаг направления определяет порядок обработки цепочек в соответствующих командах (строковые команды: STOS, LODS, CMPS, OUTS и т.д.) — от меньших адресов к большим (DF = 0) или от больших к меньшим (DF = 1).
OF (Флаг переполнения, бит 11)
Флаг переполнения сигнализирует о потере старшего бита результата в связи с переполнением разрядной сетки при работе со знаковыми числами. При сложении этот флаг устанавливается в 1, если происходит перенос в старший бит и нет переноса из старшего бита, или имеется перенос из старшего бита, но отсутствует перенос в него; в противном случае, флаг OF устанавливается в 0. При вычитании он устанавливается в 1, когда возникает заем из старшего бита, но заем в старший бит отсутствует, либо имеется заем в старший бит, но отсутствует заем из него.
IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 …)
Поле уровня привилегий ввода/вывода (Input/output Privilege Level – IOPL) используется механизмом защиты для управления доступом к адресному пространству ввода/вывода и программным прерываниям. Ряд команд, называемых IOPL-чувствительными командами (IOPL-sensitive instructions), могут выполняться по-разному в зависимости от текущего режима работы процессора и значения поля IOPL.
Изменение уровня привилегий ввода/вывода IOPL возможно командами POPF/POPFD и IRET/IRETD в защищенном режиме и только при выполнении команды на уровне привилегий, по крайней мере таком же (а для команды POPF/POPFD только на нулевом), как и текущий уровень привилегий ввода/вывода (режим реальной адресации эквивалентен нулевому уровню привилегий).
В ранних моделях процессоров до Intel286 (8086/8088, Intel186) биты 12 и 13 регистра флагов FLAGS, соответствующие полю IOPL, считались зарезервированными, а их значения всегда были равны единице. В процессоре Intel286 в режиме реальной адресации невозможно изменять значения этих битов — они всегда остаются нулевыми (они сбрасываются в момент инициализации процессора), а вот более поздние модели процессоров, начиная с Intel386, такого ограничения уже не имеют, то есть поле IOPL можно изменять и в режиме реальной адресации. Указанная особенность использовалась в процедурах идентификации процессоров вплоть до появления команды CPUID в процессоре Pentium.
NT (Вложенная задача, бит 14: Intel286 …)
Процессор устанавливает и проверяет флаг вложенной задачи для контроля за прерванными задачами (задачи, во время исполнения которых имело место прерывание) и при вызове процедур. Флаг NT влияет на действия, производимые командой IRET/IRETD. Этот флаг может быть изменен командой POPF/POPFD и IRET/IRETD. Некорректные изменения этого флага могут привести к возникновению различных особых ситуаций в прикладных программах.
RF (Флаг возобновления, бит 16: Intel386 …)
VM (Виртуальный режим, бит 17: Intel386 …)
Установка флага виртуального режима VM переключает процессор в режим виртуального-8086 (специальный случай защищенного режима).
AC (Режим контроля выравнивания, бит 18: Intel486 …)
Подскажите пожалуйста, в даташитах не нашел точного ответа
Вот если например прерывание INT0 разрешено в регистре масок, и происходит определенное событие флаг прерывания устанавливается с переходом к обработчику. Тут все понятно.
Если например я временно запрещаю прерывание INT0 в регистре масок, будет ли устанавливаться флаг прерывания в регистре флагов в данном случае при возникновении события?
И если я опять разрешу прерывание INT0 то не улечу ли я в прерывание? (что не должно быть).
Нужно ли мне проверять флаг перед включением прерывания INT0 и если он установлен сбрасыать? Не лишнее ли это?
касательно INT0/1.
Если прерывание по фронту/спаду флаг будет установлен по факту события независимо было ли разрешено или запрещено данное прерывание.
Следовательно необходим предварительный анализ наличия флага и его сброс при необходимости перед разрешением прерывания.
Прерывание по уровню флаг НЕ УСТАНАВЛИВАЕТ - выполняется вызов по факту события ( если уровень останется на момент выхода из прерывания, то оное будет перезапущено заново после исполнения одной команды, следующей за reti ).
Благодарю, вот этот момент был непонятен. Буду флаг проверять. Настроен INT0 как раз по спаду, не уточнил в вопросе
Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет
Если например я временно запрещаю прерывание INT0 в регистре масок, будет ли устанавливаться флаг прерывания в регистре флагов в данном случае при возникновении события?
И если я опять разрешу прерывание INT0 то не улечу ли я в прерывание? (что не должно быть).
Нужно ли мне проверять флаг перед включением прерывания INT0 и если он установлен сбрасыать? Не лишнее ли это?
Если INTx в EIMSK не установлен, то все события по по этому внешнему прерыванию игнорируются, флаг INTFx в EIFR не устанавливается и "отложенного" прерывания не возникает.
Встраиваемые ИП LM(F) производства MORNSUN заслуженно ценятся производителями во всем мире, поскольку среди широчайшего ассортимента продукции компании можно найти источник питания для любых задач. Представители семейств LM и LMF различаются по мощности и выходному напряжению, их технические и эксплуатационные характеристики подходят для эксплуатации в любых электрических сетях и работают в широком диапазоне условий окружающей среды. Неизменными остаются высокое качество и демократичная цена.
На каждый мк нужно в даташите смотреть, какой регистр отвечает за разрешение внешнего прерывания. К примеру у ATMEGA8535 это GICR. По сбросу флага. Если вы не включали ранее, если вы правильно провели инициализации, если ранее включали, но правильно выключили, то можно не проверять. Если есть сомнения, проверяйте, это много ресурсов не отнимает. Теперь, чтобы не было ложных срабатывания, нужно правильно провести инициализации. Иначе будут сюрпризы. Поясняю. Берём ATMEGA8535, устанавливаем в регистре GICR INT0. Но, так как по умолчанию стоит настройка по низкому уровню, и если на входе низкий уровень, то флаг будет выставлен и произойдёт переход на вектор прерывания.
Поэтому порядок такой. Сначала режим внешнего прерывания. И только потом разрешать прерывания.
Кстати, у внешнего прерывания нет такого режима, чтобы флаг выставлялся, без включения соответствующего прерывания. Но это и логично. Порт без прерывания и так можно проверить.
Широкая линейка LED-драйверов включает в себя семейства HLG и HLG-C. Семейство HLG оптимально для наружной архитектурно-декоративной подсветки, светильников на основе мощных COB-матриц, семейство HLG-C для светильников широкого назначения, выполненных по классической схеме на светодиодных цепочках. Драйверы имеют возможность ручной подстройки выходных параметров либо возможность диммирования методом 3-в-1.
Работа механизма реакции на прерывания и особые ситуации в защищенном режиме базируется на специальной таблице дескрипторов прерываний (Protected-Mode Interrupt Descriptor Table – IDT). Базовый адрес (BASE) этой таблицы и ее предел (LIMIT) заносятся в регистр IDTR с помощью команды LIDT (см. рис. 3.3).
Таблица IDT содержит до 256 специальных дескрипторов, каждый из которых соответствует своему прерыванию. Эти дескрипторы занимают по 8 байт каждый и располагаются в таблице последовательно без каких-либо промежутков. Самый первый дескриптор, расположенный по самому младшему адресу в начале таблицы соответствует прерыванию 0, а самый последний дескриптор, расположенный по самому старшему адресу в таблице, соответствует прерыванию 255.
Рис. 3.3. Таблица дескрипторов прерываний (IDT) в защищенном режиме работы
В качестве дескрипторов таблицы IDT могут использоваться дескрипторы разного типа – шлюза прерывания, шлюза ловушки и шлюза задачи. Поведение процессора при поступлении запроса на прерывание зависит, как от типа применяемого для данного прерывания дескрипторов, так и от текущего уровня привилегий задачи.
В случае, если в качестве дескриптора прерывания используется шлюз задачи, процессор при поступлении запроса на прерывание выполняет все действия по переключению на новую задачу, сохраняя текущее состояние в TSS старой задачи и загружая новые значения в регистры из TSS задачи обработчика прерывания. Применение такого шлюза оправдано для обработки ошибок и сбоев, которые не могут быть обработаны в рамках текущей задачи (например, ошибки, возникающие при переключении задач).
Если в качестве дескриптора прерывания используется шлюз ловушки или шлюз прерывания, то переключения задач не происходит и программа обработчик функционирует в рамках той же задачи, что и прерванный код. Отличие шлюза прерывания состот лишь в том, что процессор автоматически сбрасывает флаг EFLAGS.IF при передаче управления в обработчик, чем обеспечивается маскирование внешних прерываний. В последующем, при возврате из процедуры обработчика прежнее значение регистра EFLAGS восстанавливается из стека.
Содержание
Назначение разрядов
Формат регистра EFLAGS выглядит следующим образом:
Заметим, что все неиспользуемые биты равны нулю. Исключением является бит 1, который всегда имеет единичное значение.
Далее описывается назначение каждого бита, входящего в состав регистра флагов.
Особенности работы процессора при передаче управления обработчику прерываний защищенного режима
Механизм защиты для прерываний в защищенном режиме функционирует практически таким же образом, как это происходит при выполнении команды вызова подпрограммы CALL. Некоторые особенности его работы заключаются в следующем:
- процессор не проверяет текущий уровень привилегийCPL для внешних прерываний;
- поскольку для прерываний не существует отдельного селектора, то все правила для запрашиваемого уровня привилегий селектора (RPL) игнорируются;
- процессор проверяет уровень привилегийDPLшлюза только для программных прерываний, генерируемых командами INT n, INT 3, INTO, с тем, чтобы предотвратить генерацию таких прерываний, если CPL >DPL.
Если обработчик прерывания защищенного режима (Protected-mode Exception and Interrupt Handler) будет расположен в согласованном кодовом сегменте, то ему при получении управления будет доступен только сегмент стека и те сегменты, привилегии которых позволяют это. Если же обработчик будет размещен в несогласованном кодовом сегменте с нулевым уровнем привилегий, то независимо от CPL прерванной программы ему будут доступны все сегменты.
При поступлении запроса на прерывание процессор сохраняет текущие значения EFLAGS, CS и EIP в стеке. Если для обрабатываемого прерывания предусмотрена генерация кода ошибки, то этот код сохраняется в стеке сразу после значения EIP.
Когда передача управления в обработчик связана с изменением уровня привилегий на более высокий (меньшее числовое значение), это сопровождается переключением стека. Новые значения для SS и ESP берутся из TSS задачи в соответствии с уровнем привилегий обработчика. Переключение стека производится до сохранения указанных выше регистров, причем в новом стеке в первую очередь сохраняются значения SS и ESP, указывающие на старый стек (см. рис. 3.4.).
При передаче управления в обработчик через шлюз прерывания или шлюз ловушки процессор сбрасывает флаги EFLAGS.TF, EFLAGS.RF и EFLAGS.NT, чтобы отключить трассировку прерываний и некоторые особенности обработки вложенных задач. Кроме того, при использовании шлюза прерывания сбрасывается также и флаг разрешения прерываний EFLAGS.IF.
Рис. 3.4. Стек после вызова прерывания или особой ситуации в защищенном режиме
Стек процессора Intel286 после вызова прерывания или особой ситуации заполняется аналогично, за исключением того, что сохраняемые значения 16-битные.
Процессоры Intel386 и Intel486 сохраняют код ошибки в стеке как 16-битное значение, а процессоры, начиная с Pentium – сохраняют его как 32-битное значение с нулевыми старшими битами.
Прерывания и особые ситуации
Прерывания и особые ситуации (Interrupts and Exceptions) — это специальные средства, обеспечивающие быструю реакцию процессора на внешние воздействия и прочие неожиданные ситуации. При поступлении прерывания или генерации особой ситуации выполнение программы прерывается, а управление передается специальной процедуре — обработчику прерывания или особой ситуации. В большинстве случаев, когда обработка прерывания или особой ситуации заканчивается, управление может быть возвращено в прерванную программу, которая продолжит свое выполнение с той самой точки, в которой она была остановлена. Процессор производит автоматическое сохранение/восстановление контекста и состояния для обеспечения этой возможности.
Все прерывания и особые ситуации имеют уникальные идентификационные номера. Эти номера называются векторами прерываний и лежат в пределах от 0 до 255. Векторы от 0 до 31 отведены для особых ситуаций и немаскируемого прерывания, причем некоторые из них зарезервированы и не должны использоваться программами. Векторы от 32 до 255 свободны для любого использования пользовательскими программами и внешними устройствами.
Существует два источника поступления прерываний и три типа особых ситуаций. Кроме того, различают внутренние (программные) и внешние (аппаратные) источники генерации прерываний и особых ситуаций.
Внешние или аппаратные прерывания (External or Hardware interrupts):
Программные прерывания и особые ситуации (Software interrupts and Exceptions):
Регистр флагов содержит различные биты, отражающие текущее состояние процессора и частично управляющие его работой.
Режим с поддержкой виртуальных флагов прерываний
В процессорах, начиная с Pentium, возможен специальный подвид защищенного режима с поддержкой виртуальных флагов прерываний (Protected-mode Virtual Interrupts), который включается установкой флага CR4.PVI. В этом режиме процессор обеспечивает автоматическую поддержку отслеживания запросов от внешних маскируемых источников прерываний для задач, выполняемых на уровне привилегий CPL = 3 при EFLAGS.IOPL < 3. Для обеспечения такой поддержки применяются специальные флаги VIF и VIP в регистре EFLAGS. Этот механизм во многом похож на режим EV86, который, в свою очередь, предназначен для работаты с виртуальными прерываниями в режиме V86.
- если в момент поступления запроса на прерывание EFLAGS.VIF = 1, значит прерывания были разрешены в программе уровня привилегий 3 – обработчик защищенного режима может либо сам обработать это прерывание, либо передать управление в соответствующий обработчик в прерванной задаче, эмулируя поступление соответствующего внешнего прерывания;
- если в момент поступления запроса на прерывание EFLAGS.VIF = 0, значит прерывания были запрещены в программе уровня привилегий 3, обработчик защищенного режима может сам обработать поступившее прерывание, но если это необходимо делать внутри программы уровня привилегий 3, обработчик защищенного режима устанавливает специальный флаг отложенного прерыванияEFLAGS.VIP и возвращает управление в прерванную программу.
Таким образом, флаг EFLAGS.VIP никогда автоматически не изменяется процессором, а должен устанавливаться и сбрасываться программным обеспечением самостоятельно.
Текущие значения флагов EFLAGS.VIF и EFLAGS.VIP никак не влияют на работу процессора на уровне привилегий. отличном от 3.
Команды POPF/POPFD и PUSHF/PUSHFD выполняются при активированном механизме виртуальных прерываний защищенного режима (CR4.PVI = 1) точно также, как и без него (CR4.PVI = 0).
Флаги состояния
Эти флаги отражают результат, полученный в предыдущей арифметико-логической операции. Многие из них могут использоваться в дальнейшем для выполнения условных переходов или условных пересылок.
Флаги этой группы могут изменяться любыми программами с помощью команд, заносящих в регистр флагов новое значение (SAHF, POPF/POPFD/POPFQ).
CF | Флаг переноса (бит 0). На самом деле он имеет разное назначение в зависимости от выполняемой инструкции. В арифметических операциях над целыми числами этот флаг, будучи установленным, показывает наличие переноса или заёма (это можно рассматривать как «беззнаковое переполнение»), а будучи сброшеннм — отсутствие переноса или заёма. Кроме того, этот флаг применяется в некоторых других инструкциях и тем или иным образом характеризует полученный результат. Подробно использование этого флага в каждой конкретной инструкции указывается в её описании |
PF | Флаг чётности (бит 2). Устанавливается, если младший байт результата содержит чётное число единичных битов, в противном случае сбрасывается |
AF | Флаг вспомогательного переноса (бит 4). Устанавливается при возникновении переноса или заёма из 4-ого раззряда в 3-ий разряд. Сбрасывается при отсутствии такового. Используется командами десятичной коррекции. |
ZF | Флаг нуля (бит 6). Устанавливается при получении нулевого результата, сбрасывается в противном случае. |
SF | Флаг знака (бит 7). Устанавливается, если в результате операции получено отрицательное число, т.е. если старший разряд результата равен единице. В противном случае сбрасывается |
OF | Флаг переполнения (бит 11). Устанавливается, если в результате арифметической операции зафиксировано знаковое переполнение, то есть если результат, рассматриваемый как число со знаком, не помещается в операнд-приёмник. Если знакового переполнения нет, этот флаг сбрасывается |
История
Регистр флагов был уже в первом 16-разрядном микропроцессоре Intel — 8086. Он носил имя FLAGS и имел длину 16 бит. Появление микропроцессора 80286 добавило в регистр FLAGS бит NT и битовое поле IOPL, однако сам регистр оставался 16-разрядным.
С выходом микропроцессора 80386 регистр был расширен до 32 бит и стал называться EFLAGS. В нём появились ещё два дополнительных бита: VM и RF. В последующих поколениях 32-разрядных микропроцессоров были добавлены биты AC, VIF, VIP и ID. Тем не менее, сохранялась полная совместимость «снизу вверх»: любая старая программа, которая корректно работала с регистром EFLAGS, не модифицируя «неизвестные» ей биты, оставалась работоспособной и на последующих процессорах.
Расширение разрядности процессора до 64 бит, первоначально произведённое компанией AMD (технология AMD64) и позже скопированное Intel (EM64T), удвоило и размер регистра флагов, получившего название RFLAGS. Однако его старшая половина (биты с 32-го по 63-й включительно) пока не используется и является зарезервированной, поэтому формат «значащей» части RFLAGS полностью совпадает с форматом EFLAGS.
Читайте также: