Программные прерывания обрабатываются: Что такое программные и аппаратные прерывания и как они обрабатываются?

Содержание

Обработка прерываний

Мы прерываем эту программу…

Прерывание — это процесс, который временно останавливает работающую программу, выполняет подпрограмму — процедуру обработки прерываний (interrupt service routine — ISR), а затем запускает остановленную программу, как будто ни­чего не произошло. Это действие похоже на прерывание телевизионной программы для «важного сообщения», показ которой возобновляется после того, как диктор прочитает новости.

Команды sti и cli никак не действуют на программные прерывания — те, которые генерируются командой int в программе или при возникновении ошибки деления и других подобных обстоятельствах. В независимости от установ­ки флага if, вы всегда можете выполнить int для того, чтобы заставить работать процедуру обработки прерывания.

Замечание

Некоторые программисты заблуждаются, веря в то, что NMI может быть заблокирована. Не может! Однако в IBM PC возможно заблокировать другие каналы, которые генерируют сигналы прерывания процессору по линии NMI, что пред­отвращает возникновение прерываний N Ml. На машинах IBM XT и полностью с ними совместимых можно маскировать NMI, записав 00h (запрещено) или 080h (разрешено) в порт 0A0h. Тем не менее, это может не дать желаемого эффекта, поскольку не запретит другим программам открыть NMI после вашего запрета. Имейте также в виду, что некоторые кана­лы внешнего интерфейса используют NMI в своих собственных целях.

Векторы прерываний и микросхема 8259

Имея всего только две линии прерываний — INTR и NMI, можно подумать, что возможности прерываний процес­сора 8086 жестко ограничены. Но с помощью другой микросхемы, программируемого контроллера прерываний (PIC) Intel 8259, IBM PC может обслуживать до восьми устройств, генерирующих прерывания. (В IBM AT добавлен второй PIC, что позволяет обслуживать еще большее число устройств. Большинство современных PC имеет похожую кон­струкцию.) Каждое устройство приписывается одному уровню PIC (от 0 до 7 или 15 в AT), причем меньшие номера имеют большие приоритеты. Это означает, что если два прерывания возникают одновременно, контроллер 8259 пер­вым обслуживает устройство с меньшим номером.

Таким образом, устройства могут использовать прерывания для запуска своих собственных программ, независимо от работы остального про­граммного обеспечения. При программировании процессора 8086 это классическое определение распространяется на два вида сигналов прерывания:

• внешние прерывания

• внутренние прерывания.

Внешние прерывания происходят, когда устройство, присоединенное к процессору, само генерирует сигнал пре­рывания. Внутренние прерывания исходят от процессора в двух случаях: в результате выполнения программной команды int или при определенных условиях, таких как деление на 0 при выполнении команды div, которая генери­рует какой-то сигнал прерывания для этого типа ошибки. В добавление к этому, внутренние прерывания int — на­зываемые также

программными прерываниями — могут эмулировать прерывания внешние. Это полезный метод для отладки внешних прерываний.

Написание процедур обработки прерываний

Четыре основных правила, которых стоит придержи­ваться при написании своих собственных процедур обработки прерываний:

• Сохраняйте регистры в начале процедуры

• Выполняйте sti для генерирования прерываний вне данного ISR

• Восстанавливайте регистры в конце процедуры • Последней командой выполняйте iret

Внешние прерывания могут возникнуть в любой момент времени; поэтому особенно важно, чтобы внешние ISR не вносили никаких изменений в состояние регистров. Заранее неизвестно, какие регистры могут использоваться, когда произойдет внешнее прерывание; следовательно, забывчивость при сохранении и восстановлении значений регистров, измененных внутри обрабатывающей процедуры, скорее всего, приведет к гибельным последствиям для работы остального программного обеспечения. Внутренние IRS могут менять значения регистров, поскольку про­граммы имеют больший контроль над ними, когда возникает прерывание этого типа. (Внутренние ISR работают аналогично подпрограммам.) Выполняйте команду sti, устанавливающую флаг возможности прерывания (if), если вы хотите, чтобы другие прерывания имели возможность прерывать данную процедуру обработки. Иначе новые прерывания не будут вызываться до тех пор, пока ваша процедура не выполнит команду iret (возврат из прерыва­ния), которой должна оканчиваться любая процедура обработки прерываний.

Замечание

Несмотря на то что прерывания могут возникать в любое время, они обрабатываются процессором только между другими командами. Иными словами, если прерывание возникло в процессе выполнения команды mul, которая может потребовать для выполнения 139 машинных циклов, mul завершится перед тем; как прерывание будет распознано и вызвано. Как ре­зультат этой потенциальной задержки, а также из-за того, что большинство инструкций требует разного числа циклов для выполнения, даже наиболее регулярные сигналы прерываний, скорее всего, будут обрабатываться в нерегулярные про­межутки времени. Повторяемые строковые команды, такие как rep movsb, могут быть прерваны между повторениями.

Маскируемые и немаскируемые прерывания

Процессоры семейства 8086 имеют два входных контакта (или входные линии), к которым могут быть подклю­чены устройства, генерирующие внешние прерывания:

• Маскируемые прерывания (INTR)

• Немаскируемые прерывания (NMI)

Линия INTR используется большинством устройств, генерирующих прерывания, для того чтобы сигнализировать процессору о необходимости обслуживания устройства. Команды cli и sti воздействуют на прерывания, поступающие по этой линии. Выполнение cli предотвращает {маскирует) распознавание процессором прерываний INTR. Выполне­ние sti вновь разрешает процессору распознавать сигналы прерываний INTR. Обе эти команды никак не влияют на вторую линию прерываний NMI, которая не может быть заблокирована. Обычно NMI зарезервирована для контроля за исключительными событиями и выполняет некоторые команды, когда обнаружено падение напряжения, система «зависает» при возникновении ошибки в памяти и т.п. Первоначальная конструкция IBM PC предполагала NMI для обработки ошибки четности в памяти, которая возникает, когда детектируется неисправный бит памяти. В настоящее время и другие устройства задействуют NMI, усложняя тем самым обработку прерываний NMI.

В табл. 10.1 перечислены устройства, связанные с каждым уровнем PIC. Уровень 2 служит как канал к подчиненной 8259 на компьютерах PC. Так как NMI также генерируется внешним образом, оно представлено в таблице, хотя эта линия не подсоединена к контроллеру 8259.

Таблица 10.1. Прерывания внешних устройств

Уровень PIC

Номер прерывания

Устройство

0

08h

Таймер (программные часы)

1

09h

Клавиатура

2

0Аh

К подчиненной 8259

3

0Вh

Второй последовательный I/O (COM2)

4

0Сh

Первый последовательный I/O (COM1)

5

0Dh

Жесткий диск

6

0Eh

Дисковод

7

0Fh

Параллельный принтер

8

070h*

Системные часы

9

071 h*

К главной 8259 Уровень 2

10

072h*

11

073h*

12

074h*

13

075h*

Числовой сопроцессор

14

076h*

Жесткий диск

15

077h*

| NMI

02h

Четность памяти

Только для IBM AT и совместимых с ними

Как можно видеть из табл. 10.1, каждый уровень PIC связан со второй величиной, называемой номером прерывания (или типом прерывания, уровнем прерывания), которая принимает значения от 08h до OFh на компьютерах PC. Эта система двойных наименований для внешних прерываний приводит в замешательство многих. Помните, что уровень PIC в действительности ссылается на контакт контроллера 8259, к кото­рому устройство подключено. Номер прерывания обозначает ISR, которая выполняется, когда устройство требует об­служивания. Программируя, можно игнорировать уровень PIC и вместо него обращаться к прерываниям по их номерам.

В табл. 10.2 представлен весь набор номеров прерываний, определенный в обычном компьютере типа PC/XT. За исключением первых восьми внешних прерываний из табл. 10.1, которые повторяются в этой таблице, большинство прерываний из этого полного набора представляет программное множество. Независимо от вида прерывания, каждый номер прерывания связан с уникальным вектором прерывания, который хранится в памяти по некоторому адресу. Эти адреса перечислены в середине табл. 10.2.

Таблица J0.2. Номера программных прерываний и их векторы

Номер прерывания

Местонахождение вектора

Назначение

000h

*0000h

Деление на нуль

001h

0004h

Перевод в пошаговый режим

002h

0008h

Немаскируемое прерывание

‘003h

000Ch

Точка останова

004h

001 Oh

Переполнение регистров

005h

0014h

Печать копии экрана

006h

0018h

*

007h

001 Ch

*

008h

0020h

Таймер (программные часы)

009h

0024h

Клавиатура

00Ah

0028h

*

00Bh

002Ch

Второй последовательный I/O (COM2)

00Ch

0030h

Первый последовательный I/O (COMI)

00Dh

0034h

Жесткий диск

00Eh

0038h

Дисковод

00Fh

003Ch

Параллельный принтер

010h

0040h %

Видеоадаптер

011h

0044h

Запрос списка подсоединенного оборудования

012h

0048h

Запрос размера памяти

013h

004Ch

Управление жестким диском

014h

0050h

RS-232 I/O

015h

0054h

Магнитофон

016h

0058h

Клавиатура

017h

005Ch

Принтер

018h

0060h

Basic из ПЗУ

019h

0064h

Перезапуск системы

01 Ah

0068h

Текущее время/дата

01 Bh

006Ch

Обработка <Ctrl-Break>

01 Ch

0070h

Пользовательская процедура таймера

01 Dh

0074h

Параметры инициализации видеоадаптера

01 Eh

0078h

Параметры дисковода**

01Fh

007Ch

Адрес расширенной таблицы символов**

020h-03Fh

0080h-00FCh

Зарезервировано DOS

040h-06Fh

0100h-01BCh

Различное

070h

01C0h

Системные часы

071 h

01C4h

072h

01C8h

*

073h

01CCh

*

074h

01D0h

*

075h

01D4h

Числовой сопроцессор

076h

01D8h

Жесткий диск

077h

01DCh

*

I 078h-0FFh

01E0h-03FCh

Различное

* Зарезервированы или не используются.

** Не являются процедурами обработки прерывания.

Вектор прерывания — это просто указатель, 32-битовый (4-байтовый) адрес значений сегмента и смещения, ко­торый хранится в нижних адресах памяти, начиная с 0000:0000 до 0000: 03FF. Каждый вектор задает адрес начала процедуры обработки прерывания, связанной с соответствующим номером прерывания, меняющимся от 00 до FFh, определяя одно из 256 программных и аппаратных прерываний для типичного PC. Когда сигнал внешнего прерывания генерируется одним из устройств, перечисленных в табл. 10.1, контроллер 8259 активизирует линию INTR процессора, ожидает подтверждения (генерируемого автоматически) и затем посылает соответствующий но­мер прерывания процессору. Процессор использует этот номер для того, чтобы выбрать нужный вектор из нижней памяти и вызвать ISR. Подобные действия совершаются, когда процедура вызывает программное прерывание по команде int либо когда в результате деления на 0 или при других аналогичных обстоятельствах генерируется внут­реннее прерывание. Как в случае внешних, так и внутренних прерываний происходит несколько событий после то­го, как процессор получил номер прерывания:

• Флаги проталкиваются (сохраняются) в стек

• Флаги if и tf очищаются

• Регистры ip и cs проталкиваются в стек

• Вектор прерывания копируется в cs:ip

Последний шаг этого процесса приводит к тому, что начинает выполняться программа обработки прерывания, хранимая в памяти по адресу вектора прерывания, соответствующего номеру прерывания (см. табл. 10.2). Изменяя один такой вектор, можно вставить свою собственную процедуру обработки прерывания на место установленного кода, который обслуживает прерывания в вашей системе, а также связать вашу обработку прерывания с существующей ISR. Этим приемом можно воспользоваться для перехватывания нажатия некоторых клавиш, которые задействованы как команды активизации, оставляя другие клавиши нетронутыми. Когда ISR заканчивает обра­ботку прерывания, она выполняет команду iret, что приводит к таким действиям:

• Регистры cs и ip выталкиваются из стека

• Флаги выталкиваются из стека

Первое из этих действий обеспечивает нормальное выполнение прерванной программы. На втором шаге вос­станавливаются значения всех флагов, которые могли меняться командами ISR. Благодаря тому, что флаги авто­матически сохраняются и восстанавливаются таким способом, а также тому, что прерывания от устройств обраба­тываются, только если установлен флаг if (командой sti, например), вам не нужно самому выполнять sti внутри ISR, чтобы после окончания работы ISR разрешить обработку новых прерываний (общее заблуждение). Изначальные значения флагов загружаются в стек перед тем, как if и tf очищаются процессором; поэтому, если if установить за­ранее, он будет вновь установлен после выполнения iret. Необходимо выполнять sti внутри вашей процедуры обра­ботки только в том случае, когда вы хотите, чтобы прерывания обнаруживались в процессе выполнения ISR.

Когда вам нужно, чтобы ISR возвращала значения флагов — например, как это часто осуществляет функция ДОС команды int 21 h — у вас есть два выбора: изменить значения флагов в стеке до выполнения iret или извлечь флаги из стека и выполнить ret вместо iret. Помните, что процедура обработки прерывания — это всего только подпрограмма специального вида; поэтому, чтобы предотвратить обратное изменение флагов в процедуре, можно использовать такой код:

retf 2 ; Вернуться и отбросить 2 байта стека

Это приведет к возврату из ISR с последующим удалением 2 байт из стека. Эти два байта содержат значения фла­гов, запомненных в стеке, когда была активизирована ISR. Поступайте так только с внутренними прерываниями; ко­торые программы вызывают как подпрограммы. Отбрасывая флаги, сохраненные в стеке процессором после опреде­ления прерывания, вы в действительности превращаете ISR просто в подпрограмму, которая может заканчиваться ret. Можно затем использовать команду call для выполнения того же кода, начиная, конечно, с другой точки входа. Не­смотря на то, что вам не понадобится часто применять этот фокус, полезно понимать, что ISR это всего только под­программа и вам решать, что этот код делает и как он возвращает управление вызывающему процессу.

Почему команда hlt не останавливает программу

Тесно связанная с программированием прерываний, команда hlt ведет себя не так, как вы могли бы подумать. Выполняя hlt, процессор 8086 делает паузу, совершенно останавливая программу в этом месте. В это время, если прерывания разрешены, сигнал прерывания по линии INTR распознается процессором, как обычно, заставляя вы­полняться процедуру обработки прерывания и, таким образом, нарушая состояние остановки. Когда ISR завер­шается, работа продолжается командой, следующей за hlt. Другими словами, hlt на самом деле не останавливает процесс — система ожидает возникновения прерывания. Если прерывание не разрешено, hlt в действительности может заблокировать систему компьютера, препятствуя распознаванию сигналов INTR. Поэтому, чтобы поста­вить 8086 «на колени», вы могли бы выполнить команды:

cli ; Запрещение прерываний, очищая if

hlt ; Ожидание прерывания, которое не может возникнуть!

После этих двух команд только два события могут разблокировать процессор: RESET или NMI, которые оба игнорируют установку if. На практике hlt в основном используется для синхронизации программ и внешних событий, при этом делается пау­за до тех пор, пока сигнал прерывания не придет от определенного устройства. Основной смысл этого состоит в том, что команда sti, которая устанавливает флаг if, разрешает определять прерывания INTR. Однако это случится только после следующей за sti командой; поэтому для синхронизации программы и внешнего прерывания никогда не пишите:

sti ; Разрешение на возникновение прерывания

cli ; Запрещение прерывания

Из-за того, что прерывания распознаются только после команды, следующей за sti и если это команда запреще­ния прерывания, то даже самому «пронырливому» сигналу не хватит времени, чтобы проскользнуть. Корректный способ синхронизации программы и внешнего прерывания представлен следующим программным кодом:

cli ; Запрещение прерывания

sti ; Разрешение прерываний в следующей команде

hlt ; Пауза до возникновения прерывания

cli ; Снова запрещение прерывания (необязательно)

Если прерывание уже запрещено, первая cli не нужна. Вторая cli нужна, только если вы хотите предотвратить возникновение дополнительных прерываний. Поставив hlt следом за sti, вы гарантируете продолжение работы программы только при получении сигнала INTR, генерируемого, например, нажатием клавиши или получением символа в последовательный порт ввода.

Обработка прерываний

Программный код ISR следует одной и той же базовой схеме как для внешних, так и для внутренних прерыва­ний.

Внедрение в прерывание часов PC

Все IBM PC (и даже менее, чем на 100% совместимые) содержат системные часы, которые генерируют сигнал прерывания приблизительно 18.2 раза или «тика» в секунду. В ROM BIOS прерывание 08h обрабатывает эти сигна­лы, которые проходят по линии 0 PIC 8259 (см. табл. 10.1.) Это задает прерыванию от часов наивысший приоритет. До тех пор пока прерывания разрешены, ISR часов будет выполняться первым, если более чем один сигнал преры­вания, возникнет в одно и то же время.

ROM BIOS ISR часов выполняет две базовые функции. Первая функция — программа увеличивает 32-битовую величину, считая таким образом общее число тиков часов, которые прошли с того времени, как система была включена. (Эта величина обнуляется каждые 24 часа — не обязательно в полночь.) Вторая функция — уменьшается другой счетчик, который контролирует, как долго мотор дисковода остается включен. Когда эта величина стано­вится равной 0, мотор дисковода выключается (если он был включен), тем самым оставляя дискету во вра­щающемся состоянии достаточно долго для того, чтобы увеличить скорость чтения и записи. (Каждый раз, когда дискета начинает вращаться, требуется время, чтобы ось набрала скорость. Если бы мотор выключался сразу после окончания каждого акта чтения и записи, то эти паузы замедлили бы работу с дискетой.) Как можно видеть, ISR часов — это бьющееся в PC сердце, и так же как с любым сердцем, большая задержка в выполнении его обязанно­стей может привести к проблемам; поэтому разумно не выключать прерывания командой cli на более чем 1/18.2 (около 0.05) секунд перед запуском sti для переключения прерываний обратно.

ISR часов выполняет третью функцию, которая позволяет вам постоянно следить за работой компьютера. В каждый тик часов эта процедура выполняет программное прерывание под номером 0lCh, которое обычно ничего не делает. Установив свое собственное 0lCh ISR, ваш код будет выполняться около 18.2 раз в секунду вдобавок к другим функциям часов. SLOWMO.ASM использует эту особенность для того, чтобы добавить паузы в испол­няемую программу.

Прерывания и стеки

Поскольку внешние прерывания могут возникать в любое время, нет никакого способа предсказать значения регистров, когда ISR внешнего прерывания начинает работу. Единственный регистр, на который можно положить­ся, — cs. Очевидно, этот регистр всегда содержит значение текущей величины сегмента кода выполняемых в дан­ный момент времени команд. Но es, ds и ss могут указывать на что угодно. Как объяснялось раньше, для ссылки на внутренние данные вы должны инициализировать ds и es, сохранив их текущие значения для восстановления перед окончанием ISR. К сожалению, корректная обработка регистра сегмента стека не так проста.

DOS имеет свое собственное пространство для стека, как это и положено главной программе. Вдобавок, в памяти могут быть другие ISR, у которых свои собственные стеки. Если какая-либо из этих программ прерывается, вели­чина ss будет равна тому значению, которое приписано этой программе. Другими словами, ISR обычно использует любой сегмент стека, который был текущим в момент возникновения прерывания. Во многих случаях, по-видимому, можно предположить, что небольшое стековое пространство всегда свобод­но. Но для большинства программистов такое допущение — пилюля болезненной неопределенности, которую гло­тают в педантичном мире компьютерного программирования, требующем аккуратности от своих жителей. Если ваша ISR использует больше, чем несколько байтов стековой памяти, — вы должны перейти на локальный сток.

Замечание

В ваших собственных программах всегда добавляйте несколько дополнительных байтов в вашей директиве STACK к тем, которые точно нужны. В противном случае у вас могут быть проблемы с ISR, процедурами ROM BIOS, DOS и другим рези­дентным кодом, „считающим», что несколько байтов стека свободно. Некоторые руководства по DOS рекомендуют 2,048 байт как минимальный размер стека, хотя простые примеры, такие как программы в этой книге, могут обойтись и меньшей величиной.

Поменять стек в ISR не сложно, но вы должны выполнять команды в правильном порядке. Причина этого со­стоит в том, что 8086 временно запрещает прерывания на период в одну команду всякий раз, когда вы приписы­ваете некоторое значение регистру сегмента. Другими словами, когда вы пишите знакомый код инициализации

mov ax, @data

mov ds, ax

mov dx, offset string

прерывания не обрабатываются до mov в dx — факт, не очевидный из текста программы. В этом примере влияние на прерывания не существенно. Однако рассмотрим, что случится, когда меняется значение регистра сегмента стека:

mov ax, offset stackSpace

mov ss, ax

mov sp, offset endOfStack

Регистр sp — это указатель на стек, локализующий текущую вершину стека относительно адреса сегмента в ss. Из-за того, что требуется две команды для изменения как ss, так и sp, если прерывание возникнет между присвоением ss и присвоением sp, старый указатель на стек будет использоваться вместе с новым сегментом стека — опасная ситуация, которая может привести к краху системы. По этой причине прерывания запрещены в течение одной команды после присвоения ss — как раз достаточный промежуток времени для того, чтобы приписать значение регистру sp. Прерывания также запрещены на время выполнения команды pop, влияющей на регистр сегмента. Помните, что этот эффект длится только одну команду и mov в sp должен немедленно следовать за mov в ss.

Всякий раз, когда вы приписываете значение ss, немедленно затем присваивайте соответствующую величину зр. Никогд не переставляйте эти команды и не вставляйте другие команды между этими присвоениями.

Поскольку стек увеличивается от верхних адресов памяти к нижним, sp нужно инициализировать так, чтобы он указывал на конец стека, а не на начало. Из-за того, что команда push уменьшает указатель на стек на 2, перед пе­ремещением запомненного слова в место, на которое указывает ss:sp, будет безопасно адресовать значением sp не­которое место памяти сразу после последнего байта, выделенного стеку.

Таким образом, ss:sp указывает на последнее слово в стеке, а не на байт за концом стека. Так тратится впустую одно слово стекового пространства, но гарантируется, что sp никогда не выйдет за пределы стека.

После перехода на внутренний стек можно сохранить регистры, ссылаться на переменные относительно bр и т.д. Помните, что ваш новый стек должен делиться между любыми другими прерываниями, которые возникают во время выполнения ISR. После окончания ISR восстановите изначальный стек. F

Замечание

Использование команд int и into

Как вы знаете, функции DOS вызываются командой программного прерывания int 21h. Настоящие прерывания генерируются внешним образом и могут возникать в любое время. Программные прерывания, инициируемые через int, могут возникать только тогда, когда программа выполнит эту команду. Поэтому программные прерывания еще больше похожи на обычные подпрограммы, чем ISR. За исключением этого различия, внутренние программ­ные и внешние прерывания от оборудования идентичны и используют значения соответствующих векторов в ниж­ней памяти для того, чтобы запустить ISR, сохранив флаги и регистры cs:ip в стеке. Программные прерывания также заканчиваются командой iret.

Интересно то, что вызовы int не запрещаются очисткой флага if командой cli. Вы всегда можете вызвать про­граммное прерывание, даже когда внешние прерывания запрещены. Вы можете вызвать также внешнюю ISR ис­пользуя команду int. Например, совершенно законно «генерируется» ваш собственный тик часов как

int 08h

Заставить часы «тикнуть»

Наверное, не существует достаточно веских причин заставлять ISR ROM BIOS таймера выполняться по коман­де программного прерывания, но ничего не мешает вам сделать это — хотя если это будет происходить часто по-видимому, часы придут в негодность. Знайте также, что некоторые ISR (программа BIOS для прерывания от кла­виатуры 09h, например) «считают», что в определенных регистрах различных коммуникационных линий имеются данные, которые необходимо обработать. Этого может и не быть, если вы хотите, чтобы прерывание от оборудо­вания возникло по команде int. Но вызов прерываний от устройств программной командой int полезно использо­вать для отладки внешних ISR, что позволяет эмулировать работу оборудования.

В дополнение к int вы также можете использовать команду into (прерывание по переполнению) для того, чтобы вызвать прерывание 4, если флаг переполнения установлен (of=l) в результате выполнения предыдущей арифмети­ческой операции. На практике команда into используется редко и вектор прерывания для прерывания номер 4 обычно указывает на простую команду iret. Таким образом, ничего не происходит, если программа выполняет into Можно приписать этот вектор (используя функцию DOS 025h, как это ранее описано) вашей собственной ISR, если вы хотите обрабатывать ситуацию переполнения по своему усмотрению.

Отлавливание прерывания ошибки деления

Ошибочное название «деление на нуль» служит источником многих заблуждений. Команды div или idiv автома­тически вызывают прерывание 0 всякий раз, когда результат деления больше, чем максимальная величина, которая может находиться в месте результата (ах или al), и, конечно же, когда произошло деление на 0. Например,’этот код вызывает прерывание 0:

Присвоить 100h ax (младшее слово) Обнулить dx (старшее слово) Обнулить Ьх (делитель) Поделить dx:ax на Ьх

Поскольку делитель (bх) равен 0, div потерпит неудачу и выполнит ISR, вектор которой сохраняется в 0000:0000. Многие оказываются не в состоянии понять, что следующий код также генерирует прерывание деления на нуль:

Присвоить 100h ax (младшее слово) Установить делитель (bl) в 1 Генерируется прерывание 0

Результат деления 100h на 1, конечно, 100h. Но поскольку эта величина слишком велика для того, чтобы помес­титься в регистр результата al, генерируется прерывание деления на 0, хотя делитель определенно не 0. По этой причине прерывание деления на нуль лучше назвать прерыванием «ошибка деления». Проверка того, равняется ли де­литель 0 перед выполнением div, — потеря времени, так как прерывание 0 возникает всякий раз, когда результат деления превосходит вместимость регистра результата. Когда это случается, выполняется ISR внутри DOS, остана­вливая программу — событие, которого коммерческие программы должны избегать. Решение вопроса состоит в том, чтобы установить пользовательский обработчик прерывания ошибки деления, для того чтобы заменить ISR DOS прерывания 0. Как вы увидите, это гораздо труднее, чем можно предположить.

Исправление ошибки деления

Что должно произойти, когда возникнет ошибка деления? Ответ зависит от того, каково приложение. Про­грамма калькулятора, вероятно, должна выдать символ ошибки. Табличный процессор может вставить сообщение об ошибке в «ячейку» на экране. Другая, менее критичная программа может просто проигнорировать это собы­тие— что полезно в некоторых случаях, пока программа, выполняющая деление, знает об этой возможности. Обычный подход к написанию простой ISR:

PROC DivFault

хог ах,ах

i ret ENDP DivFault

Необязательная установка в 0 Выход из прерывания

Переприсваивание вектора прерывания 0 DivFault приводит к тому, что при условии возникновения ошибки деления выполняется команда iret, что, по-видимому, является самым простым способом для того, чтобы игнори­ровать такую ошибку. Установка частного в 0 необязательна — это разумный (если не правильный) ответ в случае ошибки деления. К сожалению, этот подход работоспособен только на системах с процессором 8086/88. На систе­мах с 80286 и более поздними моделями процессоров iret в этом примере приведет на самом деле к тем же div и idiv, которые вызывают прерывание, и машина зависает. Причина, по которой это происходит, состоит в том, что пре­рывание 0 запоминает адрес следующей команды для процессоров 8086/88, но оно запоминает адрес текущей ко­манды для процессоров 80286 и более поздних моделей. Это чрезвычайно неприятная проблема для программис­тов, которые должны писать код, работающий на достаточно широком множестве PC, XT и AT.

Корректная обработка этого необычного условия требует некоторого забавного «пританцовывания». Решение состоит в том, чтобы выровнять адрес смещения возврата в стеке, для того чтобы перескочить команды div и idiv, которые запускают ISR на выполнение. В некоторых руководствах рекомендуется просто добавить 2 к смешению возвращаемого адреса в стеке и затем закончить ISR командой iret. Но этот обычный подход неудачен, если при­нять во внимание, что команды div и idiv могут быть длиной 2 или 4 байта, в зависимости от того, является ли де­литель регистром (2 байта) или объектом из памяти (4 байта). В такой ситуации требуется просмотреть имеющийся код команд div и idiv. Если первые два бита второго байта равны 1, тогда операнд — регистр; в противном случае операнд — ссылка на память. «Зная» это, программа может выровнять возвращаемый адрес на 2 или на 4, пропус­кая div и idiv во время выполнения iret.

Замечание

Расшифровка битов; из которых состоит конкретный машинный код, — это кропотливая работа, к счастью, редко необхо­димая, (См. документацию, где содержатся точные битовые форматы для других команд в машинном коде.)

Установка обработчика ошибки деления

Хороший путь для обработки прерывания ошибки деления состоит в установке в памяти резидентной програм­мы для того, чтобы отлавливать прерывания 0, если они возникнут. После того как это сделано, все ошибки деле­ний пойдут через новую ISR, предотвращая неожиданную остановку программы средствами DOS.

Программные прерывания — Мегаобучалка

Хотя большинство прерываний генерируется аппаратно, ядро Windows тоже может генерировать прерывания — только они являются программными. Этот вид прерываний служит для решения многих задач, в том числе:

· инициации диспетчеризации потоков;

· обработки прерываний, не критичных по времени;

· обработки событий таймеров;

· асинхронного выполнения какой-либо процедуры в контексте конкретного потока;

· поддержки асинхронного ввода-вывода. Эти задачи подробно рассматриваются ниже.

Прерывания представляют собой механизм, позволяющий координировать параллельное функционирование отдельных устройств вычислительной системы и реагировать на особые состояния, возникающие при работе процессора. Прерывание– это принудительная передача управления от выполняемой программы к системе (а через нее – к соответствующей программе обработки прерывания), происходящая при возникновении определенного события.

Переключение по прерыванию отличается от переключения, которое происходит по команде безусловного или условного перехода, предусмотренной программистом в потоке команд приложения. Переход по команде происходит в заранее определенных программистом точках программы. Прерывание же происходит в произвольной точке потока команд программы, которую программист не может прогнозировать. Сходство прерываний с процедурами состоит в том, что в обоих случаях выполняется некоторая подпрограмма, обрабатывающая специальную ситуацию, а затем продолжается выполнение основной ветви программы.

В зависимости от источника прерывания делятся на три больших класса: внешние, внутренние и программные.

Внешние (аппаратные) прерывания могут формироваться в результате действий пользователя или аппаратных устройств, например, контроллеров внешних устройств ввода-вывода, датчиков. Данный класс прерываний является асинхронным по отношению к потоку инструкций прерываемой программы. Аппаратура процессора работает так, что асинхронные прерывания возникают между выполнением двух соседних инструкций, при этом система после обработки прерывания продолжает выполнение процесса, уже начиная со следующей инструкции.



Внутренние прерывания, называемые также исключениями (exeption), происходят синхронно выполнению программы при появлении аварийной ситуации в ходе исполнения некоторой инструкции программы. Примерами исключений являются деление на ноль, ошибки защиты памяти, обращения по несуществующему адресу и т. п. Исключения возникают непосредственно в ходе выполнения тактов команды («внутри» выполнения).

Программные прерывания отличаются от предыдущих двух классов тем, что они по своей сути не являются «истинными» прерываниями. Программное прерывание возникает при выполнении особой команды процессора, выполнение которой имитирует прерывание, то есть переход на новую последовательность инструкций.

Прерываниям приписывается приоритет, с помощью которого они ранжируются по степени важности и срочности.

Прерывания обычно обрабатываются модулями операционной системы, так как действия, выполняемые по прерыванию, относятся к управлению разделяемыми ресурсами ВС. Процедуры, вызываемые по прерываниям, обычно называют обработчиками прерываний или процедурами обслуживания прерываний (Interrupt Service Routine, ISK). Аппаратные прерывания обрабатываются драйверами соответствующих внешних устройств, исключения – специальными модулями ядра, а программные прерывания – процедурами ОС, обслуживающими системные вызовы. Кроме этих модулей в операционной системе может находиться так называемый диспетчер прерываний, который координирует работу отдельных обработчиков прерываний.

В начале прерывания использовались в основном для управления процессором устройствами ввода-вывода. Затем прерывания стали использовать для организации внутренней работы ЭВМ. В соответствии с этим существуют следующие типы прерываний:

1. Аппаратные прерывания – прерывания от устройств компьютера.

2. Программные прерывания – прерывания, которые вырабатывают процессы, находящиеся на стадии выполнения.

3. Логические прерывания – Эти прерывания вырабатывает сам процессор, когда встречается с каким-либо необходимым условием:

1. деление на 0

2. переполнение регистров микропроцессора

3. пошаговое выполнение программ

4. режим контрольных точек.

 

Каждое прерывание имеет два параметра:

1. Номер прерывания

2. Вектор прерывания.

 

Вектор прерывания– это адрес ячейки памяти, где хранится программа – обработчик прерывания.

Прерывания обозначаются — IRQ.

Переход от выполнения одного потока к другому осуществляется в результате планирования и диспетчеризации. Работа по определению того, в какой момент необходимо прервать выполнение текущего активного потока и какому потоку предоставить возможность выполняться, называется планированием.

Диспетчеризациязаключается в реализации найденного в результате планирования (динамического или статистического) решения, то есть в переключении процессора с одного потока на другой. Прежде чем прервать выполнение потока, ОС запоминает его контекст, с тем, чтобы впоследствии использовать эту информацию для последующего возобновления выполнения данного потока. Контекст отражает, во-первых, состояние аппаратуры компьютера в момент прерывания потока: значение счетчика команд, содержимое регистров общего назначения, режим работы процессора, флаги, маски прерываний и другие параметры. Во-вторых, контекст включает параметры операционной среды, а именно ссылки на открытые файлы, данные о незавершенных операциях ввода-вывода и т. д.

Диспетчеризация сводится к следующему:

· сохранение контекста текущего потока, который требуется сменить;

· загрузка контекста нового потока, выбранного в результате планирования;

· запуск нового потока на выполнение.

Поскольку операция переключения контекстов существенно влияет на производительность вычислительной системы, программные модули ОС выполняют диспетчеризацию потоков совместно с аппаратными средствами процессора.

Уровни запросов программных прерываний

Хотя контроллеры прерываний различают уровни приоритетов прерываний, Windows использует свою схему приоритетов прерываний, известную под названием уровни запросов прерываний (interrupt request levels, IRQL). Внутри ядра IRQL представляются в виде номеров 0-31 в системах x86 и 0-15 в системах x64 и IA64, причем больший номер соответствует прерыванию с более высоким приоритетом. Ядро определяет стандартный набор IRQL для программных прерываний, a HAL увязывает IRQL с номерами аппаратных прерываний. IRQL, определенные для архитектуры x86, показаны на рис. 3–3, а аналогичные сведения для архитектур x64 и IA64 — на рис. 3–4.

 

ПРИМЕЧАНИЕ Уровень SYNCH_LEVEL, используемый многопроцессорными версиями ядра для защиты доступа к индивидуальным для каждого процессора блокам PRCB (processor control blocks), не показан на этих схемах, так как его значение варьируется в разных версиях Windows. Описание SYNCH_LEVEL и его возможных значений.

 

Рис. 3–4. Уровни запросов прерываний (IRQL) в системах x64 и IA64

 

Прерывания обслуживаются в порядке их приоритета, и прерывания с более высоким приоритетом вытесняют обработку прерываний с меньшим приоритетом. При возникновении прерывания с высоким приоритетом процессор сохраняет информацию о состоянии прерванного потока и активизирует сопоставленный с данным прерыванием диспетчер ловушки. Последний повышает IRQL и вызывает процедуру обслуживания прерывания (ISR). После выполнения ISR диспетчер прерывания понижает IRQL процессора до исходного уровня и загружает сохраненные ранее данные о состоянии машины. Прерванный поток возобновляется с той точки, где он был прерван. Когда ядро понижает IRQL, могут «материализоваться» ранее замаскированные прерывания с более низким приоритетом. Тогда вышеописанный процесс повторяется ядром для обработки и этих прерываний.

Уровни приоритетов IRQL имеют совершенно иной смысл, чем приоритеты в схеме планирования потоков. Приоритет в этой схеме является атрибутом потока, тогда как IRQL — атрибутом источника прерывания, например клавиатуры или мыши. Кроме того, IRQL каждого процессора меняется во время выполнения команд операционной системы.

Значение IRQL определяет, какие прерывания может получать данный процессор. IRQL также используется для синхронизации доступа к структурам данных режима ядра (о синхронизации мы поговорим позже). При выполнении поток режима ядра повышает или понижает IRQL процессора либо напрямую (вызовом соответственно KeRaiseIrql или KeLowerIrqL), либо — что бывает гораздо чаще — опосредованно (через функции, которые обращаются к синхронизирующим объектам ядра). Как показано на рис.3–5, прерывания от источника с IRQL, превышающим текущий уровень, прерывают работу процессора, а прерывания от источников, IRQL которых меньше или равен текущему уровню, маскируются до тех пор, пока выполняемый поток не понизит IRQL.

 

Поскольку доступ к PIC — операция довольно медленная, в HAL, использующих PIC, реализован механизм оптимизации «отложенный IRQL» (lazy IRQL), который избегает обращений к PIC Когда IRQL повышается, HAL — вместо того чтобы изменять маску прерывания — просто отмечает новый IRQL. Если вслед за этим возникает прерывание с более низким приоритетом, HAL устанавливает маску прерывания в соответствии с первым и откладывает обработку прерывания с более низким приоритетом до понижения IRQL. Таким образом, если при повышенном IRQL не возникнет прерываний с более низким приоритетом, HAL не потребуется обращаться к PIC.

Поток режима ядра повышает и понижает IRQL процессора, на котором он выполняется, в зависимости от того, что именно делает этот поток. Например, обработчик ловушки (или сам процессор) при прерывании повышает IRQL процессора до IRQL источника прерывания. B результате все прерывания с более низким или равным IRQL маскируются (только на этом процессоре), что не дает прерыванию с таким же или более низким IRQL помешать процессору обработать текущее прерывание. Замаскированные прерывания либо обрабатываются другим процессором, либо откладываются до понижения IRQL. Поэтому все системные компоненты, в том числе ядро и драйверы устройств, пытаются удерживать IRQL на уровне passive («пассивный»), иногда называемом низким уровнем. Если бы IRQL долго оставался неоправданно высоким, драйверы устройств не смогли бы оперативно реагировать на аппаратные прерывания.

В результате программные прерывания часто используются для выполнения ограниченного количества вызовов функций ядра операционной системы, то есть системных вызовов

Мультипрограммирование на основе прерываний

Назначение и типы прерываний

Ø Прерывания являются основной движущей силой любой операционной системы. Отключите систему прерываний — и «жизнь» в операционной системе немедленно остановится. Периодические прерывания от таймера вызывают смену процессов в мультипрограммной ОС, а прерывания от устройств ввода-вывода управляют потоками данных, которыми вычислительная система обменивается с внешним миром.

Как верно было замечено: «Прерывания названы так весьма удачно, поскольку они прерывают нормальную работу системы».

Другими словами, система прерываний переводит процессор на выполнение потока команд, отличного от того, который выполнялся до сих пор, с последующим возвратом к исходному коду.

Ø Механизм прерываний очень похож на механизм выполнения процедур. Это на самом деле так, хотя между этими механизмами имеется важное отличие.

· Переключение по прерыванию отличается от переключения, которое происходит по команде безусловного или условного перехода, предусмотренной программистом в потоке команд приложения.

· Переход по команде происходит в заранее определенных программистом точках программы в зависимости от исходных данных, обрабатываемых программой.

· Прерывание же происходит в произвольной точке потока команд программы, которую программист не может прогнозировать.

· Прерывание возникает либо в зависимости от внешних по отношению к процессу выполнения программы событий, либо при появлении непредвиденных аварийных ситуаций в процессе выполнения данной программы.

Сходство же прерываний с процедурами состоит в том, что в обоих случаях выполняется некоторая подпрограмма, обрабатывающая специальную ситуацию, а затем продолжается выполнение основной ветви программы.

Ø В зависимости от источника прерывания делятся на три больших класса:

· внешние;

могут возникать в результате:

— действий пользователя или оператора за терминалом,

— поступления сигналов от аппаратных устройств — сигналов завершения операций ввода-вывода, вырабатываемых контроллерами внешних устройств компьютера, такими как принтер или накопитель на жестких дисках, или же сигналов от датчиков управляемых компьютером технических объектов

называют также аппаратными, отражая тот факт, что прерывание возникает вследствие подачи некоторой аппаратурой (например, контроллером принтера) электрического сигнала, который передается (возможно, проходя через другие блоки компьютера, например контроллер прерываний) на специальный вход прерывания процессора

данный класс прерываний является асинхронным по отношению к потоку инструкций прерываемой программы. Аппаратура процессора работает так, что асинхронные прерывания возникают между выполнением двух соседних инструкций, при этом система после обработки прерывания продолжает выполнение процесса, уже начиная со следующей инструкции

· внутренние;

называются также исключениями (exeption),

происходят синхронно выполнению программыпри появлении аварийной ситуации в ходе исполнения некоторой инструкции программы. Примерами исключений являются деление на нуль, ошибки защиты памяти, обращения по несуществующему адресу, попытка выполнить привилегированную инструкцию в пользовательском режиме и т. п.

исключения возникают непосредственно в ходе выполнения тактов команды («внутри» выполнения).

· программные.

прерывание возникает при выполнении особой команды процессора, выполнение которой имитирует прерывание, то есть переход на новую последовательность инструкций.

Ø Прерываниям приписывается приоритет, с помощью которого они ранжируются по степени важности и срочности. О прерываниях, имеющих одинаковое значение приоритета, говорят, что они относятся к одному уровню приоритета прерываний.

Ø Прерывания обычно обрабатываются модулями операционной системы, так как действия, выполняемые по прерыванию, относятся к управлению разделяемыми ресурсами вычислительной системы — принтером, диском, таймером, процессором и т. п.

Ø Процедуры, вызываемые по прерываниям, обычно называют обработчиками прерываний, или процедурами обслуживания прерываний(Interrupt Service Routine, /57?).

Ø Аппаратные прерывания обрабатываются драйверами соответствующих внешних устройств,

Ø Исключения обрабатываются специальными модулями ядра.

Ø Программные прерывания обрабатываются процедурами ОС, обслуживающими системные вызовы.

Ø Кроме этих модулей в операционной системе может находиться так называемый диспетчер прерываний, который координирует работу отдельных обработчиков прерываний.

Механизм прерываний

Механизм прерываний поддерживается аппаратными средствами компьютера и программными средствами операционной системы.

Аппаратная поддержка прерываний имеет свои особенности, зависящие от типа процессора и других аппаратных компонентов, передающих сигнал запроса прерывания от внешнего устройства к процессору (таких, как контроллер внешнего устройства, шины подключения внешних устройств, контроллер прерываний, являющийся посредником между сигналами шины и сигналами процессора).

Особенности аппаратной peaлизации прерываний оказывают влияние на средства программной поддержки прерываний, работающие в составе ОС.

Существуют два основных способа, с помощью которых шины выполняют прерывания:

· векторный (vectored)

· опрашиваемый (polled).

В обоих способах процессору предоставляется информация об уровне приоритета прерывания на шине подключения внешних устройств.

Ø В случае векторных прерываний в процессор передается также информация о начальном адресе программы обработки возникшего прерывания — обработчика прерываний.

§ Устройствам, которые используют векторные прерывания, назначается вектор прерываний:

o представляет собой электрический сигнал, выставляемый на соответствующие шины процессора и несущий в себе информацию об определенном, закрепленном за данным устройством номере, который идентифицирует соответствующий обработчик прерываний.

o может быть фиксированным, конфигурируемым (например, с использованием переключателей) или программируемым.

§ Операционная система может предусматривать процедуру регистрации вектора обработки прерываний для определенного устройства, которая связывает некоторую подпрограмму обработки прерываний с определенным вектором.

§ При получении сигнала запроса прерывания процессор выполняет специальный цикл подтверждения прерывания, в котором устройство должно идентифицировать себя. В течение этого цикла устройство отвечает, выставляя на шину вектор прерываний. Затем процессор использует этот вектор для нахождения обработчика данного прерывания. Примером шины подключения внешних устройств, которая поддерживает векторные прерывания, является шина VMEbus.

§ Вектор прерываний, передаваемый в процессор, представляет собой целое число в диапазоне от 0 до 255, указывающее на одну из 256 программ обработки прерываний, адреса которых хранятся в таблице обработчиков прерываний.

Ø При использовании опрашиваемых прерываний

§ процессор получает от запросившего прерывание устройства только информацию об уровне приоритета прерывания (например, номере IRQ на шине ISA или номере IPL на шине SBus компьютеров SPARC).

§ скаждым уровнем прерываний может быть связано несколько устройств и соответственно несколько программ — обработчиков прерываний.

§ при возникновении прерывания процессор должен определить, какое устройство из тех, которые связаны с данным уровнем прерываний, действительно запросило прерывание. Это достигается вызовом всех обработчиков прерываний для данного уровня приоритета, пока один из обработчиков не подтвердит, что прерывание пришло от обслуживаемого им устройства. Если же с каждым уровнем прерываний связано только одно устройство, то определение нужной программы обработки прерывания происходит немедленно, как и при векторном прерывании. Опрашиваемые прерывания поддерживают шины ISA, EISA, MCA, PCI и Sbus.

Механизм прерываний некоторой аппаратной платформы может сочетать векторный и опрашиваемый типы прерываний.

Типичным примером такой реализации является платформа персональных компьютеров на основе процессоров Intel Pentium. Шины PCI, ISA, EISA или MCA, используемые в этой платформе в качестве шин подключения внешних устройств, поддерживают механизм опрашиваемых прерываний. Контроллеры периферийных устройств выставляют на шину не вектор, а сигнал запроса прерывания определенного уровня IRQ. Однако в процессоре Pentium система прерываний является векторной. Вектор прерываний в процессор Pentium поставляет контроллер прерываний, который отображает поступающий от шины сигнал IRQ на определенный номер вектора.

В том случае, когда к каждой линии IRQ подключается только одно устройство, процедура обработки прерываний работает так, как если бы система прерываний была чисто векторной, то есть процедура не выполняет никаких дополнительных опросов для выяснения того, какое именно устройство запросило прерывание.

Однако при совместном использовании одного уровня IRQ несколькими устройствами программа обработки прерываний должна работать в соответствии со схемой опрашиваемых прерываний, то есть дополнительно выполнить опрос всех устройств, подключенных к данному уровню IRQ.

Ø Механизм прерываний чаще всего поддерживает приоритезацию и маскирование прерываний.

Приоритезация означает, что все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание.

Приоритеты могут обслуживаться как относительные и абсолютные.

Обслуживание запросов прерываний по схеме с относительными приоритетами заключается в том,

o что при одновременном поступлении запросов прерываний из разных классов выбирается запрос, имеющий высший приоритет.

o однако в дальнейшем при обслуживании этого запроса процедура обработки прерывания уже не откладывается даже в том случае, когда появляются более приоритетные запросы — решение о выборе нового запроса принимается только в момент завершения обслуживания очередного прерывания.

o если же более приоритетным прерываниям разрешается приостанавливать работу процедур обслуживания менее приоритетных прерываний, то это означает, что работает схема приоритезации с абсолютными приоритетами.

Если процессор (или компьютер, когда поддержка приоритезации прерываний вынесена во внешний по отношению к процессору блок) :

o он поддерживает в одном из своих внутренних регистров переменную, фиксирующую уровень приоритета обслуживаемого в данный момент прерывания.

o при поступлении запроса из определенного класса его приоритет сравнивается с текущим приоритетом процессора, и если приоритет запроса выше, то текущая процедура обработки прерываний вытесняется, а по завершении обслуживания нового прерывания происходит возврат к прерванной процедуре.

Упорядоченное обслуживание запросов прерываний наряду со схемами приоритетной обработки запросов может выполняться механизмом маскирования запросов.

o В схеме абсолютных приоритетов выполняется маскирование — при обслуживании некоторого запроса все запросы с равным или более низким приоритетом маскируются, то есть не обслуживаются.

o Схема маскирования предполагает возможность временного маскирования прерываний любого класса независимо от уровня приоритета.

Обобщенно последовательность действий аппаратных и программных средств по обработке прерывания можно описать следующим образом.

1. При возникновении сигнала (для аппаратных прерываний) или условия (для внутренних прерываний) прерывания происходит первичное аппаратное распознавание типа прерывания. Если прерывания данного типа в настоящий момент запрещены (приоритетной схемой или механизмом маскирования), то процессор продолжает поддерживать естественный ход выполнения команд. В противном случае в зависимости от поступившей в процессор информации (уровень прерывания, вектор прерывания или тип условия внутреннего прерывания) происходит автоматический вызов процедуры обработки прерывания, адрес которой находится в специальной таблице операционной системы, размещаемой либо в регистрах процессора, либо в определенном месте оперативной памяти.

2. Автоматически сохраняется некоторая часть контекста прерванного потока, которая позволит ядру возобновить исполнение потока процесса после обработки прерывания. В это подмножество обычно включаются значения счетчика команд, слова состояния машины, хранящего признаки основных режимов работы процессора (пример такого слова — регистр EFLA6S в Intel Pentium), а также нескольких регистров общего назначения, которые требуются программе обработки прерывания. Может быть сохранен и полный контекст процесса, если ОС обслуживает данное прерывание со сменой процесса. Однако в общем случае это не обязательно, часто обработка прерываний выполняется без вытеснения текущего процесса1.

1 Решение о перепланировании процессов может быть принято в ходе обработки прерывания, например, если это прерывание от таймера и после наращивания значения системных часов выясняется, что процесс исчерпал выделенный ему квант времени. Однако это совсем не обязательно — прерывание может выполняться и без смены процесса, например прием очередной порции данных от контроллера внешнего устройства чаще всего происходит в рамках текущего процесса, хотя данные, скорее всего, предназначены другому процессу.

3. Одновременно с загрузкой адреса процедуры обработки прерываний в счетчик команд может автоматически выполняться загрузка нового значения слова состояния машины (или другой системной структуры, например селектора кодового сегмента в процессоре Pentium), которое определяет режимы работы процессора при обработке прерывания, в том числе работу в привилегированном режиме. В некоторых моделях процессоров переход в привилегированный режим за счет смены состояния машины при обработке прерывания является единственным способом смены режима. Прерывания практически во всех мультипрограммных ОС обрабатываются в привилегированном режиме модулями ядра, так как при этом обычно нужно выполнить ряд критических операций, от которых зависит жизнеспособность системы, — управлять внешними устройствами, перепланировать потоки и т. п.

4. Временно запрещаются прерывания данного типа, чтобы не образовалась очередь вложенных друг в друга потоков одной и той же процедуры. Детали выполнения этой операции зависят от особенностей аппаратной платформы, например может использоваться механизм маскирования прерываний. Многие процессоры автоматически устанавливают признак запрета прерываний в начале цикла обработки прерывания, в противном случае это делает программа обработки прерываний.

5. После того как прерывание обработано ядром операционной системы, прерванный контекст восстанавливается и работа потока возобновляется с прерванного места. Часть контекста восстанавливается аппаратно по команде возврата из прерываний (например, адрес следующей команды и слово состояния машины), а часть — программным способом, с помощью явных команд извлечения данных из стека. При возврате из прерывания блокировка повторных прерываний данного типа снимается.

Программные прерывания

Ø Программное прерывание реализует один из способов перехода на подпрограмму с помощью специальной инструкции процессора, такой как INT в процессорах Intel Pentium, trap в процессорах Motorola, syscall в процессорах MIPS или Ticc в процессорах SPARC.

Ø При выполнении команды программного прерывания процессор отрабатывает ту же последовательность действий, что и при возникновении внешнего или внутреннего прерывания, но только происходит это в предсказуемой точке программы — там, где программист поместил данную команду.

Ø Практически все современные процессоры имеют в системе команд инструкции программных прерываний.

Одной из причин появления инструкций программных прерываний в системе команд процессоров является то, что их использование часто приводит к более компактному коду программ по сравнению с использованием стандартных команд выполнения процедур.

Это объясняется тем, что разработчики процессора обычно резервируют для обработки прерываний небольшое число возможных подпрограмм, так что длина операнда в команде программного прерывания, который указывает на нужную подпрограмму, меньше, чем в команде перехода на подпрограмму.

Например, в процессоре х86 предусмотрена возможность применения 256 программ обработки прерываний, поэтому в инструкции INT операнд имеет длину в один байт (а инструкция INT 3, которая предназначена для вызова отладчика, вся имеет длину один байт). Значение операнда команды INT просто является индексом в таблице из 256 адресов подпрограмм обработки прерываний, один из которых и используется для перехода по команде INT. При использовании команды CALL потребовался бы уже не однобайтовый, а двух- или четырехбайтовый операнд. Другой причиной применения программных прерываний вместо обычных инструкций вызова подпрограмм является возможность смены пользовательского режима на привилегированный одновременно с вызовом процедуры — это свойство программных прерываний поддерживается большинством процессоров.

В результате программные прерывания часто используются для выполнения ограниченного количества вызовов функций ядра операционной системы, то есть системных вызовов.

Руссинович Марк. 1.Внутреннее устройство Windows (гл. 1-4)

dt nt!_ktrap_frame.Программное прерывание ядро обслуживает либо при обработке аппаратного прерывания, либо синхронно — при вызове потоком функции ядра, относящейся к данному программному прерыванию.
   B большинстве случаев ядро устанавливает функции, выполняющие общую обработку ловушек до и после передачи управления другим функциям, которые ставят ловушки. Например, когда устройство генерирует прерывание, обработчик ловушек аппаратных прерываний (принадлежащий ядру) передает управление процедуре обслуживания прерывания(interrupt service routine, ISR), предоставленной драйвером соответствующего устройства. Если прерывание возникло в результате вызова системного сервиса, обработчик ловушек общесистемных сервисов передает управление функции указанного системного сервиса в исполнительной системе. Ядро также устанавливает обработчики для ловушек, которые оно не ожидает или не обрабатывает. Эти обработчики, как правило, выполняют системную функцию KeBugCheckEx.Она останавливает компьютер, если ядро обнаруживает в работе системы отклонения, способные привести к повреждению данных (подробнее об этом см. главу 14). Диспетчеризация прерываний, исключений и системных сервисов детальнее описывается в следующих разделах.
 
Диспетчеризация прерываний
 
   Аппаратные прерывания обычно генерируются устройствами ввода-вывода, которые таким образом уведомляют процессор о необходимости уделить им внимание. Устройства, управляемые на основе прерываний, позволяют операционной системе максимально полно использовать процессор, совмещая основную обработку с обслуживанием ввода-вывода. Выдав запрос на ввод-вывод, поток может заняться другой работой, пока устройство выполняет запрошенную операцию. Закончив, устройство генерирует прерывание, и процессор переключается на обслуживание этого устройства. Прерываниями управляются, как правило, координатные устройства, принтеры, клавиатуры, дисковые устройства и сетевые платы.
   Системное программное обеспечение также может генерировать прерывания. Ядро способно отключать прерывания, чтобы не прерывать работу процессора, однако это делается нечасто — только в критические моменты, например при обработке прерываний или диспетчеризации исключения.
   Для обработки аппаратных прерываний ядро устанавливает обработчики ловушек прерываний, которые передают управление внешней процедуре (ISR), обрабатывающей прерывание, или внутренней процедуре ядра, реагирующей на прерывание. Драйверы устройств предоставляют ISR для обслуживания прерываний от своих устройств, а ядро — внутренние процедуры для обработки других типов прерываний.
   Далее мы рассмотрим, как процессор уведомляется об аппаратных прерываниях, какие типы прерываний поддерживаются ядром и как драйверы устройств взаимодействуют с ядром (в процессе обработки прерываний). Кроме того, мы поговорим о распознавании ядром программных прерываний и об объектах, используемых для реализации таких прерываний.
 
Обработка аппаратных прерываний
 
   Ha аппаратных платформах, поддерживаемых Windows, прерывания, связанные с внешним вводом-выводом, поступают по одной из линий контроллера прерываний. Контроллер в свою очередь связан с процессором единственной линией, по которой и уведомляет о прерывании. Как только процессор прерывается, он требует от контроллера запрос прерывания (interrupt request, IRQ). Контроллер транслирует IRQ в номер прерывания, используемый как индекс в структуре, называемой таблицей диспетчеризации прерываний(interrupt dispatch table, IDT), и передает управление соответствующей процедуре. При загрузке Windows заносит в IDT указатели на процедуры ядра, обрабатывающие каждое прерывание и исключение.
 
    ЭКСПЕРИМЕНТ: просмотр IDT
   Просмотреть содержимое IDT, включая сведения об обработчиках ловушек, которые Windows назначила прерываниям, можно с помощью команды !idtотладчика ядра. Команда !idtбез флагов показывает векторы, которые сопоставлены с адресами в модулях, отличных от Ntoskrnl.exe.
   Ниже показано, что выводит команда !idt.
   B системе, задействованной в этом эксперименте, номер прерывания 0x3C — с ISR драйвера клавиатуры (I8042prt.sys), а прерывание 0x3B совместно используется несколькими устройствами, в том числе видеоадаптером, шиной PCMCIA, портами USB и IEEE 1394, а также сетевым адаптером.
   Windows увязывает аппаратные IRQ с номерами прерываний в IDT. Эта таблица используется системой и при конфигурировании обработчиков ловушек для исключений. Так, номер исключения для ошибки страницы на x86 и x64 (это исключение возникает, когда поток пытается получить доступ к отсутствующей или не определенной в виртуальной памяти странице) равен 0xe. Следовательно, запись 0xe в IDT указывает на системный обработчик ошибок страниц. Хотя архитектуры, поддерживаемые Windows, допус-каютдо 256 элементов в IDT, число IRQ на конкретной машине определяется архитектурой используемого в ней контроллера прерываний.
   У каждого процессора имеется своя IDT, так что разные процессоры могут при необходимости выполнять разные ISR. Например, в многопроцессорной системе каждый процессор получает прерывания системного таймера, но обновление значения системного таймера в результате обработки этого прерывания осуществляется только одним процессором. Однако все процессоры используют это прерывание для измерения кванта времени, выделенного потоку, и для инициации новой процедуры планирования по истечении этого кванта. Аналогичным образом в некоторых конфигурациях может понадобиться, чтобы определенные аппаратные прерывания обрабатывал конкретный процессор.
 
Контроллеры прерываний на платформе x86
 
   B большинстве систем x86 применяется либо программируемый контроллер прерываний (Programmable Interrupt Controller, PIC) i8259A, либо его разновидность, усовершенствованный программируемый контроллер прерываний (Advanced Programmable Interrupt Controller, APIC) i82489. Новые компьютеры, как правило, оснащаются APIC Стандарт PIC был разработан для оригинальных IBM PC PIC работает только в однопроцессорных системах и имеет 15 линий прерываний. APIC и SAPIC (о нем чуть позже) способен работать в многопроцессорных системах и предлагает 256 линий прерываний. Intel совместно с другими компаниями создали спецификацию Multiprocessor (MP) Specification, стандарт для многопроцессорных систем x86, основанный на использовании APIC Для совместимости с однопроцессорными операционными системами и загрузочным кодом, запускающим многопроцессорную систему в однопроцессорном режиме, APIC поддерживает PIC-совместимый режим с 15 линиями прерываний и передачей прерываний лишь главному процессору. Архитектура APIC показана на рис. 3-2. Ha самом деле APIC состоит из нескольких компонентов: APIC ввода-вывода, принимающего прерывания от устройств, локальных APIC, принимающих прерывания от APIC ввода-вывода по выделенной шине и прерывающих pa-ботутого процессора, с которым они связаны, а также 18259А-совместимого контроллера прерываний, транслирующего входные сигналы APIC в соответствующие PIC-эквиваленты. APIC ввода-вывода отвечает за реализацию алгоритмов перенаправления прерываний, и операционная система выбирает нужный ей алгоритм (в Windows выбор возлагается на HAL). Эти алгоритмы равномерно распределяют между процессорами нагрузку, связанную с обработкой прерываний от устройств, и в максимальной мере используют все преимущества локальности, направляя такие прерывания процессору, который только что обрабатывал прерывания аналогичного типа.
 
Контроллеры прерываний на платформе x64
 
   Поскольку архитектура x64 совместима с операционными системами для x86, системы на базе x64 должны предоставлять те же контроллеры прерываний, что и на базе x86. Однако х64-версии Windows не будут работать на системах без APIC (т. е. они не поддерживают PIC).
 
Контроллеры прерываний на платформе IA64
 
   B архитектуре IA64 используется контроллер прерываний Streamlined Advanced Programmable Interrupt Controller (SAPIC) — результат эволюционного развития APIC Главное различие между архитектурами APIC и SAPIC в том, что APIC ввода-вывода в APIC-системе направляет прерывания локальным APIC по выделенной шине APIC, тогда как в системе SAPIC прерывания передаются по шине ввода-вывода и системы (I/O and system bus) для большего быстродействия. Еще одно различие — перенаправление прерываний и балансировка нагрузки в APIC-системе обрабатывается самой шиной APIC, а в SAPIC-системе, где нет выделенной шины APIC, требуется, чтобы соответствующая поддержка была запрограммирована в микрокоде (прошивке). Ho, даже если эта поддержка имеется в микрокоде, Windows не использует ее — вместо этого она статически назначает прерывания процессорам по принципу карусели.
 
    ЭКСПЕРИМЕНТ: просмотр конфигурации PIC и APIC
   Конфигурацию PIC в однопроцессорной системе и APIC в многопроцессорной системе можно просмотреть с помощью команд !picили !apicотладчика ядра. (Для этого эксперимента LiveKd не годится, так как она не может напрямую обращаться к оборудованию.) Ниже показан образец вывода команды !picв однопроцессорной системе (учтите, что команда !picне работает в системе, использующей APIC HAL).
   Ha следующем листинге приводится выходная информация команды !apicв системе, использующей MPS HAL. Префикс «0:» в командной строке отладчика говорит о том, что текущие команды выполняются на процессоре 0, поэтому данный листинг относится к APIC ввода-вывода процессора 0.
   Теперь взгляните на образец вывода команды !ioapic,показывающей конфигурацию APIC ввода-вывода:
    Уровни запросов программных прерываний
   Хотя контроллеры прерываний различают уровни приоритетов прерываний, Windows использует свою схему приоритетов прерываний, известную под названием уровни запросов прерываний(interrupt request levels, IRQL). Внутри ядра IRQL представляются в виде номеров 0-31 в системах x86 и 0-15 в системах x64 и IA64, причем больший номер соответствует прерыванию с более высоким приоритетом. Ядро определяет стандартный набор IRQL для программных прерываний, a HAL увязывает IRQL с номерами аппаратных прерываний. IRQL, определенные для архитектуры x86, показаны на рис. 3-3, а аналогичные сведения для архитектур x64 и IA64 — на рис. 3-4.
 
    ПРИМЕЧАНИЕ Уровень SYNCH_LEVEL, используемый многопроцессорными версиями ядра для защиты доступа к индивидуальным для каждого процессора блокам PRCB (processor control blocks), не показан на этих схемах, так как его значение варьируется в разных версиях Windows. Описание SYNCH_LEVEL и его возможных значений см. в главе 6.
 
    Рис. 3-4. Уровни запросов прерываний (IRQL) в системах x64 и IA64
   Прерывания обслуживаются в порядке их приоритета, и прерывания с более высоким приоритетом вытесняют обработку прерываний с меньшим приоритетом. При возникновении прерывания с высоким приоритетом процессор сохраняет информацию о состоянии прерванного потока и активизирует сопоставленный с данным прерыванием диспетчер ловушки. Последний повышает IRQL и вызывает процедуру обслуживания прерывания (ISR). После выполнения ISR диспетчер прерывания понижает IRQL процессора до исходного уровня и загружает сохраненные ранее данные о состоянии машины. Прерванный поток возобновляется с той точки, где он был прерван. Когда ядро понижает IRQL, могут «материализоваться» ранее замаскированные прерывания с более низким приоритетом. Тогда вышеописанный процесс повторяется ядром для обработки и этих прерываний.
   Уровни приоритетов IRQL имеют совершенно иной смысл, чем приоритеты в схеме планирования потоков (см. главу 6). Приоритет в этой схеме является атрибутом потока, тогда как IRQL — атрибутом источника прерывания, например клавиатуры или мыши. Кроме того, IRQL каждого процессора меняется во время выполнения команд операционной системы.
   Значение IRQL определяет, какие прерывания может получать данный процессор. IRQL также используется для синхронизации доступа к структурам данных режима ядра (о синхронизации мы поговорим позже). При выполнении поток режима ядра повышает или понижает IRQL процессора либо напрямую (вызовом соответственно KeRaiseIrqlили KeLowerIrqL),либо — что бывает гораздо чаще — опосредованно (через функции, которые обращаются к синхронизирующим объектам ядра). Как показано на рис. 3-5 ,прерывания от источника с IRQL, превышающим текущий уровень, прерывают работу процессора, а прерывания от источников, IRQL которых меньше или равен текущему уровню ,маскируютсядо тех пор, пока выполняемый поток не понизит IRQL.
   Поскольку доступ к PIC — операция довольно медленная, в HAL, использующих PIC, реализован механизм оптимизации «отложенный IRQL» (lazy IRQL), который избегает обращений к PIC Когда IRQL повышается, HAL — вместо того чтобы изменять маску прерывания — просто отмечает новый IRQL. Если вслед за этим возникает прерывание с более низким приоритетом, HAL устанавливает маску прерывания в соответствии с первым и откладывает обработку прерывания с более низким приоритетом до понижения IRQL. Таким образом, если при повышенном IRQL не возникнет прерываний с более низким приоритетом, HAL не потребуется обращаться к PIC.
   Поток режима ядра повышает и понижает IRQL процессора, на котором он выполняется, в зависимости от того, что именно делает этот поток. Например, обработчик ловушки (или сам процессор) при прерывании повышает IRQL процессора до IRQL источника прерывания. B результате все прерывания с более низким или равным IRQL маскируются (только на этом процессоре), что не дает прерыванию с таким же или более низким IRQL помешать процессору обработать текущее прерывание. Замаскированные прерывания либо обрабатываются другим процессором, либо откладываются до понижения IRQL. Поэтому все системные компоненты, в том числе ядро и драйверы устройств, пытаются удерживать IRQL на уровне passive («пассивный»), иногда называемом низким уровнем. Если бы IRQL долго оставался неоправданно высоким, драйверы устройств не смогли бы оперативно реагировать на аппаратные прерывания.
 
    ПРИМЕЧАНИЕ Прерывания APC_LEVEL являются исключением из правила, которое гласит, что повышение IRQL блокирует прерывания такого же уровня и ниже. Если поток повышает IRQL до уровня APC_ LEVEL, а затем отключается от процессора из-за появления прерывания DISPATCH_LEVEL, то система может доставить ему прерывание APC_LEVEL, как только он вновь получит процессорное время. Таким образом, APC_LEVEL можно считать IRQL, локальным для потока.
 
    ЭКСПЕРИМЕНТ: определяем IRQL
   Если вы работаете с отладчиком ядра в Windows Server 2003, то можете определить IRQL процессора командой !irql:
    kd› !irql
    Debugger saved IRQL for processor 0x0 — 0 (L0W_LEVEL)
   Заметьте, что в структуре данных, называемой PCR (processor control region), и ее расширении — PRCB (processor control block) имеется поле с именем Irql. Эти структуры содержат информацию о состоянии каждого процессора в системе, в том числе текущий IRQL, указатель на аппаратную IDT, сведения о текущем потоке и потоке, который будет выполняться следующим. Ядро и HAL используют эту информацию для выполнения операций, специфичных для данной машины и ее архитектуры. Отдельные части структур PCR и PRCB открыто определены в заголовочном файле Ntddk.h (в Windows DDK). Загляните в него, чтобы получить представление об этих структурах.
   Для просмотра содержимого PCR воспользуемся командой !pcrотладчика ядра.
   K сожалению, Windows не поддерживает поле Irql на платформах, не использующих отложенные IRQL, поэтому в большинстве систем это поле всегда содержит 0.
   Так как изменения IRQL процессора существенно влияют на функционирование системы, они возможны только в режиме ядра. Потоки пользовательского режима не могут изменять IRQL процессора. Это значит, что при выполнении потоков пользовательского режима значение IRQL процессора всегда равно passive. Только при выполнении кода режима ядра IRQL может быть выше этого уровня.
   Каждый уровень прерывания имеет определенное назначение. Так, ядро генерирует межпроцессорное прерывание(interprocessor interrupt, IPI), чтобы потребовать выполнения какой-либо операции от другого процессора, например, при диспетчеризации некоего потока или обновлении кэша ассоциативного буфера трансляции [translation look-aside buffer (TLB) cache]. Системный таймер через регулярные промежутки генерирует прерывания, на которые ядро реагирует обновлением системного времени, и это используется для измерения продолжительности выполнения потока. Если аппаратная платформа поддерживает два таймера, то для измерения производительности ядро добавляет еще один уровень прерываний от таймера. HAL поддерживает несколько уровней запросов прерываний для устройств, управляемых прерываниями; конкретное число таких уровней зависит от процессора и конфигурации системы. Ядро использует программные прерывания для инициации планирования потоков и асинхронного вмешательства в выполнение потока.
 
Увязка прерываний с IRQL
 
   Уровни IRQL и запросы прерываний (IRQ) — вещи разные. Концепция IRQL в архитектурах, на которых работает Windows, не реализована аппаратно. Тогда возникает вопрос как Windows определяет, какой IRQL следует присвоить прерыванию? Ответ нужно искать в HAL. B Windows за определение устройств на конкретной шине (PCI, USB и т. д.) и назначение им прерываний отвечают драйверы устройств особого типа — драйверы шин. Драйвер шинысообщает эту информацию диспетчеру Plug and Play, и тот, учитывая приемлемые для других устройств прерывания, принимает решение о конкретных прерываниях, выделяемых каждому устройству. Далее он вызывает HAL-функцию HalpGetSystemInterruptVector,которая увязывает прерывания со значениями IRQL.
   Этот алгоритм неодинаков в различных версиях HAL. B однопроцессорных х86-системах HAL выполняет прямую трансляцию: IRQL данного вектора прерывания вычисляется путем вычитания значения вектора из 27. Таким образом, если устройство использует 5-й вектор прерывания, его ISR выполняется при IRQL, равном 22. B многопроцессорной х86-системе преобразования более сложны. APIC поддерживает более 200 векторов прерываний, поэтому при трансляции «один в один» имеющихся IRQL окажется недостаточно. Многопроцессорная версия HAL присваивает IRQL векторам прерываний, циклически перебирая значения из диапазона IRQL устройств (device IRQL, DIRQL). B итоге на многопроцессорной х86-системе не так-то просто предсказать или выяснить IRQL, назначаемый IRQ. Наконец, в x64- и IА64-системах HAL вычисляет IRQL для IRQ путем деления вектора прерывания, назначенного данному IRQ, на 16.
 
Предопределенные IRQL
 
   Давайте повнимательнее приглядимся к предопределенным IRQL, начиная с самого верхнего уровня схемы, представленной на рис. 3-5.
    (o)Уровень «high» (высокий) используется ядром, только если оно останавливает систему в функции KeBugCheckExи маскирует все прерывания.
    (o)Уровень «power fail» (отказ электропитания) был заложен еще в самый первый проект Microsoft Windows NT Он определяет поведение системы при отказе электропитания, но никогда не применялся.
    (o)Уровень «interprocessor interrupt» (межпроцессорное прерывание) используется для того, чтобы запрашивать от другого процессора выполнение какой-либо операции, например, при постановке в очередь прерывания DISPATCH_EVEL для планирования конкретного потока к выполнению, при обновлении кэша TLB, завершении работы или крахе системы.
    (o)Уровень «clock» (часы) используется для системных часов, с помощью которых ядро отслеживает время суток, измеряет и распределяет процессорное время между потоками.
    (o)Уровень «profile» (профиль) используется системным таймером реального времени, если активизирован механизм профилирования ядра (kernel profiling), т. е. измерения его производительности. Когда он активен, обработчик ловушки профилирования регистрирует адрес команды, выполнявшейся на момент прерывания. Co временем создается таблица адресов, которую можно извлечь и проанализировать с помощью соответствующих утилит. Вы можете скачать утилиту Kernrate ,позволяющую просматривать статистику, полученную при использовании механизма профилирования ядра. Подробнее об этой утилите см. описание эксперимента с Kernrate.
    (o)Уровень «device» (устройство) применяется для задания приоритетов прерываний от устройств (о принципах увязки аппаратных прерываний с IRQL см. предыдущий раздел).
    (o)Прерывания уровней «DPC/dispatch» и «APC» являются программными; они генерируются ядром и драйверами устройств (о DPC и APC будет рассказано позже).
    (o)Самый низкий уровень IRQL, «passive» (пассивный), на самом деле вообще не является уровнем прерывания. При этом значении IRQL потоки выполняются обычным образом и могут возникать любые прерывания.
 
    ЭКСПЕРИМЕНТ: применение утилиты Kernrate
   Утилита профилирования ядра (Kernrate) позволяет включать таймер профилирования системы, собирать образцы кода, выполняемого при срабатывании таймера, и выводить сводную информацию, отражающую распределение процессорного времени по образам файлов и функциям. Ee можно использовать для отслеживания процессорного времени, потребляемого индивидуальными процессами, и/или времени, проведенного в режиме ядра независимо от процессов (например, для выполнения процедур обслуживания прерываний). Профилирование ядра полезно, когда вы хотите выявить точки, в которых на выполнение кода тратится больше всего процессорного времени.
   B своей простейшей форме Kernrate сообщает, сколько процессорного времени было использовано каждым модулем ядра (Ntoskrnl, драйверами и т.д.). Попробуйте, к примеру, выполнить следующие операции.
 
   1. Откройте окно командной строки.
   2. Введите cd c:\program files\krview\kernrates.
   3. Введите dir.(Вы увидите образы kernrate для каждой платформы.)
   4. Запустите образ, который подходит для вашей платформы (без аргументов или ключей). Например, Kernrate_i386_XP.exe — это образ для Windows XP на платформе x86.
   5. Пока Kernrate выполняется, поделайте что-нибудь в системе. Скажем, запустите Windows Media Player и проиграйте музыку, запустите игру, интенсивно работающую с графикой, или перечислите содержимое каталога на удаленном сетевом ресурсе.
   6. Нажмите Ctrl+C, чтобы остановить Kernrate. Это заставит Kernrate вывести статистику за прошедший период.
   Ниже приведена часть вывода Kernrate, когда выполнялся Windows Media Player, воспроизводивший дорожку с компакт-диска.
   Сводные данные показывают, что система провела 11,7% времени в режиме ядра, 30,2% в пользовательском режиме, 58,1% в простое, 6,4% на уровне DPC и 1,3% на уровне прерываний (interrupt level). Модуль, чаще всего требовавший к себе внимания, был GV3.SYS, драйвер процессора для Pentium M (семейства Geyserville). Он используется для сбора информации о производительности, поэтому и оказался на первом месте. Модуль, занявший второе место, — Smwdm.sys, драйвер звуковой платы на компьютере, где проводился тест. Это вполне объяснимо, учитывая, что основную нагрузку в системе создавал Windows Media Player, посылавший звуковой ввод-вывод этому драйверу.
   Если у вас есть файлы символов, вы можете исследовать индивидуальные модули и посмотреть, сколько времени было затрачено каждой из их функций. Например, профилирование системы в процессе быстрого перемещения окна по экрану давало такой вывод (здесь приведена лишь его часть):
    C:\Program Files\KrView\Kernrates›Kernrate_i386_XP.exe -z ntoskrnl -z win32k
 
   B данном случае самым «прожорливым» был модуль Win32k.sys, драйвер системы, отвечающей за работу с окнами. Второй в списке — видеодрайвер. И действительно, основная нагрузка в системе была связана с рисованием окна на экране. B детальном выводе для Win32k.sys видно, что наиболее активна была его функция EngPaint, основная GDI-функция для рисования на экране.
   Ha код, выполняемый на уровне «DPC/dispatch» и выше, накладывается важное ограничение: он не может ждать освобождения объекта, если такое ожидание заставило бы планировщик подключить к процессору другой поток (а это недопустимая операция, так как планировщик синхронизирует свои структуры данных на уровне «DPC/dispatch» и, следовательно, не может быть активизирован для выполнения перераспределения процессорного времени). Другое ограничение заключается в том, что при уровне IRQL «DPC/ dispatch» или выше доступна только неподкачиваемая память. Ha самом деле второе ограничение является следствием первого, так как обращение к отсутствующей в оперативной памяти странице вызывает ошибку страницы. Тогда диспетчер памяти должен был бы инициировать операцию дискового ввода-вывода, после чего ждать, когда драйвер файловой системы загрузит эту страницу с диска. Это в свою очередь вынудило бы планировщик переключить контекст (возможно, на поток простоя, если нет ни одного пользовательского потока, ждущего выполнения). B результате было бы нарушено правило, запрещающее вызов планировщика в таких ситуациях (поскольку при чтении с диска IRQL все еще остается на уровне «DPC/dispatch» или выше). При нарушении любого из этих двух ограничений происходит крах системы с кодом завершения IRQL_NOT_LESS_OR_EQUAL (подробнее о кодах завершения при крахе системы см. главу 4). Кстати, нарушение этих ограничений является довольно распространенной ошибкой в драйверах устройств. Локализовать причину ошибок такого типа помогает утилита Driver Verifier, о которой будет подробно рассказано в разделе «Утилита Driver Verifier» главы 7.
 
Объекты «прерывание» (interrupt objects)
 
   Ядро предоставляет переносимый (портируемый) механизм — объект прерывания, позволяющий драйверам устройств регистрировать ISR для своих устройств. Этот объект содержит всю информацию, необходимую ядру для назначения конкретного уровня прерывания для ISR устройства, включая адрес ISR, IRQL устройства и запись в IDT ядра, с которой должна быть сопоставлена ISR. При инициализации в объект прерывания из шаблона обработки прерываний, KiIn-terruptTemplate, копируется несколько ассемблерных инструкций — код диспетчеризации. Этот код выполняется при возникновении прерывания.

Какие программные и аппаратные прерывания, и как они обрабатываются?

Аппаратное прерывание не является частью многозадачности процессора, но может им управлять.

  1. Аппаратные прерывания выдаются аппаратных устройств, таких как диск, сетевые карты, клавиатуры, часы и т. д. Каждое устройство или набор устройств будет иметь свои собственные прерывания IRQ (запрос на прерывание) линии. На основе прерываний процессор обработает запрос соответствующему драйверу оборудования. (Драйверы устройств, как правило, подпрограммы в ядре, а не отдельного процесса.)

  2. Водитель, который обрабатывает прерывание выполняется на ЦП. Процессор прерывается от того, что он делал для обработки прерываний, так что ничего дополнительного не требуется, чтобы получить ЦП’s внимание. При работе в многопроцессорных системах прерывания обычно только прервать один из процессоров. (В особых случаях мэйнфреймы имеют аппаратные каналы, которые могут работать с несколькими прерываниями без поддержки от центрального процессора.)

  3. Аппаратных прерываний, прерываний процессора напрямую. Это вызовет соответствующий код в процесс ядра должна быть включена. Для процессов, что потребуется некоторое время, чтобы процесс, код прерывания может позволить себе быть прервана другими аппаратными прерываниями.

В случае прерывания таймера, код планировщика ядра может приостановить процесс, который был запущен и разрешить другой процесс для выполнения. Это наличие кода планировщика, который позволяет многозадачность.

Программные прерывания обрабатываются много, как аппаратных прерываний. Однако, они могут быть созданы только процессы, которые запущены в данный момент.

  1. Как правило, программные прерывания и запросы на ввод-вывод (ввод или вывод). Это вызов подпрограммы ядра, который будет планировать ввода-вывода происходит. Для некоторых устройств ввода/вывода будет сделано сразу же, но дисковые операции ввода/вывода обычно очереди и сделано в более позднее время. В зависимости от ввода-вывода выполняется, процесс может быть приостановлено до разрешения ввода-вывода завершается, вызывая планировщик ядра, чтобы выбрать другой процесс для выполнения. Ввода-вывода может происходить между процессами и обработки, как правило, планируется таким же образом, как дисковый ввод-вывод.

  2. Программное обеспечение прервать переговоры только для ядра. Это ответственность ядру расписание любых других процессов, которые нужно выполнить. Это может быть другой процесс на конце трубы. Некоторые ядра разрешение некоторых частях драйвера устройства, чтобы существовать в пространстве пользователя и ядре будет запланировать этот процесс запустить при необходимости.

Это правильно, что программное прерывание не’т прямо прерывание процессора. Только код, который выполняется в данный момент код может генерировать прерывание. Прерывание является запросом к ядру что-то делать (обычно ввода/вывода) для запуска процесса. Специального программного прерывания является выходом вызов, который просит планировщик ядра, чтобы проверить, если какие-то другие процессы могут выполняться.

Ответ на комментарий:

  1. Для запросов ввода-вывода, делегаты ядра работу соответствующего драйвера ядра. Процедура может очереди ввода/вывода для последующей обработки (общий для дискового ввода/вывода), или немедленно исполнить его, если это возможно. Очередь обрабатывается водитель, часто отвечая на аппаратные прерывания. Когда одну операцию ввода-вывода завершается, следующий элемент в очереди отправляется на устройство.

  2. Да, программные прерывания избежать оборудования СЦБ шаг. Процесс генерации запроса на программное обеспечение должно быть запущенного процесса, поэтому они не’т прерываний процессора. Тем не менее, они прерывают поток вызывающего кода.

Если оборудование необходимо вам процессор, чтобы делать что-то, она заставляет процессор прервать свое внимание на код он работает. Процессор будет толкать его текущего состояния в стеке, так что позже можете вернуться к тому, что он делает. Прерывание может остановить: работающей программы; код обработки другого прерывания ядра; или простоя процесс.

Как обрабатываются аппаратные прерывания при непередаваемом планировании?



Допустим, у меня есть процесс А, который в данный момент запущен. Затем я нажимаю Ctrl+C, как обрабатывается это прерывание?

Завершается ли выполнение сначала, а затем обрабатывается прерывание?

Разве вам поставили в очередь готовности?

linux asynchronous process linux-kernel operating-system
Поделиться Источник Nicolás Mirón     28 мая 2020 в 16:27

2 ответа


  • Как обрабатываются прерывания на SMP?

    Как обрабатываются прерывания на SMP (симметричных) машинах multiprocessor/multicore)? Существует ли только один блок управления памятью или несколько? Скажем, два потока, A и B, работающие на разных ядрах, касаются страницы памяти (в то же время), которой нет в таблице страниц, и в этом случае…

  • Отключить Аппаратные И Программные Прерывания

    Можно ли отключить все прерывания с помощью программы ASM/C/C++, чтобы получить полный контроль над процессором? Если да — > как? Если нет -> как работают вызовы операционной системы atomic (например, ввод критического раздела)? Спасибо за вашу помощь!



2

Вы путаете прерывания, сигналы и планирование задач. Это все очень разные понятия.

Я нажимаю Ctrl+C, как обрабатывается это прерывание?

CTRL+C не имеет ничего общего с прерываниями. Это комбинация клавиш, которая перехватывается вашим эмулятором terminal, который затем посылает сигнал ( SIGINT ) текущему запущенному процессу. Доставка сигнала осуществляется через kill syscall (который, вопреки своему названию, не обязательно убивает процесс).

Завершается ли выполнение сначала, а затем обрабатывается прерывание?

Что происходит, когда ваша программа получает сигнал SIGINT , зависит от конкретного случая. Программа может зарегистрировать обработчик сигнала и решить , что делать, если она получает определенный сигнал. Другими словами, это «interruption», как вы его называете, происходит во время выполнения процесса : когда сигнал будет доставлен, kernel временно «pause» будет обычным кодом процесса, позволит процессу запустить свой обработчик сигнала, а затем возобновит процесс с того места, где он ушел.

Процесс может регистрировать обработчики только для улавливаемых сигналов ( SIGINT is). Единственные два сигнала, которые не улавливаются в Linux, — это SIGKILL и SIGSTOP . В случае, если процесс не зарегистрировал обработчик сигнала , обработчик по умолчанию, определенный kernel, выполнит свою работу: для SIGINT обработчик по умолчанию просто завершает процесс.

Дополнительную информацию смотрите в разделе man 7 signal.

Разве вам поставили в очередь готовности?

Нет такой вещи, как «готовая очередь», я полагаю, вы имеете в виду runqueue . Если процесс будет убит сигналом, то он перестанет существовать и будет удален из своей очереди выполнения, поэтому ни одна очередь выполнения больше не будет иметь a.

Если процесс не будет завершен, он все еще будет существовать в системе, и kernel будет продолжать выполнять его вместе с другими процессами, которые выполняются на том же CPU. Существует один runqueue на CPU, и планировщик использует его, чтобы определить, какие процессы запускать, когда. Процессы также могут быть перемещены из одной очереди выполнения в другую (например, для целей балансировки нагрузки), но это уже другая тема.

Поделиться Marco Bonelli     28 мая 2020 в 18:33



1

В x86 прерывания отключаются и включаются с помощью команд CLI (очистить флаг прерывания) и STI (установить флаг прерывания) соответственно.
Однако на немаскируемые прерывания это не повлияет. Другие прерывания будут обслужены, как только вы снова установите флаг прерывания.

terminal, в котором вы нажимаете Ctrl-C, посылает сигнал INT всем присоединенным к нему процессам («interrupt», SIGINT), который по умолчанию приводит к завершению процесса.

Поделиться Tony Tannous     28 мая 2020 в 16:43


  • Как обрабатываются прерывания двухпроцессорными машинами?

    У меня есть представление о том, как прерывания обрабатываются двухъядерным CPU. Мне было интересно, как обработка прерываний реализуется на плате с более чем одним физическим процессором. Определяется ли какая-либо ответственность за прерывание конфигурацией физической платы? Каждый процессор…

  • Как обрабатываются прерывания в Arduino?

    Я занимаюсь мозговым штурмом приложения, в котором может быть несколько прерываний в секунду из двух разных источников (отдельные прерывания), каждый из которых запускает функцию, которая просто добавляет число к счету. Мне нужен мой void loop() , чтобы выполнить простой анализ с этими данными….


Похожие вопросы:


Флаги управления в подпрограмме прерывания и NMI [8086]

Я знаю, как выполняется процедура прерывания в 8086 году. Мне непонятно, как различные типы прерываний (то есть аппаратные, программные и исключительные) используют управляющие флаги (флаг…


Каковы примеры практического использования флага прерывания процессора x86?

Википедия говорит, что флаг прерывания определяет, будет ли CPU обрабатывать маскируемые аппаратные прерывания. Если флаг установлен в 1, маскируемые аппаратные прерывания будут обрабатываться, если…


Нужно ли сохранять регистр флагов при возникновении прерывания или планировании процесса?

Я знаю, что все общие регистры помещаются в стек, когда происходят прерывания an, но я не вижу никакого кода, который сохранял бы регистр флага. Инструкция assembly, такая как setl, которая зависит…


Как обрабатываются прерывания на SMP?

Как обрабатываются прерывания на SMP (симметричных) машинах multiprocessor/multicore)? Существует ли только один блок управления памятью или несколько? Скажем, два потока, A и B, работающие на…


Отключить Аппаратные И Программные Прерывания

Можно ли отключить все прерывания с помощью программы ASM/C/C++, чтобы получить полный контроль над процессором? Если да — > как? Если нет -> как работают вызовы операционной системы atomic…


Как обрабатываются прерывания двухпроцессорными машинами?

У меня есть представление о том, как прерывания обрабатываются двухъядерным CPU. Мне было интересно, как обработка прерываний реализуется на плате с более чем одним физическим процессором….


Как обрабатываются прерывания в Arduino?

Я занимаюсь мозговым штурмом приложения, в котором может быть несколько прерываний в секунду из двух разных источников (отдельные прерывания), каждый из которых запускает функцию, которая просто…


mono + аппаратные прерывания / сигналы

я работаю на встроенных устройствах, где обычно вы обрабатываете некоторые события прерывания hw с помощью кода c (например, ловите нажатую кнопку или позволяете некоторым LED мигать), мне было…


В каких CPUs и OS случаях мы можем распределить аппаратные прерывания по CPU-ядрам?

В каких CPUs и OS (операционных системах) можно распределить аппаратные прерывания по CPU-ядрам для последовательного их возникновения на разных ядрах, например прерывания от сетевых адаптеров? Как…


Как несколько обработчиков прерываний совместно используют адрес 0x00000018

Я читаю о том, как обрабатываются прерывания в ARM, и узнал, что всякий раз, когда какие-либо аппаратные прерывания приходят, выполняется инструкция по адресу 0x00000018, которая обычно является…

Выполнение программы и прерывания — CodeRoad



Я хотел бы знать, как программа во время ее выполнения может видеть и использовать прерывания. Я читал об уровне, крае, гибриде и типе сообщений прерываний и о том, что устройство посылает импульс для сигнала прерывания, но как программа видит эти прерывания? Или прерывание вообще видно программе? Спасибо за любую помощь в этом

architecture system execution interrupt-handling
Поделиться Источник MNM     07 декабря 2011 в 15:01

2 ответа


  • Прерывания прерывают другие прерывания на Arduino?

    У меня есть Arduino Uno (потрясающее маленькое устройство!). У него есть два прерывания; назовем их 0 и 1 . Я подключаю обработчик к прерыванию 0 и другой к прерыванию 1, используя attachInterrupt() : http://www.arduino.cc/en/Reference/AttachInterrupt . Прерывание 0 срабатывает, и он вызывает свой…

  • LPC1850: почему выполнение программы переходит в 0xFFFFFFFE после прерывания systick?

    Я сделал рабочую программу для LPC1857, которая включает прерывания, и каждое прерывание systick затем вызывает какую-то функцию. Он отлично работает с LPC1857. Когда я пытаюсь запустить ту же программу на LPC1850, выполнение программы переходит к 0xFFFFFFFE и останавливается всякий раз, когда…



2

В общем случае возникновение прерывания заставляет процессор прекратить делать то, что он делал, вспомнить, где он остановился, и перейти к специальному фрагменту кода, который каким-то образом реагирует на него. Аппаратное обеспечение постоянно проверяет наличие прерываний, независимо от того, что еще делает процессор в данный момент. Поэтому он переходит к специальному фрагменту кода, так называемому обработчику прерываний , и после того, как это сделано, он возвращается к тому, что делал раньше. Прерванная программа ничего не замечает.

Адрес, по которому находится обработчик прерываний, зависит от архитектуры процессора и типа прерывания. Иногда требуется, чтобы он находился в фиксированной точке памяти, адрес которой указан в таблице данных для процессора. Чаще всего в памяти по фиксированному адресу имеется специальный массив , называемый таблицей векторов прерываний, в котором хранятся адреса процедур, обрабатывающих прерывания различного рода.

На PC или любой другой чуть более продвинутой электронике обработчики прерываний и таблица векторов прерываний являются частью операционной системы. Вам вообще не нужно беспокоиться о прерываниях, если только вы не пишете OS или не программируете встроенное устройство.

Поделиться lampak     07 декабря 2011 в 15:40



1

Зависит от OS, если таковые имеются. В программах общего назначения ‘desktop’ OS, с которыми мы наиболее знакомы, программы пользовательского режима никогда не должны обрабатывать аппаратные прерывания напрямую. Прерывания от периферийных устройств, таких как клавиатуры, мыши, диски, NIC и т. Д., Обрабатываются драйверами. Обычно поток в ‘program’ вызывает запрос на чтение/запись API, и вызов не возвращается до тех пор, пока запрос не будет завершен — это самое близкое, что программа получает к аппаратному обеспечению. В kernel вызывающий поток блокируется до тех пор, пока адресованный драйвер не подаст сигнал о завершении запрошенного ввода-вывода.

Поделиться Martin James     07 декабря 2011 в 15:19


Похожие вопросы:


нижние половины ksoftirqd в контексте прерывания или процесса?

Я скрупулезно читал книгу под названием Развитие Linux Kernel, написанную Робертом Лавом. В моем понимании, выполнение программных прерываний и tasklets выполняются в контексте прерывания. Кроме…


Сигналы и прерывания при выполнении программы и ее уничтожении

Я хочу лучше понять механизм сигналов и прерываний в ОС UNIX. Насколько я понимаю, прерывания используются для связи между CPU и OS kernel. Сигналы используются для связи между процессами OS kernel…


Как отправить последовательность клавиш прерывания в процесс Java?

У меня есть дескриптор экземпляра процесса Java и связанных с ним потоков. Это консольная программа. Я хотел бы смоделировать последовательность разрыва. На Windows Это Ctrl-C. Возможно ли это без…


Прерывания прерывают другие прерывания на Arduino?

У меня есть Arduino Uno (потрясающее маленькое устройство!). У него есть два прерывания; назовем их 0 и 1 . Я подключаю обработчик к прерыванию 0 и другой к прерыванию 1, используя attachInterrupt()…


LPC1850: почему выполнение программы переходит в 0xFFFFFFFE после прерывания systick?

Я сделал рабочую программу для LPC1857, которая включает прерывания, и каждое прерывание systick затем вызывает какую-то функцию. Он отлично работает с LPC1857. Когда я пытаюсь запустить ту же…


Диспетчер процессоров и прерывания заданий

Это вопрос из моего домашнего задания в классе CIS-21: операционные системы, и у меня уже есть ответ, потому что инструктор дал его нам, но он не хотел объяснять, почему THIS был ответом. Так вот в…


Программные прерывания в C?

Я теоретически понимаю понятия программного прерывания и аппаратных прерываний, но кто-нибудь может привести мне пример программного прерывания и объяснить его ?? Пожалуйста, это было бы большим…


Как проверить, включены ли прерывания в Cortex M3?

На Cortex M3 как фрагмент кода может определить, включены ли прерывания, то есть состояние бита I в регистре состояния программы (как манипулируют cpsid и cpsie )? На более старом ARMs я смог…


Разве отключение прерывания а от прерывания в останавливает его выполнение, не дожидаясь окончания а?

У меня есть ситуация, когда мое прерывание отключено, я считаю, что код прерывания не выполняется до конца. Возможно ли, что в следующем коде variableA и variableB когда-нибудь будут отличаться,…


WindowKeyPressFcn выполняется после прерывания программы

Я хочу обнаружить нажатие клавиши при запуске скрипта matlab в while loop. На данный момент я хочу отобразить только success , после нажатия клавиши. К сожалению, сообщение отображается только после…

типов прерываний | Как обрабатывать прерывания?

Прерывания:

В первые годы развития вычислительной техники процессор должен ждать сигнала для обработки. Таким образом, процессор должен проверять каждое аппаратное и программное обеспечение в системе, есть ли у него какой-либо сигнал для обработки. Этот метод проверки сигнала в системе на обработку называется методом опроса. В этом методе проблема заключается в том, что процессор должен тратить количество тактовых циклов только для проверки сигнала в системе, из-за чего этот процессор будет занят излишне.Если для процесса поступил какой-либо сигнал, процессору потребуется некоторое время для обработки сигнала из-за действующего процесса опроса. Таким образом, производительность системы также будет снижена, и время отклика системы также уменьшится.

Итак, чтобы преодолеть эту проблему, инженеры ввели новый механизм. В этом механизме процессор не будет проверять какой-либо сигнал от аппаратного или программного обеспечения, а вместо этого аппаратное / программное обеспечение будет только отправлять сигнал процессору для обработки. Сигнал от оборудования или программного обеспечения должен иметь наивысший приоритет, поскольку процессор должен покинуть текущий процесс и обработать сигнал оборудования или программного обеспечения.Этот механизм обработки сигнала называется прерыванием системы.

Что такое прерывание?

Прерывание — это сигнал с наивысшим приоритетом от аппаратного или программного обеспечения, процессор которого должен немедленно обработать его сигнал.

Типы прерываний:

Хотя прерывания имеют наивысший приоритет, чем другие сигналы, существует много типов прерываний, но основным типом прерываний является

.
  1. Аппаратные прерывания: Если сигнал для процессора исходит от внешнего устройства или оборудования, это называется аппаратными прерываниями.Пример: с клавиатуры мы нажимаем клавишу, чтобы выполнить какое-либо действие, это нажатие клавиши на клавиатуре генерирует сигнал, который передается процессору для выполнения действия, такие прерывания называются аппаратными прерываниями. Аппаратные прерывания можно разделить на два типа:
    • Маскируемое прерывание: Аппаратные прерывания, которые могут быть отложены, когда для процессора возникло прерывание с наивысшим приоритетом.
    • Немаскируемое прерывание: Аппаратное обеспечение, которое не может быть отложено и должно обрабатываться процессором немедленно.
  2. Программные прерывания: Программные прерывания также можно разделить на два типа. Они есть
    • Нормальные прерывания: прерывания, вызванные программными инструкциями, называются программными инструкциями.
    • Exception: незапланированных прерываний при выполнении программы называется Exception. Например: если при выполнении программы мы получили значение, которое нужно разделить на ноль, это называется исключением.

Классификация прерываний по периодичности возникновения:

  1. Периодическое прерывание: Если прерывания произошли с фиксированным интервалом на временной шкале, то эти прерывания называются периодическими прерываниями
  2. Апериодическое прерывание: Если возникновение прерывания невозможно предсказать, то это прерывание называется апериодическим прерыванием.

Классификация прерываний по временной взаимосвязи с системными часами:

  1. Синхронное прерывание: Источник прерывания находится в фазе с системными часами, это называется синхронным прерыванием. Другими словами, прерывания, зависящие от системных часов. Пример: служба таймера, использующая системные часы.
  2. Асинхронные прерывания: Если прерывания независимы или не совпадают по фазе с системными часами, это называется асинхронным прерыванием.
Обработка прерываний:

Мы знаем, что цикл команд состоит из функций выборки, декодирования, выполнения и чтения / записи. После каждого командного цикла процессор будет проверять наличие прерываний, которые должны быть обработаны, если в системе нет прерывания, он перейдет к следующему командному циклу, который задается регистром команд.

Если присутствует прерывание, то оно запустит обработчик прерывания, обработчик остановит текущую инструкцию, которая обрабатывает, и сохранит ее конфигурацию в регистре, и загрузит программный счетчик прерывания из места, которое задается вектором прерывания. Таблица.После обработки прерывания процессором обработчик прерывания загрузит инструкцию и ее конфигурацию из сохраненного регистра, процесс начнет свою обработку с того места, где он остался. Это сохранение старой конфигурации обработки инструкций и загрузка новой конфигурации прерывания также называется переключением контекста.

Обработчик прерывания также называется подпрограммой обслуживания прерывания (ISR). Существуют разные типы обработчиков прерываний, которые будут обрабатывать разные прерывания.Например, для часов в системе будет свой обработчик прерываний, у клавиатуры будет свой обработчик прерывания для каждого устройства, у которого будет свой обработчик прерывания.

Основные характеристики ISR:

  • Прерывания могут возникать в любое время, они являются асинхронными. ISR могут вызывать асинхронные прерывания.
  • Механизм обслуживания прерывания может вызывать ISR из нескольких источников.
  • ISR
  • могут обрабатывать как маскируемые, так и немаскируемые прерывания. Инструкция в программе может отключить или включить вызов обработчика прерывания.
  • ISR в начале выполнения отключит службы прерывания других устройств. После завершения выполнения ISR он повторно инициализирует службы прерывания.
  • Вложенные прерывания разрешены в ISR для перенаправления в другую ISR.
Типы обработчиков прерываний:
  1. Обработчик прерывания первого уровня (FLIH) — обработчик аппаратного прерывания или обработчик быстрого прерывания. Эти обработчики прерываний имеют больше джиттера во время выполнения процесса и в основном являются маскируемыми прерываниями
  2. Обработчик прерываний второго уровня (SLIH) — это обработчик мягких прерываний и обработчик медленных прерываний.У этих обработчиков прерываний меньше джиттер.
Задержка прерывания:

Когда происходит прерывание, обслуживание прерывания путем выполнения ISR не может начаться немедленно путем переключения контекста. Интервал времени между возникновением прерывания и началом выполнения ISR называется задержкой прерывания.

  • Tswitch = Время, затраченное на переключение контекста
  • ΣTexec = Сумма интервалов времени для выполнения ISR
  • Задержка прерывания = Tswitch + ΣTexec

Ссылка по теме: Операционная система реального времени

1.5 прерываний — разработка LibreTexts

Что такое прерывание

Прерывание — это сигнал, излучаемый аппаратным или программным обеспечением, когда процесс или событие требуют немедленного внимания. Он предупреждает процессор о высокоприоритетном процессе, требующем прерывания текущего рабочего процесса. В устройствах ввода-вывода для этой цели выделена одна из линий управления шиной, которая называется процедурой обслуживания прерывания (ISR) .

Когда устройство вызывает прерывание, скажем, в процессе i, процессор сначала завершает выполнение инструкции i.Затем он загружает в счетчик программ (ПК) адрес первой инструкции ISR. Перед загрузкой адреса в счетчик программ адрес прерванной инструкции перемещается во временное место. Следовательно, после обработки прерывания процессор может продолжить процесс i + 1.

Пока процессор обрабатывает прерывания, он должен сообщить устройству, что его запрос был распознан, чтобы оно прекратило посылку сигнала запроса прерывания. Кроме того, сохранение регистров, чтобы прерванный процесс можно было восстановить в будущем, увеличивает задержку между временем получения прерывания и началом выполнения ISR.Это называется задержкой прерывания.

Аппаратные прерывания:
При аппаратном прерывании все устройства подключаются к линии запроса прерывания. Для всех n устройств используется одна строка запроса. Чтобы запросить прерывание, устройство закрывает связанный с ним переключатель. Когда устройство запрашивает прерывание, значение INTR представляет собой логическое ИЛИ запросов от отдельных устройств.

Последовательность событий, связанных с обработкой IRQ:

  1. Устройства вызывают IRQ.
  2. Процессор прерывает выполняемую в данный момент программу.
  3. Устройство информируется о том, что его запрос был распознан, и устройство деактивирует сигнал запроса.
  4. Запрошенное действие выполнено.
  5. Прерывание разрешено, и прерванная программа возобновляется.

Концептуально прерывание вызывает следующее:

Рисунок \ (\ PageIndex {1} \): понятие прерывания. («Концепция прерывания» от lemilxavier, WikiBooks находится под лицензией CC BY-SA 3.0)

Серые полосы представляют поток управления. Верхняя строка — это программа, которая выполняется в данный момент, а нижняя строка — это процедура обслуживания прерывания (ISR). Обратите внимание, что при возникновении прерывания ( Int ) программа прекращает выполнение, и микроконтроллер начинает выполнять ISR. После завершения ISR микроконтроллер возвращается к обработке программы с того места, где она остановилась.


Обработка нескольких устройств:
Когда более одного устройства выдают сигнал запроса прерывания, тогда требуется дополнительная информация, чтобы решить, какое устройство следует рассматривать в первую очередь.Чтобы решить, какое устройство выбрать, используются следующие методы: опрос, векторные прерывания и вложение прерываний. Это объясняется следующим образом.

  1. Опрос:
    При опросе первое обнаруженное устройство с установленным битом IRQ — это устройство, которое должно обслуживаться первым. Соответствующий ISR вызывается для обслуживания того же самого. Это легко реализовать, но на опрос бита IRQ всех устройств тратится много времени.
  2. Векторных прерываний:
    В векторных прерываниях устройство, запрашивающее прерывание, идентифицирует себя напрямую, посылая специальный код процессору по шине.Это позволяет процессору идентифицировать устройство, создавшее прерывание. Специальный код может быть начальным адресом ISR или местом, где ISR находится в памяти, и называется вектором прерывания.
  3. Вложение прерываний:
    В этом методе устройства ввода-вывода организованы в структуру приоритета. Следовательно, запрос прерывания от устройства с более высоким приоритетом распознается, а запрос от устройства с более низким приоритетом — нет. Для реализации этого каждый процесс / устройство (даже процессор).Процессор принимает прерывания только от устройств / процессов с приоритетом выше него.

Что происходит, когда внешнее оборудование запрашивает другое прерывание, когда процессор уже выполняет ISR для предыдущего запроса прерывания?

Когда было запрошено первое прерывание, аппаратное обеспечение процессора заставляет его завершить текущую инструкцию, отключить дальнейшие прерывания и перейти к обработчику прерывания.

Процессор игнорирует дальнейшие прерывания, пока не дойдет до той части обработчика прерывания, которая имеет команду «возврат из прерывания», которая повторно разрешает прерывания.

Если запрос прерывания возникает, когда прерывания были выключены, некоторые процессоры немедленно перейдут к этому обработчику прерывания, как только прерывания снова будут включены. С таким процессором шторм прерываний «истощает» фоновую задачу основного цикла. Другие процессоры выполняют по крайней мере одну инструкцию основного цикла перед обработкой прерывания, поэтому основной цикл может выполняться очень медленно, но, по крайней мере, он никогда не «истощается».

Некоторые процессоры имеют контроллер прерываний, который поддерживает «циклическое планирование», которое можно использовать для предотвращения другого вида «голодания» обработчиков прерываний с низким приоритетом.

Приоритет процессоров кодируется в нескольких битах PS (регистр состояния процесса). Его можно изменить с помощью программных инструкций, которые записываются в PS. Процессор находится в контролируемом режиме только при выполнении подпрограмм ОС. Он переходит в пользовательский режим перед запуском прикладных программ

Адаптировано из:
«Прерывания» от lemilxavier, Geeks for Geeks под лицензией CC BY-SA 4.0
«Microprocessor Design / Interrupts» от lemilxavier, WikiBooks под лицензией CC BY-SA 3.0

Объясните последовательность обработки прерывания, Компьютерная инженерия

Q.Расскажите о последовательности обработки прерывания?

Возникновение прерывания вызывает ряд событий как в аппаратном, так и в программном обеспечении процессора. На рисунке ниже показана последовательность.

Рисунок: Последовательность обработки прерывания

Когда устройство ввода-вывода завершает операцию ввода-вывода, происходит следующая последовательность аппаратных событий:

1. Устройство выдает сигнал прерывания процессору.

2.Процессор завершает выполнение текущей инструкции перед тем, как ответить на прерывание.

3. Процессор проверяет наличие прерываний и отправляет сигнал подтверждения устройству, создавшему прерывание.

4. Минимальная информация, которая должна быть сохранена для задачи, выполняемой в данный момент, до того, как ЦП начнет выполнение процедуры обработки прерывания (используя свои регистры):

(a) Состояние процессора, которое содержится в регистре, известном как слово состояния программы (PSW), и

(b) Местоположение следующей инструкции, которая должна быть выполнена, текущей выполняющейся программы, которая содержится в счетчике программ (ПК).

5. Теперь процессор загружает на ПК местоположение входа программы обработки прерывания, которая будет реагировать на это условие прерывания. После загрузки ПК процессор переходит к выполнению следующей инструкции, которая является следующим циклом инструкций, который начинается с выборки инструкции. Поскольку выборка команд определяется содержимым ПК, в результате управление передается программе-обработчику прерываний. Результатов исполнения в последующих операциях:

6.PC и PSW, относящиеся к прерванной программе, уже сохранены в системном стеке. Кроме того, содержимое регистров процессора также необходимо сохранять в стеке, который используется вызываемой подпрограммой обслуживания прерываний, поскольку эти регистры могут быть изменены обработчиком прерывания. На рисунке (а) представлена ​​простая иллюстрация. Здесь программа пользователя прерывается после инструкции в ячейке N. Содержимое всех регистров и адрес следующей инструкции (N + 1) помещаются в стек.

7.Далее обработчик прерывания обрабатывает прерывание. Это включает определение события, вызвавшего прерывание, а также информацию о состоянии, относящуюся к операции ввода-вывода.

8. По завершении обработки прерывания сохраненные значения регистров извлекаются из стека и восстанавливаются в регистры, которые показаны на рисунке (b).

9. Последний шаг — восстановить значения PSW и PC из стека. Следовательно, инструкция, которая должна быть выполнена, будет из ранее прерванной программы.

компьютеров в стеке: 6.5 ПЕРЕРЫВОВ И МНОГОЗАДАЧНОСТЬ Компьютеры в стеке

: 6.5 ПРЕРЫВАНИЯ И МНОГОЗАДАЧНОСТЬ

Stack Computers : новая волна © Авторское право 1989, г. Филип Купман, Все права защищены.

Глава 6. Что такое стековые машины


6.5 ПРЕРЫВАНИЯ И МНОГОЗАДАЧНОСТЬ

Производительность обработки прерываний состоит из трех компонентов. В первый компонент — это количество времени, которое проходит между моментом, когда запрос прерывания получен процессором и время, в которое процессор предпринимает действия, чтобы начать обработку процедуры обслуживания прерывания.Эта задержка называется задержкой прерывания.

Второй компонент работы службы прерывания — прерывание. время обработки. Это количество времени, которое фактически тратит процессор. сохранение состояния машины прерванного задания и переключение выполнения на программа обслуживания прерывания. Обычно количество сохраненных состояний машины составляет минимальный, исходя из предположения, что процедура обслуживания прерывания может минимизировать затрат за счет сохранения только тех дополнительных регистров, которые планируется использовать.Иногда можно встретить термин «задержка прерывания», используемый для описания сумма этих первых двух компонентов.

Третий компонент работы службы прерывания — это то, что мы назовем накладные расходы на сохранение состояния. Это время, затраченное на сохранение машины. регистры, которые не сохраняются автоматически логикой обработки прерывания, но который должен быть сохранен, чтобы подпрограмма обслуживания прерывания выполняла свою работа. Накладные расходы на сохранение состояния могут значительно варьироваться в зависимости от сложность процедуры обслуживания прерывания.В крайнем случае сохранение состояния накладные расходы могут включать в себя полное переключение контекста между многозадачными заданиями.

Конечно, затраты на восстановление всего состояния машины и возвращение к прерванный распорядок учитывается при определении системы в целом представление. Мы не будем здесь подробно рассматривать их, так как они имеют тенденцию быть примерно равно времени сохранения состояния (так как все, что сохраняется, должно быть восстановлен), и не так важны для соблюдения срочного крайнего срока для отвечает на прерывание.


6.5.1 Задержка ответа на прерывание

CISC-машины могут иметь инструкции, выполнение которых занимает очень много времени, снижение производительности задержки ответа на прерывание. Машины для штабелирования, такие как RISC машины, могут иметь очень быструю задержку ответа на прерывание. Это потому что большинство инструкций стековой машины имеют длину всего один цикл, поэтому в худшем случае только проходит несколько тактовых циклов, прежде чем запрос прерывания будет подтвержден и прерывание обрабатывается.

Однако после обработки прерывания разница между RISC и стековые машины становятся очевидными. RISC-машины должны пройти через сложную процедура сохранения конвейера при распознавании прерывания, а также конвейера восстанавливающая процедура при выходе из прерывания, во избежание потери информация о частично обработанных инструкциях. Штабелеукладчики, на с другой стороны, у них нет конвейера выполнения инструкций, поэтому только адрес следующую инструкцию, которую нужно выполнить, необходимо сохранить.Это означает, что стек машины могут рассматривать прерывание как вызов процедуры, сгенерированный оборудованием. Из конечно, поскольку вызовы процедур очень быстрые, время обработки прерывания очень низкий.

6.5.1.1 Возможность перезапуска команд

Есть одна возможная проблема с ответом на прерывание стековой машины. задержка. Это проблема потоковых инструкций и микрокодированных циклов.

Потоковые инструкции используются для повторного выполнения такой операции, как запись верхнего элемента стека данных в память.Эти инструкции реализовано с помощью функции повторения инструкций на NC4016 и RTX 2000, буфер команд на M17 и микрокодированные циклы на CPU / 16 и RTX 32P. Эти примитивы очень полезны, поскольку их можно использовать для создания эффективных примитивы манипулирования строками и подпрограммы обслуживания опустошения / переполнения стека. Проблема в том, что в большинстве случаев эти инструкции также бесперебойный.

Одно из решений — сделать эти инструкции прерываемыми дополнительным контролем. аппаратное обеспечение, которое может немного увеличить сложность процессора.Потенциально Сложная проблема, с которой не-стековые процессоры сталкиваются с этим решением, — это проблема сохранение промежуточных результатов. Со стековым процессором это не проблема, поскольку промежуточные результаты уже находятся в стеке, что является идеальным механизм сохранения состояния при прерывании.

Другой подход, который используется стековыми процессорами, — это использование программного обеспечения. ограничение на размер счетчика повторов, разрешенного для использования с потоковой передачей инструкции.Это означает, что если нужно переместить блок из 100 символов в памяти, действие может быть выполнено перемещением нескольких групп по 8 символов вовремя. Это сохраняет разумную задержку прерывания без больших потерь представление. Как и ожидалось, существует компромисс между абсолютной машиной эффективность (с длинными потоковыми инструкциями) и задержка ответа на прерывание.

В машинах с микрокодированием компромиссы почти такие же. Однако есть очень простая стратегия микрокода, обеспечивающая лучшее из обоих миров, разработан в коммерческой версии RTX 32P.Эта стратегия имеет бит кода состояния, видимый для микрокода, указывающий, является ли прерывание в ожидании. На каждой итерации микрокодированного цикла бит ожидания прерывания равен протестировано, не требует затрат времени на выполнение. Если нет ожидающих прерываний, другое итерация выполняется через цикл. Если прерывание ожидается, адрес потоковая инструкция помещается в стек возврата как адрес, который должен быть выполняется после выхода из прерывания, и прерыванию разрешается обработанный.Пока потоковая инструкция сохраняет все свое состояние на стек (который прост с такой операцией, как перемещение блока символов), там очень мало накладных расходов, связанных с этим методом при обработке прерывание и отсутствие накладных расходов при нормальном выполнении программы.


6.5.2 Облегченные прерывания

Давайте рассмотрим три различные степени экономии состояния, требуемые различные категории прерываний: быстрые прерывания, легкие потоки для многозадачность и полное переключение контекста.

Быстрые прерывания чаще всего встречаются во время выполнения. Эти прерывания делают такие вещи, как добавление нескольких миллисекунд к счетчику времени суток, или скопируйте байт из порта ввода в буфер памяти. Когда обычные машины обрабатывают такие прерывания, они обычно должны сэкономить два или три регистрируется в программной памяти для создания рабочего места в регистровом файле. В стековые машины, абсолютно никакого сохранения состояния не требуется. Служба прерывания подпрограмма может просто поместить свою информацию в верхнюю часть стека, не нарушая информация из программы, которая была прервана.Итак, для быстрого обслуживания прерывания, стековые машины имеют накладные расходы на сохранение нулевого состояния.

Легкие потоки — это задачи в многозадачной системе, которые имеют стратегия выполнения аналогична только что описанным прерываниям. Они могут пожать преимущества многозадачности без затрат на запуск и остановку полноценные процессы. Стек-машина может реализовывать легкие потоки просто требуя, чтобы каждая задача выполняла короткую последовательность инструкций, когда вызывается, затем передать управление центральному диспетчеру задач.Это может быть называется упреждающим или кооперативным управлением задачами. Если каждая задача запускается и останавливает свою работу без параметров в стеке, нет накладных расходов для контекст переключается между задачами. Стоимость этого метода многозадачности составляет по сути, ноль, так как задача передает управление только задаче менеджер в логической точке разрыва в программе, где стек, вероятно, все равно было бы пусто.

Из этих двух примеров мы видим, что обработка прерывания и легкие потоки многозадачности очень недороги для стековых процессоров.В единственная проблема, которая остается открытой, — это полноценная превентивная многозадачность. выполняется с переключением контекста.


6.5.3 Контекстные переключатели

Накладные расходы на переключение контекста обычно считаются причиной того, что «стек машины не годятся для многозадачности «. Аргумент, стоящий за такими рассуждение обычно основано на необходимости сохранить огромное количество стека буферное пространство в программной памяти. Идея о том, что стековые машины хуже при многозадачности, чем другие машины, явно неверно.

Переключение контекста — потенциально дорогостоящая операция в любой системе. В Компьютеры RISC и CISC с кэш-памятью, переключение контекста может быть больше дороже, чем думают производители, в результате скрытых снижение производительности, вызванное увеличением количества промахов в кэше после контекста выключатель. Поскольку машины RISC используют большие файлы регистров, они сталкиваются с точно такие же проблемы, с которыми сталкиваются стековые машины. Добавлен Недостатком RISC-машин является то, что их произвольный доступ к регистрам требует сохранение всех регистров (или добавление сложного оборудования для определения того, какие регистры используются), тогда как стековая машина может легко сохранить только активную область буфер стека.

6.5.3.1 Эксперимент переключения контекста

В таблице 6.7 показаны данные, собранные в результате моделирования числа затраченных циклов памяти на сохранение и восстановление элементов стека данных для Forth программы в среде переключения контекста. Смоделированные программы были Королева, Ханой и программа быстрой сортировки. Для Queen использовались небольшие значения N. и Ханой, чтобы обеспечить разумное время работы симулятора. Оба эффекты переполнения и потери стека, а также переключения контекста были измеряется, поскольку они интенсивно взаимодействуют в такой среде.

Таблица 6.7. Циклы памяти, затраченные на разлив стека данных для разных размеры буфера и частота смены контекста.

 Комбинация королев, Qsort, Ханой
        # Instructions = 36678
   Средняя глубина стека = 12,1
   Максимальная глубина штабеля = 36
 
 Буфер
  Размер таймера = 100 таймер = 500 таймер = 1000 таймер = 10000 
2 17992 16334 16124 15916
4 12834 9924 9524 9214
8 8440 3950 3430 2910
12 10380 3944 3068 2314
16 11602 2642 1620 632
20 12886 3122 1846 626
24 13120 2876 1518 330
28 14488 3058 1584 242
32 15032 3072 1556 124
36 15458 3108 1568 82
 

Таблица 6.7 (a) Управление буфером, управляемое страницей.

 Буфер
  Размер таймера = 100 таймер = 500 таймер = 1000 таймер = 10000 
2 26424 24992 24798 24626
4 11628 8912 8548 8282
8 7504 3378 2762 2314
12 6986 1930 1286 630
16 7022 1876 1144 322
20 7022 1852 1084 180
24 7022 1880 1066 124
28 7022 1820 1062 90
32 7022 1828 1060 80
36 7022 1822 1048 80
 

Таблица 6.7 (b) Управление буфером по требованию.


Рисунок 6.4 — Накладные расходы для стека, управляемого страницей.

Таблица 6.7a и рисунок 6.4 показывают результаты для стека, управляемого страницами. В обозначение «xxx CLOCKS / SWITCH» указывает количество тактов между переключениями контекста. За 100 тактов между переключениями контекста количество циклов памяти, затрачиваемых на управление стеком, уменьшается по мере того, как буфер размер увеличивается. Это связано с уменьшением скорости разлива. пока программа обращается к стеку.По мере увеличения размера буфера более 8 элементов, однако, трафик памяти увеличивается, поскольку все более буферы постоянно копируются в память и из нее при переключении контекста.

Обратите внимание, как программа ведет себя через 500 циклов между переключениями контекста. Четное при этой относительно высокой скорости (что соответствует 20 000 переключений контекста на второй для процессора с тактовой частотой 10 МГц — на практике чрезмерно высокая частота), Стоимость переключения контекста всего около 0.08 тактов на инструкцию для стека размер буфера больше 12. Поскольку в этом эксперименте каждая инструкция в среднем 1,688 такта без накладных расходов на переключение контекста, это составляет всего лишь накладные расходы 4,7%. При 10 000 циклов между переключением контекста (1 миллисекунда между переключениями контекста) накладные расходы составляют менее 1%.

Как возможно иметь такие низкие накладные расходы? Одна из причин заключается в том, что средний глубина стека составляет всего 12,1 элемента при выполнении этих трех сильно рекурсивные программы.Это означает, что, поскольку никогда не бывает очень много информации в стеке, очень мало информации нужно сохранить на переключатель контекста. Фактически, по сравнению с машиной CISC с 16 регистрами, стек машина, смоделированная в этом эксперименте, фактически имеет состояние на меньше , чтобы сэкономить переключатель контекста.


Рисунок 6.5 — Накладные расходы для управляемого стека с питанием по запросу.

Таблица 6.7b и Рисунок 6.5 показывают результаты одного и того же прогона моделирования с использованием алгоритм управления стеком по требованию.В этих результатах рост Кривая с интервалом 100 циклов, когда в буфере стека находится более 12 элементов, является почти не существует. Это потому, что при восстановлении стек не пополнялся. состояние машины, но ему было разрешено пополнить во время выполнения программы в мода, управляемая спросом. Для разумных частот переключения контекста (менее чем 1000 в секунду), стратегия спроса несколько лучше, чем страничная стратегия, но не с огромным отрывом.

6.5.3.2 Несколько пространств стека для многозадачности

Существует подход, который можно использовать со стековыми машинами, которые могут исключить даже скромные затраты, связанные с переключением контекста, которые у нас есть видимый. Вместо использования одного большого стека для всех программ, высокоприоритетным / критичным по времени частям программы можно назначить свои собственные пространство стека. Это означает, что каждый процесс использует указатель стека и ограничение стека. регистры, чтобы вырезать часть стека для его использования.При встрече с переключение контекста, диспетчер процессов просто сохраняет текущий указатель стека для процесс, поскольку он уже знает, каковы ограничения стека. Когда новый значение указателя стека и регистры ограничения стека загружаются, новый процесс готов к исполнению. Никакого времени не тратится на копирование элементов стека в и из объем памяти.

Объем памяти стека, необходимый большинству программ, обычно довольно велик. маленький. Кроме того, это может быть гарантировано благодаря дизайну, чтобы быть маленьким вкратце, срочные процессы.Таким образом, даже скромный стековый буфер из 128 элементов может быть разделен на четыре процесса по 32 элемента в каждом. Если больше четырех процессы необходимы многозадачной системе, один из буферов может быть назначил рабочий буфер с низким приоритетом, который должен использоваться совместно с копированием. и копирование среди всех задач с низким приоритетом.

Из этого обсуждения мы видим, что понятие стековых процессоров слишком большое состояние, чтобы сохранять для эффективной многозадачности, — это миф.Фактически, в во многих случаях стековые процессоры могут лучше справляться с многозадачностью и прерыванием обработки, чем любой другой компьютер.

Hayes и Fraeman (1988) независимо друг от друга получили результаты для стека Затраты на перетекание и переключение контекста на FRISC 3 аналогичны результатам сообщается в этой главе.


СЛЕДУЮЩИЙ РАЗДЕЛ

Фил Купман — koopman @ cmu.edu

Что такое прерывание в ОС

Прерывание — это сигнал, излучаемый аппаратным или программным обеспечением, когда процесс или событие требуют немедленного внимания. Он предупреждает процессор о высокоприоритетном процессе, требующем прерывания текущего рабочего процесса. В устройствах ввода-вывода для этой цели предназначена одна из линий управления шиной, которая называется подпрограммой обслуживания прерывания (ISR).

Когда устройство вызывает прерывание в процессе, процессор сначала завершает выполнение инструкции.Затем он загружает в счетчик программ (ПК) адрес первой инструкции ISR. Перед загрузкой программного счетчика с адресом адрес прерванной инструкции перемещается во временное место. Следовательно, после обработки прерывания процессор может продолжить процесс.

Пока процессор обрабатывает прерывания, он должен сообщить устройству, что его запрос был распознан, чтобы прекратить отправку сигнала запроса прерывания.Кроме того, сохранение регистров для восстановления прерванного процесса в будущем увеличивает задержку между моментом получения прерывания и началом выполнения ISR. Это называется задержка прерывания .

Один компьютер может одновременно выполнять только одну компьютерную инструкцию. Но, поскольку он может быть прерван, он может управлять тем, как будут выполняться программы или наборы инструкций. Это известно как многозадачность .Это позволяет пользователю делать много разных вещей одновременно, а компьютер переключается на управление программами, которые запускает пользователь. Конечно, компьютер работает на таких скоростях, которые создают впечатление, будто все пользовательские задачи выполняются одновременно.

В операционной системе обычно есть код, который называется обработчиком прерывания . Обработчик прерываний определяет приоритеты прерываний и сохраняет их в очереди, если более одного ожидают обработки. В операционной системе есть еще одна небольшая программа, называемая планировщиком , которая определяет, какой программой управлять следующей.

Типы прерываний

Сигналы прерывания могут выдаваться в ответ на аппаратные или программные события. Они классифицируются как аппаратных прерываний или программных прерываний соответственно.

1. Аппаратные прерывания

Аппаратное прерывание — это состояние, связанное с состоянием аппаратного обеспечения, о котором может сигнализировать внешнее аппаратное устройство, например линия запроса прерывания (IRQ) на ПК, или обнаруженное устройствами, встроенными в логику процессора, чтобы сообщить, что устройство требует внимания со стороны операционной системы.Например, нажатие клавиши клавиатуры или перемещение мыши вызывает аппаратные прерывания, которые заставляют процессор считывать нажатие клавиши или положение мыши.

Аппаратные прерывания могут поступать асинхронно для тактовой частоты процессора и в любой момент во время выполнения инструкции. Следовательно, все сигналы аппаратных прерываний обусловлены их синхронизацией с часами процессора и действуют только на границах выполнения команд.

Во многих системах каждое устройство связано с определенным сигналом IRQ.Это позволяет быстро определить, какое аппаратное устройство запрашивает обслуживание, и ускорить обслуживание этого устройства.

В некоторых старых системах все прерывания отправлялись в одно и то же место, и ОС использовала специализированную инструкцию для определения невыполненного немаскированного прерывания с наивысшим приоритетом. В современных системах обычно существует отдельная процедура обработки прерывания для каждого типа прерывания или каждого источника прерывания, часто реализованная в виде одной или нескольких таблиц векторов прерываний. Аппаратные прерывания делятся на два типа, например:

  • Маскируемые прерывания: Процессоры обычно имеют внутренний регистр маски прерывания, который позволяет выборочно включать и отключать аппаратные прерывания.Каждый сигнал прерывания связан с битом в регистре маски; в некоторых системах прерывание разрешено, когда бит установлен, и отключено, когда бит сброшен, в то время как в других установленный бит запрещает прерывание. Когда прерывание отключено, соответствующий сигнал прерывания будет игнорироваться процессором. Сигналы, на которые действует маска, называются маскируемыми прерываниями .
    Маска прерывания не влияет на некоторые сигналы прерывания и поэтому не может быть отключена; они называются немаскируемыми прерываниями (NMI).NMI указывают на события с высоким приоритетом, которые необходимо обработать немедленно и которые нельзя игнорировать ни при каких обстоятельствах, например, сигнал тайм-аута от сторожевого таймера.
    Для маска прерывание должно отключить его, а для демаскировать прерывание должно его включить.
  • Ложные прерывания:
    Ложные прерывания — это аппаратные прерывания, источник которых не может быть найден. Термин фантомное прерывание или фантомное прерывание также может использоваться для описания этого явления.Ложные прерывания, как правило, представляют собой проблему с цепью прерывания с проводным ИЛИ, подключенной к входу процессора, чувствительному к уровню. Такие прерывания может быть трудно идентифицировать, когда система работает неправильно.
    В схеме с проводным ИЛИ зарядка / разрядка паразитной емкости через резистор смещения линии прерывания вызовет небольшую задержку, прежде чем процессор обнаружит, что источник прерывания был очищен. Если прерывающее устройство очищается слишком поздно в программе обслуживания прерывания (ISR), не будет достаточно времени для возврата схемы прерывания в состояние покоя до завершения текущего экземпляра ISR.В результате процессор будет думать, что еще одно прерывание ожидает обработки, поскольку напряжение на его входе запроса прерывания не будет высоким или достаточно низким, чтобы установить однозначную внутреннюю логическую единицу или логический 0. Кажущееся прерывание не будет иметь идентифицируемого источника, и, следовательно, это называется фальшивым.
    Ложное прерывание может привести к взаимоблокировке системы или другой неопределенной операции, если ISR не учитывает возможность возникновения такого прерывания. Поскольку ложные прерывания в основном являются проблемой для цепей прерываний с проводным ИЛИ, хорошая практика программирования в таких системах заключается в том, чтобы ISR проверяла все источники прерываний на активность и не предпринимала никаких действий, если ни один из источников не прерывает работу.

2. Программные прерывания

Процессор запрашивает программное прерывание при выполнении определенных инструкций или при выполнении определенных условий. Каждый сигнал программного прерывания связан с определенным обработчиком прерывания.

Программное прерывание может быть вызвано намеренно выполнением специальной инструкции, которая вызывает прерывание при исполнении по замыслу. Такие инструкции действуют аналогично вызовам подпрограмм и используются для различных целей, таких как запрос служб операционной системы и взаимодействие с драйверами устройств.

Программные прерывания также могут быть неожиданно вызваны ошибками выполнения программы. Эти прерывания обычно называются ловушками или исключениями .

Работа с несколькими устройствами

Когда более одного устройства генерируют сигнал запроса прерывания, необходима дополнительная информация, чтобы решить, какое устройство рассматривать в первую очередь. Следующие методы используются, чтобы решить, какое устройство выбрать первым,

  1. Опрос
    При опросе первое обнаруженное устройство с установленным битом IRQ должно обслуживаться первым, и для его обслуживания вызывается соответствующий ISR.Это легко реализовать, но на опрос бита IRQ всех устройств тратится много времени.
  2. Векторные прерывания
    В векторных прерываниях устройство, запрашивающее прерывание, идентифицирует себя напрямую, посылая специальный код процессору по шине. Это позволяет процессору идентифицировать устройство, создавшее прерывание. Специальный код может быть начальным адресом ISR или местом расположения ISR в памяти и называется вектором прерывания .
  3. Вложенность прерываний
    В этом методе устройство ввода-вывода организовано в приоритетную структуру. Следовательно, запрос прерывания от устройства с более высоким приоритетом распознается, а устройство с более низким приоритетом — нет. Процессор принимает прерывания только от устройств / процессов с приоритетом выше него.
    Приоритет процессоров закодирован в нескольких битах PS (регистр состояния процесса), и его можно изменить с помощью программных инструкций, которые записывают в PS. Процессор находится в контролируемом режиме только при выполнении подпрограмм ОС и переключается в пользовательский режим перед выполнением прикладных программ.

Обработка прерываний

Мы знаем, что цикл команд состоит из функций выборки, декодирования, выполнения и чтения / записи. После каждого цикла команд процессор проверяет наличие прерываний, которые нужно обработать. Если в системе нет прерывания, она перейдет к следующему циклу команд, заданному регистром команд. Если присутствует прерывание, оно запускает обработчик прерывания. Обработчик остановит текущую команду, которая обрабатывает, и сохранит ее конфигурацию в регистре, и загрузит программный счетчик прерывания из места, заданного таблицей векторов прерываний.

После обработки прерывания процессором обработчик прерывания загружает инструкцию и ее конфигурацию из сохраненного регистра. Процесс начнет свою обработку с того места, где он остался. Это сохраняет старую конфигурацию обработки команд, а загрузка новой конфигурации прерывания также называется переключением контекста . Существуют разные типы обработчиков прерываний.

  1. Обработчик прерывания первого уровня (FLIH) — обработчик аппаратного прерывания или обработчик быстрого прерывания.Эти обработчики прерываний имеют больше джиттера во время выполнения процесса, и в основном это маскируемые прерывания.
  2. Обработчик прерываний второго уровня (SLIH) — это обработчик мягких прерываний и обработчик медленных прерываний. У этих обработчиков прерываний меньше джиттер.

Обработчик прерывания также называется программой обслуживания прерывания (ISR). Основные характеристики ISR:

  • Прерывания могут возникать в любое время, и они являются асинхронными, и ISR могут вызывать асинхронные прерывания.
  • Механизм обслуживания прерывания может вызывать ISR из нескольких источников.
  • ISR
  • могут обрабатывать как маскируемые, так и немаскированные прерывания. Инструкция в программе может отключить или включить вызов обработчика прерывания.
  • ISR в начале выполнения отключит службы прерывания других устройств. После завершения выполнения ISR он повторно инициализирует службы прерывания.
  • Вложенные прерывания разрешены в ISR для перенаправления в другую ISR.

Задержка прерывания

Когда происходит прерывание, обслуживание прерывания путем выполнения ISR не может начаться немедленно путем переключения контекста.Интервал времени между возникновением прерывания и началом выполнения ISR называется задержкой прерывания.

  • Tswitch = время, затраченное на переключение контекста
  • ΣTexec = Сумма временного интервала для выполнения ISR
  • Задержка прерывания = Tswitch + ΣTexec

Как процессор реагирует на прерывания

Ключевым моментом на пути к пониманию того, как работают операционные системы, является понимание того, что делает ЦП при возникновении прерывания.Аппаратное обеспечение ЦП делает то же самое для каждого прерывания, позволяя операционным системам брать контроль над выполняющимся в данный момент пользовательским процессом. Переключение запущенных процессов для выполнения кода из ядра ОС называется переключением контекста .

Процессоры

полагаются на данные, содержащиеся в паре регистров, для правильной обработки прерываний. Один регистр содержит указатель на блок управления процессом текущего запущенного процесса, и этот регистр устанавливается каждый раз, когда процесс загружается в память.Другой регистр содержит указатель на таблицу, содержащую указатели на инструкции в ядре ОС для обработчиков прерываний и системных вызовов. Значение в этом регистре и содержимое таблицы устанавливаются при инициализации операционной системы во время загрузки. В ответ на прерывание ЦП выполняет следующие действия:

  1. При использовании указателя на текущий блок управления процессом состояние и все значения регистров сохраняются для использования при последующем перезапуске процесса.
  2. Бит режима ЦП переключается на контроль
  3. С помощью указателя на таблицу обработчиков прерываний и вектора прерывания определяется место выполнения кода ядра.Вектор прерывания — это IRQ для аппаратных прерываний и аргумент инструкции на языке ассемблера прерывания для программных прерываний.
  4. Обработка переключается на соответствующую часть ядра.

ЦП использует таблицу и вектор прерывания, чтобы найти ОС, код для выполнения в ответ на прерывания. Программное прерывание показано на изображении ниже.

Во время работы компьютера обработка переключается между пользовательскими процессами и операционной системой по мере получения аппаратных и программных прерываний.

Способы запуска

Каждый вход сигнала прерывания предназначен для срабатывания либо по уровню логического сигнала, либо по определенному фронту сигнала (переход уровня). Входы, чувствительные к уровню, постоянно запрашивают обслуживание процессора, пока к входу применяется определенный (высокий или низкий) логический уровень. Входы, чувствительные к фронту, реагируют на фронты сигнала: определенный (нарастающий или спадающий) фронт вызовет фиксацию запроса на обслуживание. Процессор сбрасывает защелку при выполнении обработчика прерывания.

1. Срабатывание по уровню

Прерывание, запускаемое уровнем, запрашивается путем удержания сигнала прерывания на его конкретном (высоком или низком) активном логическом уровне. Устройство вызывает прерывание, инициируемое уровнем, направляя сигнал и удерживая его на активном уровне. Он аннулирует сигнал, когда процессор подает ему команду, обычно после того, как устройство было обслужено.

Процессор производит выборку входного сигнала прерывания во время каждого цикла команд. Процессор распознает запрос прерывания, если сигнал поступает во время выборки.

Входы с синхронизацией по уровню позволяют нескольким устройствам совместно использовать общий сигнал прерывания через проводные соединения ИЛИ. Процессор опрашивает, какие устройства запрашивают обслуживание. После обслуживания устройства процессор может снова опрашивать и, при необходимости, обслуживать другие устройства перед выходом из ISR.

2. С запуском по фронту

Прерывание, запускаемое фронтом, — это прерывание, о котором сигнализирует переход уровня на линии прерывания, либо спад (от высокого к низкому), либо нарастающий (от низкого к высокому).Устройство, желающее сигнализировать о прерывании, посылает импульс на линию и переводит ее в неактивное состояние. Если импульс слишком короткий, чтобы его можно было обнаружить с помощью ввода-вывода по запросу, то для его обнаружения может потребоваться специальное оборудование.


Типы

, реализация системы и методы запуска

ПК

используют запросы прерывания для обработки различных аппаратных функций. Аппаратные прерывания были впервые представлены UNIVAC 1103 в 1953 году. Первый случай маскирования прерываний был внедрен IBM 650 в 1954 году.Важно назначать разные IRQ разным аппаратным устройствам для выполнения различных функций. Во время выполнения программы такие устройства, как клавиатура, мышь, требуют сервисов ЦП и генерируют прерывание, чтобы привлечь внимание ЦП и обработать запрошенную службу. Они известны как прерывания. Одна из шин устройства ввода-вывода предназначена для этой цели и называется программой обработки прерываний (ISR). Они используются в различных приложениях, например, для событий, чувствительных ко времени, передачи данных, выделения аномальных событий, сторожевых таймеров, ловушек и т. Д.


Что такое прерывание?

Определение: Это входной сигнал, который имеет наивысший приоритет для аппаратных или программных событий, требующих немедленной обработки события. В первые дни вычислений процессору приходилось ждать сигнала для обработки каких-либо событий. Процессор должен проверить каждое аппаратное и программное обеспечение, чтобы понять, есть ли какой-либо сигнал для обработки. Этот метод потребляет некоторое количество тактовых циклов и загружает процессор.На всякий случай, если будет сгенерирован какой-либо сигнал, процессору снова потребуется некоторое время для обработки события, что приведет к снижению производительности системы.

Был введен новый механизм для преодоления этого сложного процесса. В этом механизме аппаратное или программное обеспечение будет отправлять сигнал процессору, а не процессор, проверяющий любой сигнал от оборудования или программного обеспечения. Сигнал предупреждает процессор с наивысшим приоритетом и приостанавливает текущие действия, сохраняя его текущее состояние и функцию, и немедленно обрабатывает прерывание, это известно как ISR.Поскольку это длится недолго, процессор возобновляет нормальную работу, как только он будет обработан.

Прерывание

Типы прерывания

Они подразделяются на два основных типа.

Аппаратные прерывания

Электронный сигнал, отправляемый внешним устройством или оборудованием для связи с процессором, указывающий на то, что он требует немедленного внимания. Например, удары с клавиатуры или действие с помощью мыши вызывают аппаратные прерывания, заставляя ЦП читать и обрабатывать их.Таким образом, он поступает асинхронно и в любой момент времени при выполнении инструкции.

Аппаратные прерывания делятся на два типа

  • Маскируемые прерывания — Процессоры должны регистрировать маску прерываний, что позволяет включать и отключать аппаратные прерывания. Каждый сигнал имеет бит в регистре маски. Если этот бит установлен, прерывание разрешается и запрещается, если бит не установлен, или наоборот. Сигналы, которые прерывают процессоры через эти маски, называются маскированными прерываниями.
  • Немаскированные прерывания (NMI) — NMI — это действия с наивысшим приоритетом, которые необходимо обрабатывать немедленно и в любой ситуации, например, сигнал тайм-аута, генерируемый сторожевым таймером.
Программные прерывания

Сам процессор запрашивает программное прерывание после выполнения определенных инструкций или при выполнении определенных условий. Это может быть конкретная инструкция, которая запускает прерывание, такое как вызовы подпрограммы, и может запускаться неожиданно из-за ошибок выполнения программы, известных как исключения или ловушки.

Способы запуска

Как правило, эти сигналы предназначены для запуска с использованием либо уровня логического сигнала, либо фронта сигнала. Эти методы бывают двух типов.

Прерывание, инициируемое уровнем

В этом типе входной модуль вызывает прерывание, если установлен уровень обслуживания. Если источник прерывания продолжает утверждаться, когда обработчик прерывания микропрограммного обеспечения обрабатывает его, этот модуль регенерирует и запускает обработчик для повторного вызова. Входы, запускаемые по уровню, не годятся, если остаются активными в течение более длительного времени.

Прерывание по фронту

Модуль ввода прерывания, запускаемого по фронту, вызывает прерывание, как только он идентифицирует утверждающий фронт — спадающий или нарастающий фронт. Край становится заметным при изменении уровня источника. Этот тип запуска требует немедленных действий, независимо от активности источника.

запуск по фронту уровня

Реализация системы

Прерывания должны применяться к оборудованию как отдельный компонент наряду с линиями управления или интегрироваться в подсистемы памяти.Когда реализация выполняется на аппаратном уровне, требуется программируемый контроллер прерываний (PCI) для соединения между входным контактом ЦП и устройством прерывания. PCI мультиплексирует различные источники прерываний в одну или две линии ЦП. При реализации, относящейся к контроллеру памяти, слот адреса памяти системы отображается непосредственно с прерываниями.

Общие запросы прерывания (IRQ)

При прерывании по фронту используется подтягивающий или понижающий резистор для управления линией прерывания.Эта линия передает каждый импульс, производимый каждым устройством. Если импульсы прерывания, генерируемые разными устройствами, происходят близко по времени, ЦП должен вызвать задний фронт импульса, чтобы не пропустить прерывания, после чего ЦП проверяет каждое устройство на предмет запросов на обслуживание. Правильно настроенные материнские платы с отраслевой стандартной архитектурой (ISA) с подтягивающими резисторами, имеющими общие линии IRQ, должны работать нормально. Однако несколько устройств, совместно использующих линию IRQ в старых системах с плохо спроектированным программным интерфейсом, затрудняют обработку прерываний.С другой стороны, новая системная архитектура, такая как PCI, значительно облегчает эту проблему.


Гибрид

Гибридный тип реализации системы имеет комбинацию сигнализации, запускаемой как фронтом, так и уровнем. Аппаратное обеспечение должно искать фронт, а также проверять, активен ли сигнал в течение определенного периода. Для входа немаскируемого прерывания (NMI) обычно используется гибридный тип, который гарантирует, что ложные прерывания не влияют на систему.

Сообщение
Сигнал

Сигнализируемый сообщением запрос прерывания для обслуживания с использованием сигналов устройства путем передачи сообщения по каналу связи, например по компьютерной шине. Они не используют физическую линию прерывания. PCI Express действует как последовательная шина и используется исключительно как прерывания с сигнализацией сообщений.

Дверной звонок

Прерывание дверного звонка обычно используется в качестве механизма программной системы, чтобы сигнализировать компьютерному оборудованию о завершении работы.По взаимному соглашению между аппаратным и программным обеспечением программное обеспечение помещает данные в известную ячейку памяти и звонит в дверной звонок, чтобы уведомить оборудование о том, что данные готовы и ожидают обработки. Теперь аппаратное устройство компьютера понимает, что данные действительны, и обрабатывает их соответствующим образом.

Мультипроцессор IPI

В многопроцессорных системах запрос прерывания от процессора отправляется другому процессору через межпроцессорные прерывания (IPI)

Типичное использование / применение

Это мощные входы, обычно используемые для

  • Сервисные аппаратные таймеры, обработка нажатий на клавиатуру и действий мыши
  • Быстро реагировать на события, зависящие от времени или в реальном времени
  • Передача данных на периферийные устройства и с них
  • Отвечает на высокоприоритетные задачи, такие как сигналы об отключении питания, ловушки и сторожевые таймеры
  • Указывает на ненормальные события CPU
  • Прерывание при отключении питания предвидит потерю питания, что позволяет корректно завершить работу системы
  • Периодические прерывания для отслеживания абсолютного времени

Часто задаваемые вопросы

1).Почему используются прерывания?

Они используются, чтобы привлечь внимание ЦП к выполнению услуг, запрашиваемых аппаратным или программным обеспечением.

2). Что такое НМИ?

NMI — немаскируемое прерывание, которое не может игнорироваться или отключаться процессором

3). Какова функция строки подтверждения прерывания?

Процессор посылает устройствам сигнал, указывающий, что он готов к приему прерываний.

4).Опишите аппаратное прерывание. Приведите примеры

Генерируется внешним устройством или оборудованием; такие как клавиши клавиатуры или движение мыши вызывает аппаратные прерывания

5). Опишите программное прерывание.

Он определяется как специальная инструкция, которая вызывает прерывание, например, вызов подпрограммы. Программные прерывания могут запускаться неожиданно из-за ошибок выполнения программы

6). Какое прерывание имеет наивысший приоритет?

  • Немаскируемый край и срабатывание уровня
  • ЛОВУШКА имеет наивысший приоритет

7).Дайте несколько вариантов использования прерывания

  • Быстро реагировать на события, зависящие от времени или в реальном времени
  • Передача данных на периферийные устройства и с них
  • Отвечает на высокоприоритетные задачи, такие как сигналы об отключении питания, ловушки и сторожевые таймеры
  • Указывает на ненормальные события CPU

8). Что такое гибридный тип внедрения системы?

Гибридный тип реализации системы имеет комбинацию сигнализации, запускаемой как фронтом, так и уровнем.Аппаратное обеспечение должно искать фронт, а также проверять, активен ли сигнал в течение определенного периода.

В этой статье мы поняли важность прерываний и то, как они используются для выполнения запрошенных услуг. Мы также обсудили, каковы типы, реализация системы и ее использование.

Как исправить высокую загрузку ЦП, вызванную системными прерываниями

Когда вы обнаружите, что процесс, называемый «системные прерывания», вызывает высокую загрузку ЦП, вы, скорее всего, имеете дело с аппаратной частью или драйвером.

В этом посте мы объясняем, что такое системные прерывания и как вы можете найти и исправить основную причину их высокой загрузки ЦП.

Что такое «системные прерывания»?

Системные прерывания отображаются в диспетчере задач как процесс Windows, но на самом деле это не процесс. Скорее, это своего рода представитель, который сообщает об использовании ЦП всех прерываний, происходящих на более низком системном уровне.

Прерывания могут исходить от программного или аппаратного обеспечения, включая сам процессор.Википедия объясняет:

Прерывание предупреждает процессор о состоянии высокого приоритета, требующем прерывания текущего кода, выполняемого процессором. В ответ процессор приостанавливает свои текущие действия, сохраняет свое состояние и выполняет функцию, называемую обработчиком прерывания, для обработки события.

Когда задача обработчика прерывания завершена, процессор возвращается в состояние, в котором она была прервана.

Прерывания — это форма связи программного и аппаратного обеспечения с ЦП. Например, когда вы начинаете печатать на клавиатуре, соответствующее оборудование и программное обеспечение отправляют прерывания в ЦП, чтобы запустить обработку вашего ввода.

Прерывания также могут сообщить ЦП, что произошла ошибка, и это может вызвать всплеск использования ЦП системных прерываний. В исправной системе системные прерывания будут колебаться от 0,1% до 2% использования ЦП, в зависимости от частоты ЦП, запущенного программного обеспечения и подключенного оборудования.

Даже пики от 3% до 7% можно считать нормальным диапазоном, в зависимости от настроек вашей системы.

Как исправить системные прерывания, вызывающие высокую загрузку ЦП

Если системные прерывания постоянно загружают от 5% до 10% вашего ЦП, что-то не так, и вы, скорее всего, имеете дело с аппаратной проблемой. Мы поможем вам разобраться в этом.

Первое исправление, которое вы всегда должны попробовать, — это перезагрузить компьютер.Если это не поможет, начните здесь:

1. Отключите или отключите все внешние устройства

USB-оборудование является распространенной причиной. Вы можете либо отключить внешние USB-устройства, либо — в Диспетчере устройств (см. Ниже) — отключить корневые концентраторы USB, то есть заблокировать внешнее оборудование от прерывания работы ЦП.

В диспетчере устройств найдите запись Контроллеры универсальной последовательной шины и отключите все записи корневого концентратора USB, которые вы найдете.

Примечание: Если вы используете внешнюю клавиатуру или мышь USB (Bluetooth), они могут перестать работать. Обязательно используйте альтернативный метод повторного включения устройства.

Совет для настольных компьютеров: Проверьте, есть ли у вас неиспользуемых кабелей SATA, подключенных к материнской плате, и отсоедините их.

2. Проверьте драйверы оборудования

Чтобы быстро проверить, есть ли у вас проблема с драйвером, вы можете запустить DPC Latency Checker.Отложенный вызов процедур (DPC) — это процесс, связанный с системными прерываниями. Когда обработчику прерывания необходимо отложить выполнение задачи с более низким приоритетом на потом, он вызывает DPC.

DPC Latency Checker был разработан для анализа того, может ли ваша система должным образом обрабатывать потоковое аудио или видео в реальном времени, проверяя задержку драйверов устройств режима ядра. Это быстрый способ выявить проблемы, и инструмент не требует установки.

Если вы видите красные полосы, т.е.е. пропадания из-за большой задержки, что-то не так.

Вы можете попытаться найти виновника или, если проблема впервые возникла недавно, откатить последние обновления драйверов (Windows 10) или обновить драйверы до стандартных версий. В прошлом проблемы вызывали драйверы AMD SATA, аудиоустройства HD и отсутствующие драйверы Bluetooth.

В качестве альтернативы вы можете установить и запустить LatencyMon, монитор задержки, чтобы найти файлы драйверов с наибольшим количеством DPC.Нажмите кнопку Start / Play , затем перейдите на вкладку Drivers и отсортируйте файлы драйверов по DPC count . Обратите внимание, что счет накапливается со временем, поэтому дайте ему поработать некоторое время.

Драйверы с большим количеством DPC потенциально могут вызвать большое количество прерываний.

3. Отключите внутренние устройства

Вместо случайного обновления драйверов начните с отключения отдельных драйверов устройств, чтобы найти виновника.Если вы уже определили потенциальных нарушителей, сначала отключите их.

Перейдите в меню «Пуск» , найдите и откройте Диспетчер устройств (также находится в Панели управления), разверните периферийные устройства, перечисленные ниже, щелкните устройство правой кнопкой мыши и выберите Отключить .

Сделайте это для одного устройства за раз. , проверьте использование ЦП системных прерываний или повторно запустите DPC Latency Checker, затем щелкните устройство правой кнопкой мыши и выберите Включить перед переходом к следующему устройству.

Эти устройства являются наиболее вероятными виновниками:

  • Сетевые адаптеры

  • Внутренние модемы

  • Внутренние звуковые устройства

  • Любые дополнительные карты, такие как карта ТВ-тюнера, адаптеры ISDN или DSL или модемы

Если ни один из них не виноват, вы можете продолжить отключение (и повторное включение) других несущественных драйверов.

Никогда не отключайте какие-либо драйверы, необходимые для работы вашей системы , включая все, что указано в разделах Компьютер , Процессоры и Системное устройство .

Кроме того, не пытайтесь отключить адаптеры дисплея, дисковый накопитель, на котором работает ваша система, контроллеры IDE, клавиатуру или мышь (если у вас нет альтернативного устройства ввода, такого как тачпад) или монитора.

4. Исключить неисправное оборудование

Если поврежденный драйвер может вызвать прерывание работы системы, то же самое может вызвать неисправное оборудование.В этом случае обновление драйверов не решит проблему. Но если отключение всего устройства устранило это, вы должны следовать нашему руководству, чтобы проверить свой компьютер на отказ оборудования.

Примечание. Системные прерывания также могут быть вызваны неисправностью источника питания или зарядного устройства ноутбука. Попробуйте заменить или отключить и его.

5. Отключить звуковые эффекты

Если вы используете Windows 7, возможно, это решение, которое вы ищете.

Щелкните правой кнопкой мыши значок динамика на панели задач, выберите Устройства воспроизведения , дважды щелкните устройство по умолчанию (динамик) , чтобы открыть Properties , перейдите на вкладку Enhancements , и Отключить все звуковые эффекты . Подтвердите с помощью OK и проверьте, как сейчас работают системные прерывания.

6. Обновите BIOS

BIOS — это первое программное обеспечение, запускаемое вашей системой при включении компьютера.Это помогает вашей операционной системе загрузиться. Сначала определите свою версию BIOS и посетите веб-сайт производителя для получения обновлений и инструкций по установке.

Чтобы узнать версию BIOS, нажмите клавишу Windows + R , введите cmd , нажмите , введите и выполните следующие две команды одну за другой:

1. systeminfo | findstr / I / c: биос

2.производитель wmic bios, smbiosbiosversion

Обратите внимание, что I в / I — это заглавная буква i , а не строчная L.

Примечание. К обновлению BIOS следует относиться непросто. Обязательно сначала сделайте резервную копию вашей системы.

Системные прерывания могут быть непростыми

Системные прерывания могут иметь множество причин.Вы перезагрузили компьютер, как описано выше? Мы надеемся, что вам удалось решить проблему. Если вы все еще боретесь, обязательно просмотрите (теперь скрытые) комментарии здесь; они содержат множество отчетов от читателей, которые выявили странные причины высокой загрузки ЦП.

Как исправить высокую загрузку ЦП в Windows

Ваш ПК с Windows страдает от высокой загрузки ЦП до 100%? Узнайте, как исправить высокую загрузку ЦП в Windows 10.

Читать далее

Об авторе Тина Зибер (Опубликовано 836 статей)

Получая степень доктора философии, Тина начала писать о потребительских технологиях в 2006 году и никогда не останавливалась.Теперь она также редактор и специалист по оптимизации, вы можете найти ее в Твиттере или прогуляться по близлежащей тропе.

Более От Тины Зибер
Подпишитесь на нашу рассылку новостей

Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!

Нажмите здесь, чтобы подписаться

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *