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

Содержание

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

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

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

Эти задачи рассматриваются в следующих разделах.

Диспетчеризируемые прерывания или прерывания отложенного вызова процедуры (DeferredProcedureCall, DPC). Когда выполнение потока больше не может продолжаться, возможно, из-за того, что он был завершен или из-за того, что он добровольно вошел в состояние ожидания, ядро напрямую вызывает диспетчер для немедленного переключения контекста.

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

Ядро всегда поднимает IRQL процессора до уровня DPC/dispatch или выше, когда ему нужно синхронизировать доступ к общим структурам ядра. Тем самым блокируются дополнительные программные прерывания и диспетчеризация потоков. Когда ядро обнаруживает необходимость диспетчеризации, оно запрашивает прерывание уровня DPC/dispatch, но процессор задерживает прерывание, поскольку IRQL находится на этом или на более высоком уровне.

Когда ядро завершает свою текущую работу, процессор видит, что оно собирается поставить IRQL ниже уровня DPC/dispatch, и проверяет наличие каких-либо отложенных прерываний диспетчеризации. Если такие прерывания имеются, IRQL понижается до уровня DPC/dispatch, и происходит обработка прерываний диспетчеризации. Активизация диспетчера потоков с помощью программного прерывания является способом, позволяющим отложить диспетчеризацию, пока для нее не сложатся нужные обстоятельства. Но Windows использует программные прерывания для того, чтобы отложить и другие типы обработки.

Кроме диспетчеризации потоков ядро обрабатывает на этом уровне IRQL и отложенные вызовы процедур (DPC). DPC является функцией, выполняющей ту системную задачу, которая менее критична по времени, чем текущая задача.

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

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

Ядро использует DPC-вызовы для обслуживания истечений времени таймера (и освобождения потоков, которые ожидают истечения времени таймеров) и для перепланирования времени использования процессора после истечения времени, выделенного потоку (кванта потока). Драйверы устройств используют DPC-вызовы для обработки прерываний. Для обеспечения своевременного обслуживания программных прерываний Windows совместно с драйверами устройств старается сохранять IRQL ниже IRQL-уровней устройств. Одним из способов достижения этой цели является выполнение ISR-процедурами драйверов устройств минимально необходимой работы для оповещения своих устройств, сохранения временного состояния прерывания и задержки передачи данных или обработки других, менее критичных по времени прерываний для выполнения в DPC-вызовах на IRQL-уровне DPC/dispatch.

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

Они называются DPC-очередями. Для запроса DPC системный код вызывает ядро для инициализации DPC-объекта, а затем помещает этот объект в DPC-очередь.

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

Ядро обрабатывает DPC-вызовы, когда IRQL-уровень процессора готов понизиться с IRQL-уровня DPC/dispatch или более высокого уровня до более низкого IRQL-уровня (APCили passive). Windows обеспечивает пребывание IRQL на уровне DPC/dispatch и извлекает DPC-объекты из очереди текущего процессора до тех пор, пока она не будет исчерпана (то есть ядро «расходует» очередь), вызывая по очереди каждую DPC-функцию. Ядро даст возможность IRQL-уровню упасть ниже уровня DPC/dispatch и позволить продолжить обычное выполнение потока только когда очередь истощится. Обработка DPC изображена на рисунке DPC-приоритеты могут повлиять на поведение системы и другим образом.

Обычно ядро инициирует расход DPC-очереди прерыванием DPC/dispatch-уровня. Ядро генерирует такое прерывание только в том случае, когда DPC-вызов направлен на текущий процессор (тот, на котором выполняется ISR-процедура) и DPC имеет приоритет выше низкого (low). Если DPC имеет низкий приоритет, ядро запрашивает прерывание только в том случае, когда количество невыполненных запросов DPC процессора превышает пороговое значение или если количество DPC-вызовов, выполнение которых запрашивается на процессоре в данном окне времени, невелико.

Доставка DPC-вызова

Если DPC-вызов нацелен на центральный процессор, отличающийся от того, на котором запущена ISR-процедура, и приоритет DPC высокий (high) или выше среднего (medium-high), ядро немедленно сигнализирует целевому центральному процессору (посылая ему диспетчерское IPI) о необходимости расхода его DPC-очереди, но только если целевой процессор находится в режиме ожидания. Если приоритет средний или низкий, то для выдачи ядром прерывания DPC/dispatch количество DPC-вызовов, находящихся в очереди на целевом процессоре, должно превысить определенный порог. Системный поток простоя (idle) также опустошает DPC-очередь того процессора, на котором он запущен. Несмотря на ту гибкость, которую придают системе целевые назначения DPC-вызовов и уровни приоритета, драйверам устройств редко требуется изменять поведение по умолчанию своих DPC-объектов. Ситуации, инициирующие опустошение DPC-очереди, сведены в таблице. Если посмотреть на правила генерации, то, фактически, получается, что приоритеты выше среднего и высокий равны друг другу. Разница проявляется при их вставке в список, когда прерывания высокого уровня находятся впереди, а прерывания уровня выше среднего сзади.

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

Правила генерации DPC-прерывания.

Приоритет DPCDPC-вызов нацеливается на процессор, выполняющий
ISR -процедуру
DPC-вызов нацеливается
на другой процессор
Низкий (Low)Длина DPC-очереди превышает максимальную длину DPC-очереди или уровень DPC-запросов ниже минимального
уровня DPC-запросов
Длина DPC-очереди превышает максимальную длину DPC-очереди или система находится в простое
Средний
(Medium)
ВсегдаДлина DPC-очереди превышает максимальную длину DPC-очереди или система находится в простое
Выше среднего
(Medium-High)
ВсегдаЦелевой процессор простаивает
Высокий (High)ВсегдаЦелевой процессор простаивает

DPC-вызовы предоставляются в первую очередь драйверам устройств, но также используются и ядром. Чаще всего ядро использует DPC для обработки истечения кванта времени. При каждом такте системных часов возникает прерывание на IRQL-уровне clock. Обработчик прерывания от часов (запускаемый на IRQL-уровне clock) обновляет системное время и затем уменьшает показании счетчика, отслеживающего продолжительность работы текущего потока.

Когда счетчик доходит до нуля, квант времени потока истекает, и ядру, возможно, нужно будет перепланировать время процессора, то есть выполнить задачу с более низким приоритетом, которая должна выполняться на IRQL-уровне DPC/dispatch.

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

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

Некоторые DPC-вызовы выполняются настолько долго, что пользователи могут заметить отставание видео или звука или даже ощутить ненормальное замедление реакции мыши или клавиатуры, поэтому для драйверов с продолжительными DPC-вызовами Windows поддерживает потоковые DPC-вызовы.

Потоковые DPC-вызовы, как следует из их названия, предназначены для выполнения DPC-процедуры на пассивном (passive) уровне в потоке с приоритетом реального времени (priority 31). Это позволяет DPC-вызову воспользоваться приоритетом над большинством потоков пользовательского режима (поскольку большинство потоков приложений не запускается в диапазонах приоритетов реального времени). Но это позволяет другим прерываниям, непотоковым DPC-вызовам, APC-вызовам и потокам с более высоким приоритетом реализовать свой приоритет перед данной процедурой.

В чем разница между аппаратным и программным прерыванием — Разница Между

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

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

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

Ключевые области покрыты

1. Что такое аппаратное прерывание
— определение, функциональность
2. Что такое программное прерывание
— определение, функциональность
3. В чем разница между аппаратным и программным прерыванием
— Сравнение основных различий

Основные условия

Прерывание, Аппаратное прерывание, Ядро, Маскируемое прерывание, Немаскируемое прерывание, Программное прерывание


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

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

Существует два типа аппаратных прерываний.

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

Немаскируемое Прерывание — Невозможно отложить эти прерывания. Процессор должен рассмотреть их немедленно.

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

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

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

Всякий раз, когда происходит прерывание (аппаратное или программное обеспечение), ЦПУ прекращает выполнение выполняемых в данный момент программ и действий. Затем выполняется соответствующий обработчик прерывания. Обработчик прерываний также называется подпрограммой обработки прерываний. Это блок кода, связанный с определенным условием прерывания. После обработки прерывания обычные программы выполняются снова.

Разница между аппаратным и программным прерыванием

Определение

Аппаратное прерывание — это прерывание, генерируемое внешним устройством, в то время как программное прерывание — это тип прерывания, вызванного инструкцией в программе. Таким образом, в этом основное отличие аппаратного и программного прерывания.

поколение

Внешние устройства генерируют аппаратные прерывания, а при выполнении инструкций генерируются программные прерывания.

Тип

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

Влияние на счетчик программ

Кроме того, аппаратные прерывания не увеличивают счетчик программ, но программные прерывания увеличивают счетчик программ.

приоритет

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

Заключение

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

Ссылка:

1. Краткая история криптографии — Клиентский портал Red Hat,

Прерывание — Настройка BIOS

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

 

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

 

Механизм прерываний реализован следующим образом:

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

 

Контроллер прерываний (Programmable Interrupt Controller, PIC) – это микросхема (или встроенный в процессор модуль), которая выполняет обработку запросов на прерывание от различных устройств.

 

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

 

Классификация прерываний.

 

1. Немаскируемые прерывания (Non-Maskable Interrupt, NMI). Прерывания с высшим приоритетом. Прерывания данного типа обрабатываются в случаях возникновения аварийных ситуаций, вызванных ошибками в работе памяти или других устройств.

 

2. Маскируемые (аппаратные) прерывания. В эту группу относят прерывания от периферийных устройств. Обрабатываются контроллером прерываний. Стандартный контроллер прерываний позволяет обращаться к 16 прерываниям от различных устройств. Сегодня имеется возможность использовать расширенный контроллер прерываний APIC.

 

APIC (Advanced Programmable Interrupt Controller) – расширенный программируемый контроллер прерываний, позволяющий использовать 24 аппаратных прерываний вместо 16.

 

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

 

Аппаратные прерывания и зарезервированные за ними устройства

 

Номер

Прерывания

Устройство

0

Системный таймер

1

Клавиатура

2

Контроллер прерываний

3

Порт СОМ1

4

Порт СОМ2

5

Нет

6

Контроллер дисковода для дискет

7

Порт LPT

8

Часы реального времени RTC

9

Нет

10

Нет

11

Нет

12

Мышь PS/2

13

Математический сопроцессор

14

Первичный канал контроллера IDE

15

Вторичный канал контроллера IDE

 

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

Опции BIOS Setup для настройки прериваний находятся здесь.


Еще по настройке БИОС (БИОЗ) плат:

  • PCI Express, (или PCIe, или PCI-E) – это компьютерная шина расшир…

  • PCI (Peripheral Component Interconnect) – это компьютерная шина в…

  • FSB (Front Side Bus, системная шина) – это шина (набор сигнальных…

  • Чипсет (chipset) – это набор микросхем (размещенных на системной …

  • Центральный процессор (ЦП, CPU) – это микросхема, которая явля…

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

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

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

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

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

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

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

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

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

Рис. 4.12. Неупорядоченная обработка прерываний

ПРИМЕЧАНИЕ 

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

Функции централизованного диспетчера прерываний на примере Windows NT

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

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

Диспетчер прерываний Windows NT (так называемый Trap Handler) работает с программной моделью прерываний, единой для всех аппаратных платформ, поддерживаемых Windows NT. Все источники прерываний (аппаратных и программных, а также некоторых важных для системы исключений, например исключения по ошибке шины) делятся на несколько классов, и каждому классу присваивается уровень запроса прерывания — Interrupt Request Level, IRQL Этот уровень и представляет приоритет данного класса. Операционная система программным способом поддерживает внутреннюю переменную, называемую IRQL выполняемого процессором кода, которая по назначению соответствует уровню прерывания процессора. Если процессор, на котором работает ОС, поддерживает такую переменную, то она используется и IRQL выполняемого кода отображается на нее, в противном случае соответствующие функции процессора эмулируются программно.

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

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

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

В Windows NT низший уровень IRQL соответствует обычным потокам, назначаемым на выполнение диспетчером потоков (рис. 4.13). Это является некоторым допущением, так как код потоков начинает выполняться процессором не в результате запроса на прерывание, но это допущение хорошо работает, поскольку позволяет любому «настоящему» запросу прерывать код обычного потока.

Рис. 4.13. Диспетчеризация прерываний в Windows NT

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

Прерывания от внешних устройств занимают промежуточные уровни IRQL. Конкретное соотношение между приоритетами внешних устройств определяется приоритетами, задаваемыми аппаратной платформой, например уровнем IRQ шины PCI, назначенным устройству.

Особую роль в работе вычислительной системы играет системный таймер: на основании его прерываний обновляются системные часы, определяющие очередной момент вызова планировщика потоков, момент выдачи управляющего воздействия потоком реального времени и многое другое. Ввиду важности немедленной обработки прерываний от таймера, ему в Windows NT дан весьма высокий уровень приоритета — более высокий, чем уровень любого устройства ввода-вывода.

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

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

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

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

Второе название диспетчерского уровня, DPC, являясь аббревиатурой от Deffered Procedure Call (вызов отложенной процедуры), говорит о том, что на этом уровне ожидают своей очереди отложенные вызовы и других процедур ОС, а не только планировщика/диспетчера. Процедуры ОС могут вызывать друг друга и непосредственно, но при многослойном построении ядра существуют более и менее приоритетные процедуры, и вызов менее приоритетных процедур из более приоритетных с помощью механизма программных прерываний позволяет, как и в случае с планировщиком, упорядочить во времени их выполнение, что оптимизирует работу ОС в целом. Примером процедур ОС, работающих на высоком приоритетном уровне, являются те части драйверов устройств ввода-вывода, которые выполняют короткие, но критичные ко времени реакции действия. В то же время существуют и другие части драйверов, которые выполняют менее срочную, но более объемную работу1. В Windows NT такие части драйверов оформляют как процедуры, вызываемые с помощью программных прерываний уровня «диспетчерский/DPC» (ВРОпроцедуры), а само программное прерывание выполняет критичная часть драйвера. Естественно, существуют и другие модули ОС, оформляемые подобным образом.

Программное прерывание — Большая Энциклопедия Нефти и Газа, статья, страница 2

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

Cтраница 2


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

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

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

Программные прерывания ппп 200 дополнительно содержат старое RSW ( слово состояния программ), которое сохраняет всю информацию о состоянии программы в момент прерывания.  [20]

Любое программное прерывание регистрируется операционной системой, и управление в этом случае может быть передано на программу, обрабатывающую это прерывание. В языке ПЛ / 1 имеется средство — оператор ON, с помощью которого программист может определить действие при возникновении исключительной ситуации. Действие должно быть выполнено, если в результате возникновения этой ситуации произойдет прерывание программы.  [21]

Произошло программное прерывание в программе, отличающейся от SVC-программы первого типа или обработчика прерываний ввода-вывода, и не указана программа обработки прерываний этого типа; х — код программного прерывания.  [22]

Каждое программное прерывание имеет шестнадцатеричный номер — код прерывания.  [23]

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

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

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

Причиной программных прерываний служит неправильное описание используемых устройств вычислительной машины, неверное использование команд или данных, запрос на управление системой от монитора. Шестнадцать возможных программных прерываний перечислены в табл. 3.4 Код прерывания располагается в битах 16 — 31 PSW. Из всех 16 программных прерываний 4 могут быть запрещены путем занесения 1 в соответствующий бит с 36 по 39 PSW. Этими прерываниями являются прерывания от переполнения с фиксированной запятой, десятичного переполнения, потери значимости и исчезновения порядка, как это показано на рис. 3.11; остальные программные прерывания запретить нельзя. Возможность управления системой от монитора также осуществляется через систему программных прерываний. Описание монитора приведено в следующем разделе.  [27]

Большинство программных прерываний происходит в результате возникновения совершенно определенных ситуаций, которые в языке ПЛ / 1 имеют свои имена.  [28]

Часть программных прерываний может маскироваться. К ним относятся переполнение с фиксированной запятой, десятичное переполнение, исчезновение порядка, потеря значимости в операциях с плавающей запятой.  [29]

Для программных прерываний необходимо определить тип ошибки и номер Р2 программы, обрабатывающей этот тип ошибки. С помощью управляющих таблиц определяется номер задачи, которой подчинена Р2 программа. Управление передается программе РЗ Согласование, которая инициирует для найденной Р2 программы задачу и установит для нее цепочку связей. Программа Согласование относится к Супервизору задач.  [30]

Страницы:      1    2    3    4

Система прерываний

Чтобы устройства, входящие в состав компьютера, могли взаимодействовать с центральным процессором, в IBM-совместимых компьютерах предусмотрена система прерываний (Interrupts).

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

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

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

В IBM PC-совместимых компьютерах имеется два вида прерываний: аппаратные (Hardware interrupts) и программные (Software interrupts). К аппаратным относятся, в первую очередь, прерывания, встроенные в процессор — прерывания при делении на ноль, прерывания при аварии питания и т. п. К аппаратным также относятся прерывания, с помощью которых процессору сообщается об аппаратных событиях, например, уже упомянутых отсутствии бумаги в принтере или окончании дисковой операции.

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

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

Для простой и эффективной локализации процедуры обслуживания прерываний служит таблица векторов прерываний, содержащаяся в первых ячейках памяти компьютера. Вектор — это полный адрес памяти (4 байта) той процедуры, которая вызывается при появлении запроса на прерывание. Таким образом, в таблице векторов прерываний в ячейках памяти с 0 по 3 находится адрес программы обработки прерывания с номером 0, в ячейках памяти с 4 по 7 — адрес программы обработки с номером I и т. д.

В IBM PC-совместимых компьютерах управление аппаратными прерываниями осуществляется специальными микросхемами- контроллерами прерываний. Как уже отмечалось, на современных материнских платах контроллеры прерываний интегрированы в микросхему контроллера периферии Chipset.

В PC XT с восьмиразрядной шиной ISA имелось только 8 внешних аппаратных прерываний. В PC АТ с процессором 80286 количество линий прерываний было увеличено вдвое благодаря использованию уже двух контроллеров прерываний.

Каждый из контроллеров имеет по 8 входных линий для приема запросов на прерывание. Линии запроса на прерывание называются IRQ (Interrupt-Requests). Прерывания, используемые вторым контроллером, подаются на неиспользованный вход IRQ 2 первого (рис. 5.15).

Рис. 5.15. Назначение аппаратных прерываний Каждая линия имеет свой приоритет. Наивысший приоритет соответствует линии IRQ 0. Отметим, что контроллеры прерываний включены таким образом, что линии IRQ 8-IRQ 15 имеют приоритет ниже приоритета линии IRQ 2, но выше IRQ 3. Каждой линии IRQ соответствует вектор прерываний, указывающий местонахождение процедуры обслуживания запроса на прерывание в ROM BIOS. Линиям IRQ 1-IRQ 7 соответствуют векторы прерываний от 8Н до 0FH, а линиям IRQ 8-IRQ 15 — векторы от 70Н до 77Н.

Часть линий прерываний резервируется системой, а часть может быть предоставлена для использования дополнительным оборудованием, необходимым пользователю. Так, например, IRQ 13 отводится для математического сопроцессора и оно не может быть использовано другим устройством, даже если математический сопроцессор не установлен. Обычно для IBM РС-со-вместимых компьютеров свободны IRQ 3, IRQ 5, IRQ 7, IRQ 10, IRQ 11 и IRQ 12. Стандартное распределение аппаратных прерываний приведено в табл. 5.8.

Таблица 5.8. Стандартное распределение аппаратных прерываний

IRQ

Назначение

Тип адаптера

00

Прерывание от таймера

01

Прерывание от клавиатуры

02

Связь со вторым контроллером прерывания (каскадное прерывание)

03

COM2, COM4

8- или 16-разрядный

04

СОМ1, COM3

8- или 16-разрядный

05

LPT2 или звуковая карта

8- или 16-разрядный

06

Контроллер дисковода

8- или 16-разрядный

07

LPT1

8- или 16-разрядный

08

Текущее время

09

Свободен или сетевая карта

8- или 16-разрядный

10

Свободен

16-разрядный

11

Свободен, SCSI адаптер или поддержка IRQ для управления PCI

16-разрядный

Таблица 5.8 (окончание)

IRQ

Назначение

Тип адаптера

12

Свободен и порт мыши Bus Mouse

16-разрядный

13

Сопроцессор

14

Первичный IDE (контроллер винчестера)

16-разрядный

15

Вторичный IDE (контроллер винчестера)

16-разрядный

⇐Системные ресурсы | Аппаратные средства PC | Прямой доступ к памяти⇒

Назначение и типы прерываний — Информатика, информационные технологии

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

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

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

— внешние;

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

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

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

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

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

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

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

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

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

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

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

При использовании опрашиваемых прерываний процессор получает от запросившего прерывание устройства только информацию об уровне приоритета прерывания (например, номере IRQ на шине ISA или номере IPL на шине SBus компьютеров SPARC). С каждым уровнем прерываний может быть связано несколько устройств и соответственно несколько программ – обработчиков прерываний. При возникновении прерывания процессор должен определить, какое устройство из тех, которые связаны с данным уровнем прерываний, действительно запросило прерывание. Это достигается вызовом всех обработчиков прерываний для данного уровня приоритета, пока один из обработчиков не подтвердит, что прерывание пришло от обслуживаемого им устройства. Если же с каждым уровнем прерываний связано только одно устройство, то определение нужной программы обработки прерывания происходит немедленно, как и при векторном прерывании. Опрашиваемые прерывания поддерживают шины ISA, EISA, MCA, PCI и Sous.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Диспетчер прерываний Windows NT (так называемый Trap Handler) работает с программной моделью прерываний, единой для всех аппаратных платформ, поддерживаемых Windows NT. Все источники прерываний (аппаратных и программных, а также некоторых важных для системы исключений, например исключения по ошибке шины) делятся на несколько классов, и каждому классу присваивается уровень запроса прерывания – Interrupt Request Level (IRQL). Этот уровень и представляет приоритет данного класса. Операционная система программным способом поддерживает внутреннюю переменную, называемую IRQL выполняемого процессором кода, которая по назначению соответствует уровню прерывания процессора. Если процессор, на котором работает ОС, поддерживает такую переменную, то она используется и IRQL выполняемого кода отображается на нее, в противном случае соответствующие функции процессора эмулируются программно.

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

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

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

В Windows NT низший уровень IRQL соответствует обычным потокам, назначаемым на выполнение диспетчером потоков (рис. 13). Это является некоторым допущением, так как код потоков начинает выполняться процессором не в результате запроса на прерывание. Однако это допущение хорошо работает, поскольку позволяет любому “настоящему” запросу прерывать код обычного потока.

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

Прерывания от внешних устройств занимают промежуточные уровни IRQL. Конкретное соотношение между приоритетами внешних устройств определяется приоритетами, задаваемыми аппаратной платформой, например уровнем IRQ шины PCI, назначенным устройству.

Особую роль в работе вычислительной системы играет системный таймер: на основании его прерываний обновляются системные часы, определяющие очередной момент вызова планировщика потоков, момент выдачи управляющего воздействия потоком реального времени и многое другое. Ввиду важности немедленной обработки прерываний от таймера, ему в Windows NT дан весьма высокий уровень приоритета – более высокий, чем уровень любого устройства ввода-вывода.

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

Программные прерывания, обслуживающие системные вызовы от приложений, выполняются с низшим уровнем приоритета, что соответствует концепции продолжения одного и того же процесса, но только в системной фазе, при выполнении системного вызова. А вот для программных прерываний, исходящих от модулей ядра ОС, отводится более высокий уровень запросов, имеющий двойное название “диспетчерский/DPC”. Этот уровень приоритета называется диспетчерским, потому что именно в эту очередь помещаются программные запросы, вызывающие диспетчер потоков. Часто при обработке высокоприоритетных прерываний возникает ситуация, требующая перепланирования потоков. Например, при обработке очередного прерывания от таймера нужно проверить, не исчерпан ли квант, выделенный текущему потоку. Другим примером может служить обработка прерывания от контроллера диска после завершения дисковой операции, которую могут ждать несколько потоков. Во всех таких ситуациях в Windows NT планировщик/диспетчер вызывается высокоуровневыми процедурами ядра не прямо посредством вызова процедуры, а косвенно, с помощью программного прерывания. Это дает возможность отделить короткую, но требующую быстрой реакции системы процедуру обслуживания высокоприоритетного прерывания (например, наращивание системных часов), от менее критичной операции перепланирования пользовательских потоков. Прямой вызов планировщика/диспетчера потоков такой возможности бы не дал, и критичные запросы прерывания от контроллеров устройств ввода-вывода вынуждены были бы ждать, пока отработает планировщик. При этом планировщик, возможно, выбрал бы для выполнения другой поток, если бы работал после процедур обслуживания аппаратных прерываний, так как он получил бы свежие сведения о завершении некоторых операций ввода-вывода. Помещение вызова планировщика потоков в очередь позволяет выполнять его только в тех ситуациях, когда в системе отсутствуют ожидающие аппаратные запросы прерываний.

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

Второе название диспетчерского уровня – DPC (Deffered Procedure Call – вызов отложенной процедуры), говорит о том, что на этом уровне ожидают своей очереди отложенные вызовы и других процедур ОС, а не только планировщика/диспетчера. Процедуры ОС могут вызывать друг друга и непосредственно, но при многослойном построении ядра существуют более и менее приоритетные процедуры, и вызов менее приоритетных процедур из более приоритетных с помощью механизма программных прерываний позволяет, как и в случае с планировщиком, упорядочить во времени их выполнение, что оптимизирует работу ОС в целом. Примером процедур ОС, работающих на высоком приоритетном уровне, являются те части драйверов устройств ввода-вывода, которые выполняют короткие, но критичные ко времени реакции действия. В то же время существуют и другие части драйверов, которые выполняют менее срочную, но более объемную работу. В операционных системах семейства UNIX эти части называют соответственно верхними половинами (top half) и нижними половинами (bottom half) обработчика прерываний. В Windows NT такие части драйверов оформляют как процедуры, вызываемые с помощью программных прерываний уровня “диспетчерский/DPC” (DPC-процедуры), а само программное прерывание выполняет критичная часть драйвера. Естественно, существуют и другие модули ОС, оформляемые подобным образом.

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

Важной особенностью процедур, выполняемых по запросам прерываний, является то, что они выполняют работу, чаще всего никак не связанную с текущим процессом. Например, драйвер диска может получить управление после того, как контроллер диска записал в соответствующие сектора информацию, полученную от процесса А, но этот момент времени, скорее всего, не совпадет с периодом очередной итерации выполнения процесса А или его потока. В наиболее типичном случае процесс А будет находиться в состоянии ожидания завершения операции ввода-вывода (при синхронном режиме выполнения этой операции) и драйвер диска прервет какой-либо другой процесс, например процесс В. В Windows NT процедуры, вызываемые как DPC, также могут работать в контексте процесса, отличающегося от того, для которого они выполняют свои функции. В некоторых случаях вообще трудно однозначно определить, для какого процесса выполняет работу тот или иной программный модуль ОС, например планировщик потоков. Поэтому для такого рода процедур вводятся ограничения – они не имеют права использовать ресурсы (память, открытые файлы и т.п.), с которыми работает текущий процесс, или же от имени этого процесса запрашивать выделение дополнительных ресурсов. Процедуры обработки прерываний работают с ресурсами, которые были выделены им при инициализации соответствующего драйвера или инициализации самой операционной системы. Эти ресурсы принадлежат операционной системе, а не конкретному процессу. В частности, память выделяется драйверам из системной области, т.е. той области, на которую отображаются сегменты из общей части виртуального адресного пространства всех процессов. Поэтому обычно говорят, что процедуры обработки прерываний работают вне контекста процесса. Поскольку все подобные процедуры являются частью операционной системы, ответственность за соблюдение этих ограничений несет системный программист. Заставить свои модули выполнять эти ограничения ОС не может.

Хороший пример того, что не бывает правил без исключений, предоставляет нам ОС Windows NT. В ней существуют процедуры обработки прерываний, которые выполняются всегда в контексте определенного процесса. Это процедуры, вызываемые с помощью программного прерывания АРС (Asynchronous Procedure Call – вызов асинхронной процедуры). Для них в диспетчере прерываний предусмотрен свой уровень приоритета IRQL, выше уровня для обычного кода, но ниже уровня DPC. Эти процедуры могут прервать текущий код и выполниться при соблюдении двух условий: текущий код имеет низший уровень приоритета (т.е. выполняется обычный код), текущим процессом является вполне определенный процесс, описатель которого был задан в запросе на прерывание для данной процедуры АРС. Процедуры АРС могут пользоваться ресурсами текущего процесса, для чего они и были введены. Основное назначение АРС-процедур – перемещение данных, полученных драйвером от какого-либо устройства ввода-вывода, из памяти системной области памяти, куда они помещаются после считывания из регистров контроллера этого устройства, в индивидуальную часть адресного пространства процесса, запросившего операцию ввода-вывода. Такое действие постоянно выполняется системой ввода-вывода, и для его реализации были введены такие специфические процедуры обработки прерываний, как АРС.

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

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

Реализация системных вызовов должна удовлетворять следующим требованиям:

— обеспечивать переключение в привилегированный режим;

— обладать высокой скоростью вызова процедур ОС;

— обеспечивать по возможности единообразное обращение к системным вызовам для всех аппаратных платформ, на которых работает ОС;

— допускать легкое расширение набора системных вызовов;

— обеспечивать контроль со стороны ОС за корректным использованием системных вызовов.

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

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

В большинстве ОС системные вызовы обслуживаются по централизованной схеме, основанной на существовании диспетчера системных вызовов (рис. 14, б). При любом системном вызове приложение выполняет программное прерывание с определенным и единственным номером вектора. Например, ОС Linux использует для системных вызовов команду INT 80h, а ОС Windows NT (при работе на платформе Pentium) – INT 2Eh. Перед выполнением программного прерывания приложение тем или иным способом передает операционной системе номер системного вызова, который является индексом в таблице адресов процедур ОС, реализующих системные вызовы (таблица sysent на рис. 14). Способ передачи зависит от реализации, например номер можно поместить в определенный регистр общего назначения процессора или передать через стек (в этом случае после прерывания и перехода в привилегированный режим их нужно будет скопировать в системный стек из пользовательского, это действие в некоторых процессорах автоматизировано). Также некоторым способом передаются аргументы системного вызова, они могут как помещаться в регистры общего назначения, так и передаваться через стек или массив, находящийся в оперативной памяти. Массив удобен при большом объеме данных, передаваемых в качестве аргументов, при этом в регистре общего назначения указывается адрес этого массива.

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

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

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

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

Для ускорения выполнения некоторых достаточно простых системных вызовов, которым к тому же не требуется работа в привилегированном режиме, требуемая работа полностью выполняется библиотечной функцией, которую несправедливо называть в данном случае заглушкой. Точнее, такая функция не является системным вызовом, а представляет собой “чистую” библиотечную функцию, выполняющую всю свою работу в пользовательском режиме в виртуальном адресном пространстве процесса, но прикладной программист может об этом и не знать – для него системные вызовы и библиотечные функции выглядят единообразно. Прикладной программист имеет дело с набором функций прикладного программного интерфейса – API (например, Win32 или POSIX), – состоящего и из библиотечных функций, часть из которых пользуется для завершения работы системными вызовами, а часть – нет.

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

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

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

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

Статьи к прочтению:

Лекция 11: Прерывания


Похожие статьи:
  • Прерывание и типы прерываний

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

  • Организация обработки прерываний в эвм

    Прерывание — это прекращение выполнения текущей команды или текущей последовательности команд для обработки некоторого события специальной программой -…

Определение программного прерывания Linux Information Project (LINFO)

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

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

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

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

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

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

Создано 25 апреля 2006 г.
Copyright © 2006 The Linux Information Project. Все права защищены.

Разница между аппаратным прерыванием и программным прерыванием

Необходимое условие — прерывания в микропроцессоре 8085
1. Аппаратное прерывание:
Аппаратное прерывание вызвано каким-либо аппаратным устройством, таким как запрос на запуск ввода-вывода, аппаратный сбой или что-то подобное. Аппаратные прерывания были введены как способ избежать траты драгоценного времени процессора на циклы опроса в ожидании внешних событий.

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

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

Например, вывод на экран, выполнение файла и т. Д.



Разница между аппаратным и программным прерыванием:

SR.NO. Аппаратное прерывание Программное прерывание
1 Аппаратное прерывание — это прерывание, генерируемое внешним устройством или оборудованием. Программное прерывание — это прерывание, которое генерируется любой внутренней системой компьютера.
2 Не увеличивает счетчик программ. Увеличивает счетчик программ.
3 Аппаратное прерывание может быть вызвано каким-либо внешним устройством, например запросом на запуск ввода-вывода или возникновением аппаратного сбоя. Программное прерывание может быть вызвано с помощью инструкции INT.
4 Он имеет самый низкий приоритет, чем программные прерывания. Он имеет самый высокий приоритет среди всех прерываний.
5 Аппаратное прерывание запускается внешним оборудованием и считается одним из способов связи с внешними периферийными устройствами, оборудованием. Программное прерывание запускается программным обеспечением и считается одним из способов взаимодействия с ядром или запуска системных вызовов, особенно во время обработки ошибок или исключений.
6 Это асинхронное событие. Это синхронное событие.
7 Аппаратные прерывания можно разделить на два типа: 1.Маскируемое прерывание. 2. Немаскируемое прерывание. Программные прерывания можно разделить на два типа: 1. Нормальные прерывания. 2. Исключение
8 Нажатие клавиш и движения мыши являются примерами аппаратного прерывания. Все системные вызовы являются примерами программных прерываний

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

Программные прерывания
Далее: Сообщение передается Up: Межпроцессное взаимодействие Предыдущий: Общая память

Мы можем ввести вызов службы, который позволит одному обработать вызвать программное прерывание в другом:

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

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

Программные обработчики прерываний и исключений вызываются в пользовательском пространстве. В ответ на вызов вызывается программный обработчик прерывания. системного вызова. Номера программных прерываний определяются операционной системой. Исключения определяются и обрабатываются языком программирования. Исключение, возникшее в некотором блоке b некоторого процесса p, может быть перехвачено обработчиком в том же блок или блок / процедура (в p) по статическим / динамическим ссылкам из b, или процессом q, который (прямо или косвенно) разветвлял p.Создатель исключения не определяет, какой процесс должен его обработать, поэтому исключения не являются механизмами IPC.

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

int 16H
 
выполняет процедуру прерывания BIOS для обработки текущего символа получил с клавиатуры.(Он выполняется обработчиком прерывания ядра Xinu, чтобы запросить BIOS ПК обработчик для извлечения символа с клавиатуры.) Термин прерывание используется потому, что эти процедуры обычно называются с помощью программ аппаратного прерывания. Мы используем термин программные прерывания для обозначения того, что Unix называет сигналами, которые не следует путать с семафорами, хотя вы вызываете сигнал операция на обоих!

Далее: Сообщение передается Up: Межпроцессное взаимодействие Предыдущий: Общая память
Прасун Деван 2006-02-02

Software Interrupt — обзор

7.6 Вызов супервизора и отложенный вызов службы

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

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

РИСУНОК 7.15. SVC как шлюз для функций ОС.

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

SVC # 0x3; Вызов функции SVC 3

Допускается также традиционный синтаксис SVC (без символа «#»):

SVC 0x3; Вызов функции SVC 3

Для разработки языка C инструкция SVC может быть сгенерирована с использованием функции __svc (для компилятора ARM RealView C или KEIL Microcontroller Development Kit для ARM) или с использованием встроенной сборки в других компиляторах C.

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

SVC и инструкция программного прерывания (ARM7)

Если вы использовали традиционные процессоры ARM (например, ARM7), вы могли знать, что у них есть инструкция программного прерывания (SWI).SVC имеет аналогичную функцию, и на самом деле двоичное кодирование инструкций SVC такое же, как SWI в ARM7. Однако, поскольку модель исключения изменилась, эта инструкция переименована, чтобы программисты правильно переносили программный код с ARM7 на Cortex-M3.

Из-за модели приоритета прерывания в Cortex-M3 вы не можете использовать SVC внутри обработчика SVC (потому что приоритет такой же, как текущий приоритет). Это приведет к ошибке использования. По той же причине нельзя использовать SVC в обработчике NMI или обработчике аппаратных сбоев.

PendSV (Pendable Service Call) работает с SVC в ОС. Хотя SVC (с помощью инструкции SVC) не может быть отложен (приложение, вызывающее SVC, ожидает немедленного выполнения требуемой задачи), PendSV может быть отложен и полезен для ОС, чтобы отложить исключение, чтобы действие могло быть выполнено после другого важного задачи выполнены. PendSV генерируется записью 1 в бит PENDSVSET в регистре состояния управления прерываниями NVIC.

Типичное использование PendSV — переключение контекста (переключение между задачами).Например, в системе могут быть две активные задачи, и переключение контекста может запускаться следующим образом:

Вызов функции SVC

Системный таймер (SYSTICK)

Давайте рассмотрим простой пример наличия только двух задач в системе, а переключение контекста запускается исключениями SYSTICK (см. рис. 7.16).

РИСУНОК 7.16. Простой сценарий с использованием SYSTICK для переключения между двумя задачами.

Если запрос прерывания происходит до исключения SYSTICK, исключение SYSTICK вытесняет обработчик IRQ. В этом случае ОС не должна выполнять переключение контекста. В противном случае процесс обработчика IRQ будет отложен, и для Cortex-M3 может возникнуть ошибка использования, если ОС попытается переключиться в режим потока при активном прерывании (см. Рисунок 7.17).

РИСУНОК 7.17. Проблема с переключением контекста в IRQ.

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

Исключение PendSV решает проблему, задерживая запрос переключения контекста до тех пор, пока все остальные обработчики IRQ не завершат свою обработку. Для этого PendSV запрограммирован как исключение с самым низким приоритетом. Если ОС обнаруживает, что IRQ в настоящее время активен (обработчик IRQ запущен и вытесняется SYSTICK), она откладывает переключение контекста, ожидая исключения PendSV.На рисунке 7.18 показан пример переключения контекста со следующей последовательностью событий:

1.

Задача A вызывает SVC для переключения задачи (например, ожидая завершения некоторой работы).

2.

ОС принимает запрос, готовится к переключению контекста и ожидает исключения PendSV.

3.

Когда ЦП выходит из SVC, он немедленно входит в PendSV и выполняет переключение контекста.

4.

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

5.

Возникает прерывание и вводится обработчик прерывания.

6.

При выполнении подпрограммы обработчика прерывания возникает исключение SYSTICK (для тика ОС).

7.

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

8.

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

9.

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

10.

По завершении PendSV программа возвращается на уровень потока; на этот раз он возвращается к задаче A и продолжает обработку.

РИСУНОК 7.18. Пример переключения контекста с помощью PendSV.

4.2: Механизмы прерывания — распознавание вектора и приоритет прерывания

Введение

В следующем разделе учащегося знакомятся с прерываниями, возникающими в программируемом вводе-выводе

.

Сведения о деятельности

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

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

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

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

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

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

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

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

Прерывания можно разделить на следующие типы:

  • Маскируемое прерывание (IRQ): аппаратное прерывание, которое можно игнорировать, установив бит в битовой маске регистра маски прерывания (IMR).
  • Немаскируемое прерывание (NMI): аппаратное прерывание, которое не имеет связанной битовой маски, поэтому его нельзя игнорировать. NMI используются для задач с наивысшим приоритетом, таких как таймеры, особенно сторожевые таймеры.
  • Межпроцессорное прерывание (IPI): особый случай прерывания, которое генерируется одним процессором для прерывания другого процессора в многопроцессорной системе.
  • Программное прерывание: прерывание, генерируемое процессором при выполнении инструкции.Программные прерывания часто используются для реализации системных вызовов, поскольку они приводят к вызову подпрограммы с изменением уровня звонка ЦП.
  • Ложное прерывание: нежелательное аппаратное прерывание. Обычно они возникают из-за системных условий, таких как электрические помехи на линии прерывания или из-за неправильно спроектированного оборудования.

Заключение

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

Оценка

Кратко опишите аппаратное и программное обеспечение. Прерывания

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

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

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

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

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

Эти прерывания не отправляются напрямую в ЦП, а отправляются на интегральную схему, чьей функцией является исключительная обработка прерываний этого типа

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

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

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

Чем отличаются программные прерывания / исключения

Позвольте мне подробнее рассказать о хорошем ответе @Tymski.


Начнем с обзора аппаратных прерываний .

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


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


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


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


Как говорит @Tymski, эти термины часто меняются местами, иногда ошибочно, но также иногда из-за контекста.

Как ядро ​​Linux обрабатывает прерывания

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

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

Определения

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

В прошлом IRQ обрабатывались отдельным микрочипом — PIC — и устройства ввода / вывода подключались напрямую к PIC.PIC управляет различными аппаратными IRQ и может напрямую общаться с ЦП. Когда произошло прерывание, PIC записал данные в ЦП и поднял вывод запроса прерывания ( INTR ).

В настоящее время IRQ обрабатываются усовершенствованным программируемым контроллером прерываний ( APIC ), который является частью ЦП. Каждое ядро ​​имеет собственный APIC.

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

Как я уже упоминал, прерывания можно разделить на три типа в зависимости от их источника:

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

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

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

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

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

Исключения

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

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

  • Неисправности: Неисправности — это исключения, которые система может исправить, например.g., когда процесс пытается получить доступ к данным со страницы памяти, которая была перенесена на жесткий диск. Запрошенный адрес находится в адресном пространстве процесса, и права доступа правильные. Если страница отсутствует в ОЗУ, возникает прерывание прерывания и запускается обработчик исключения ошибки страницы для загрузки нужной страницы памяти в ОЗУ. Если операция прошла успешно, выполнение продолжится.
  • Ловушки: Ловушки в основном используются для отладки. Если вы устанавливаете точку останова в программе, вы вставляете специальную инструкцию, которая запускает ловушку.Ловушка может инициировать переключение контекста, которое позволяет вашему отладчику читать и отображать значения локальных переменных. После этого казнь может быть продолжена. Ловушки также являются стандартным способом выполнения системных вызовов (например, убийства процесса).
  • Прерывания: Прерывания вызваны отказом оборудования или несогласованными значениями в системных таблицах. При прерывании не указывается местонахождение инструкции, вызвавшей исключение. Это наиболее важные прерывания. Прерывание вызывает системный обработчик исключения прерывания , который завершает процесс, вызвавший его.

Практическое руководство

IRQ упорядочены по приоритету в векторе APIC (0 = наивысший приоритет). Первые 32 прерывания (0–31) имеют фиксированную последовательность, определяемую ЦП. Вы можете найти их обзор на странице исключений OsDev. Последующие IRQ могут быть назначены по-другому. Таблица дескрипторов прерываний ( IDT ) содержит назначение между IRQ и ISR. Linux определяет вектор IRQ от 0 до 256 для назначения.

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

  cat / proc / interrupts  

Вы должны увидеть что-то вроде этого:

Слева направо столбцы: вектор IRQ, количество прерываний на ЦП ( 0.. n ), аппаратный источник, информация о канале аппаратного источника и имя устройства, вызвавшего IRQ.

Внизу таблицы есть несколько нечисловых прерываний. Это прерывания, зависящие от архитектуры, такие как прерывание локального таймера ( LOC ) на IRQ 236. Некоторые из них указаны в векторном макете Linux IRQ в дереве исходных текстов ядра Linux.

Чтобы просмотреть эту таблицу в реальном времени, запустите:

  смотреть -n1 "cat / proc / interrupts"  

Заключение

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

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

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