Используются ли прерывания, чтобы показать, что вывод готов или ввод завершен?

493
Tim

Концепция операционной системы гласит:

Во время ввода / вывода различные контроллеры устройств вызывают прерывания, когда они готовы к работе. Эти прерывания означают

  • этот вывод завершен, или
  • что входные данные доступны, или
  • что сбой был обнаружен.

Используются ли прерывания, чтобы показать, что вывод готов или ввод завершен?

Если нет, нужно ли их обозначать каким-либо другим способом?

Благодарю.

-2
Что должен был сказать ввод? Прерывания - это сигналы от любого устройства * к * ЦП, поэтому они могут сказать: «Я записал ваш буфер в позиции памяти x на диск / сеть / бумагу, вы можете снова использовать его для других целей». С другой стороны, «выход готов» будет означать, что процессор сообщает устройству «Пожалуйста, возьмите данные в позиции x и отправьте их на диск / сеть / бумагу и сообщите мне, как только я смогу повторно использовать эту память»; этот тип сигнализации осуществляется не прерываниями, а портами ввода-вывода Hagen von Eitzen 5 лет назад 1

2 ответа на вопрос

1
Jamie Hanrahan

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

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

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

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

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

Для более сложного примера рассмотрим интерфейс связи с FIFO. Как правило, мы хотим избежать чрезмерных прерываний для хоста; например, прерывание на пакет, вероятно, слишком много. Таким образом, наше устройство может позволить нам сообщить ему о серии буферов, которые должны быть переданы через интерфейс «FIFO» (первым пришел - первым обслужен), и устройство позаботится о перемещении их всех по проводам.

Но мы не обязательно хотим прерывания только тогда, когда все буферы готовы! Было бы лучше, если бы мы получили уведомление, когда, скажем, буфер был заполнен до 20% или 10%. Когда мы получим такое прерывание, мы добавим больше буферов в FIFO (конечно, остановимся, когда оно заполнится). Если бы мы получили прерывание только тогда, когда FIFO был пуст, у нас была бы небольшая задержка, прежде чем мы могли бы получить следующий буфер для передачи, таким образом уменьшая пропускную способность. Давая нам прерывание, когда FIFO «собирается быть» пустым, мы можем устранить эту задержку.

1
Attie

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

Они могут быть как аппаратными (например: напряжение указывает на состояние), так и программными (например: пользователь нажимает Ctrl+ C).

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

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


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

  • UART (т.е. последовательные порты)
    • Кадр получен - это может означать, что хост должен теперь взять полезную нагрузку этого кадра из регистра периферийного устройства и сохранить его до прибытия другого кадра, перезаписав первый.
    • Кадр отправлен - это может означать, что хост теперь может свободно отправлять новые данные в регистр периферийного устройства, вызывая передачу другого кадра
  • Таймеры
    • PWM
      • Счетчик обернулся или достиг своего верхнего предела - используется для сброса сигнала ШИМ
      • Счетчик достиг своего значения сравнения - используется для установки сигнала ШИМ
    • Планирование - используется для выгрузки выполняемой задачи и планирования другой
  • Разделить на ноль - что-то пыталось заставить вселенную взорваться, и было остановлено ... Это прерывание позволяет привести в порядок или исправить действие (например, завершение приложения).

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

  • Часы реального времени - При получении прерывания, хост будет опрашивать один из его регистров, и может определить, что « Alarm 2 » был запущен. Результат этого зависит от системы.
  • Звуковая карта
    • Звуковая карта может иметь буфер, позволяющий хосту создавать блоки аудио, которые карта будет воспроизводить без присмотра. Если этот буфер заканчивается, то хост должен предоставить больше данных, в противном случае буфер будет опустошен (исчерпан) ...
    • Если прерывание не обслуживается вовремя, то вы можете услышать повторяющийся фрагмент звука, как показано здесь при принудительном сбое системы.

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