@David Шварц и @RKT правы, он не принимает каких-либо циклов процессора, чтобы проверить линию прерывания.
В принципе, процессор имеет набор проводов прерываний, которые соединены с кучей устройств. Когда на одном из устройств есть что сказать, он включает провод прерывания, который запускает процессор (без помощи любого программного обеспечения), чтобы приостановить выполнение текущих инструкций и запустить запуск функции обработчика.
Вот как это работает. Когда операционная система загружается, она регистрирует набор обратных вызовов (таблица указателей функций, фактически) с процессором, используя специальную инструкцию, которая берет адрес первой записи таблицы. Когда инициируется прерывание N
, процессор вытягивает N
-й элемент из таблицы и запускает код в том месте, где он относится. Код внутри функции записывается авторами ОС в сборку, но обычно все, что она делает, это сохранение состояния стека и регистров, так что текущая задача может быть возобновлена после того, как обработчик прерывания был вызван, а затем вызывает более высокий уровень общий обработчик прерываний, который написан на C и который обрабатывает логику «Если это ошибка страницы, сделайте X», «Если это прерывание клавиатуры, сделайте Y», «Если это системный вызов, сделайте Z» и т. д. Конечно, есть вариации в этом с разными архитектурами и языками, но суть в этом одна и та же.
Идея с программными прерываниями («сигналы» на языке Unix) одинакова, за исключением того, что ОС выполняет работу по настройке стека для запуска обработчика сигналов. Основная процедура заключается в том, что процесс userland регистрирует обработчики сигналов по одному в OS через системный вызов, который принимает адрес функции обработчика в качестве аргумента, затем некоторое время в будущем ОС распознает, что он должен отправить этот процесс сигнал. В следующий раз, когда этот процесс будет запущен, ОС установит свой указатель на начало функции обработчика и сохранит все его регистры где-то, процесс может восстановить их, прежде чем возобновить выполнение этого процесса. Обычно обработчик будет иметь некоторую логику маршрутизации, чтобы предупредить соответствующий бит кода, что он получил сигнал. Когда процесс завершает выполнение обработчика сигнала, он восстанавливает состояние регистра, существовавшее до выполнения обработчика сигнала, и возобновляет выполнение там, где он был остановлен.Следовательно, программные прерывания также более эффективны, чем опрос, чтобы узнать о событиях, поступающих из ядра в этот процесс (однако это не является механизмом общего использования, поскольку большинство сигналов имеют конкретные применения).
Привет, Спасибо за ответ, но я немного смущен. Что именно означает «CPU прерван». Как ЦП знает, что ему нужно обслуживать прерывание, не проверяя его. – Pratt
Точно так же вы можете знать, когда телефон звонит, не проверяя его. Звонок прерывает вас. Ваш мозг сконструирован таким образом, что когда телефон звонит, что бы он ни делал, он прерывается и замечает, что телефон звонит. Вам не нужно опросить телефон, чтобы узнать, звонит ли он. –
Пример звонка телефона точно отражает мое замешательство. Разве это не значит, что мой мозг «бессознательно» опрокидывает нейроны, прикрепленные к моему уху. – Pratt