В чем разница между прерыванием и прерыванием?

Ответы:

203

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

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

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

Аарон Дигулла
источник
5
Интересно, что lxr.free-electrons.com/source/arch/x86/kernel/… деление на ноль инициализируется как аппаратное прерывание, почему так?
Алекс Креймер
8
Потому что это действительно прерывание, которое ЦП посылает, когда АЛУ находит эту проблему. Так же, как ошибка сегментации. Однако не все математические ошибки вызывают прерывания (переполнение - нет).
Аарон Дигулла
4
В этом есть смысл. Но то, что немного сбивает с толку, так это то, что в более ранних версиях Linux он был инициализирован как программная ловушка: set_trap_gate (0, &div_error);
Алекс Креймер
11
Что вы имеете в виду, « немного сбивает с толку»? Это очень запутанно :-) Проблема здесь в том, что деление на ноль - это аппаратное прерывание (IRQ / vector 0), но у разработчиков ядра есть несколько вариантов, как его обработать. Таким образом, от пользовательского процесса это ловушка, но со стороны процессора это прерывание. Кто прав? Никто? Обе?
Аарон Дигулла
3
Конечно, это верно только для процессоров x86. Другие процессоры работают по-другому.
Аарон Дигулла
110

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

Intel x86 определяет две перекрывающиеся категории: векторные события ( прерывания против исключений ) и классы исключений ( ошибки против ловушек против прерываний ).

Все цитаты в этом посте взяты из версии Руководства разработчика программного обеспечения Intel за апрель 2016 года . Для (окончательной и сложной) точки зрения x86 я рекомендую прочитать главу SDM об обработке прерываний и исключений.

Векторные события

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

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

Прерывания

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

Исключения

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

Классификация исключений

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

Сводка: ловушки увеличивают указатель инструкции, ошибки - нет, а прерывает 'взорвать'.

ловушка

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

Fault

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

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

Прервать

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

Краевые Чехлы

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

ruthafjord
источник
6
Это такой хороший ответ, я был уверен, что очередь проверки «Поздний ответ от нового пользователя» давала мне тест, чтобы убедиться, что я обращаю внимание.
Нумен
1
Спасибо! Это очень много значит для меня :)
ruthafjord
Это отличный ответ для x86. Вопрос изначально был довольно общим и не упоминал x86. Я сделал правку, чтобы попытаться соблюсти баланс. Возможно, вы могли бы добавить еще один абзац вверху этого ответа, чтобы решить вопрос терминологии за пределами мира x86? И / или оставьте еще одно изменение в вопросе, если вы считаете, что я усугубил ситуацию: PI действительно знает только x86 сам, но, надеюсь, верно, что другие системы используют очень похожую терминологию, и вы можете просто сказать это :)
Peter Cordes
1
Обезжиренное на КПП aarchitecture книгу, и, похоже , их определения в значительной степени дублируют друг друга. Они имеют новые имена для крайних случаев и обрабатывают исключения как подтип прерываний, а не как часть отдельной категории.
рутафьорд
1
Я думаю, что этот ответ описывает это лучше всего. Здесь обсуждается размытая линия, которая может существовать между ними. И упоминает, что сбои страниц приводят к тому, что ЦП повторно пытается выполнить команду, а ловушка пропускает эту инструкцию и движется дальше.
in70x
9

Вообще говоря, такие термины , как исключения, разломы, Прерывает, ловушки и Прерывания всего это означает тот же самое , и называется «Прерывание».

В связи с разницей между Trap и Interrupt:

Ловушка: инициируется программистом и ожидает передачи управления в специальную процедуру обработчика. (Например, инструкция 80x86 INT является хорошим примером)

В то время как

Прерывание (аппаратное обеспечение): прерывание управления программой, основанное на внешнем аппаратном событии, внешнем по отношению к ЦП (например, нажатие клавиши на клавиатуре или тайм-аут на микросхеме таймера)

Cheshar
источник
Хорошие определения. Источник?
alexlomba87
6

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

Пол Р
источник
4
Это еще больше сбивает с толку, что некоторые авторы (Tanenbaum) называют «аппаратные ловушки». Если у нас могут быть аппаратные ловушки и программные прерывания, очевидно, что определения довольно грязные и могут идти в любом направлении, всегда требуя слова аппаратное или программное обеспечение.
The111
3

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

Фрэнк
источник
2

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

Динеш Редди
источник
2

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

Четан Павар
источник
2

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

Анамик Сарваия
источник
1

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

Sanketssj5
источник
1
Можете ли вы объяснить, как системный вызов является ловушкой?
Радха Гогия