Яка різниця між пасткою та перериванням?


Відповіді:


203

Пастка являє собою виключення в призначеному для користувача процесі. Це викликано поділом на нуль або недійсним доступом до пам'яті. Це також звичайний спосіб викликати процедуру ядра ( системний виклик ), оскільки вони працюють з більш високим пріоритетом, ніж код користувача. Обробка є синхронною (тому код користувача призупиняється та продовжується і надалі). У певному сенсі вони "активні" - більшість часу код очікує, що пастка відбудеться, і покладається на цей факт.

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

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


5
Цікаво, що lxr.free-electrons.com/source/arch/x86/kernel/… поділ на нуль ініціалізується як апаратне переривання, чому це так?
Алекс Креймер

8
Тому що це дійсно переривання, яке ЦП надсилає, коли АЛУ виявить цю проблему. Так само, як і помилка сегментації. Не всі математичні помилки викликають переривання (переповнення не робить).
Аарон Дігулла

4
Що має сенс. Але потім, що трохи заплутано, це те, що в попередніх Linux-ядрах вона була ініціалізована як програмна пастка: set_trap_gate (0, & divide_error);
Алекс Креймер

11
Що ти маєш на увазі, " трохи заплутаний"? Це дуже заплутано :-) Проблема тут полягає в тому, що ділення на нуль - це апаратне переривання (IRQ / вектор 0), але розробники ядра мають кілька варіантів, як з цим впоратися. Отже, з боку користувача процес - це пастка, але з боку процесора - це переривання. Хто правий? Немає? Обидва?
Аарон Дігулла

3
Звичайно, це стосується лише процесорів x86. Інші процесори працюють інакше.
Аарон Дігулла

110

Пастки та переривання тісно пов'язані. Пастки є типом винятку , а винятки схожі на переривання.

Intel x86 визначає дві категорії, що перекриваються, векторовані події ( переривання проти винятків ) та класи винятків ( помилки проти пасток проти абортів ).

Усі цитати в цій публікації - з квітневої версії Посібника для розробників програмного забезпечення Intel . Для точки зору (остаточного та складного) x86 я рекомендую прочитати розділ SDM про обробку переривань та виключень.

Векторальні події

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

Винятки та переривання мають ідентифікатор, який називається вектором, який визначає, до якого обробника переривань переходить процесор. Обробники переривань описані в Таблиці дескрипторів переривань.

Переривання

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

Винятки

Винятки трапляються, коли процесор виявляє стан помилки під час виконання інструкції, наприклад, поділ на нуль. Процесор виявляє різні умови помилок, включаючи порушення захисту, несправності сторінки та внутрішні несправності машини.

Класифікації винятку

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

Короткий зміст: пастка збільшує вказівник інструкції, помилки не роблять, а аборти "вибухають".

Пастка

Пастка являє собою виняток , яке повідомляється відразу після виконання команди вилову. Пастки дозволяють продовжувати виконання програми чи завдання без втрати наступності програми. Зворотна адреса для обробника пастки вказує на інструкцію, яку слід виконати після інструкції з лову.

Помилка

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

Приклад: Помилка сторінки часто може бути усунена. Частина адресного простору програми може бути замінена на диск з оперативної пам’яті. Програма запустить помилку сторінки, коли вона намагатиметься отримати доступ до пам'яті, яку було замінено. Ядро може перетягувати цю пам'ять з диска на таран і керувати рукою назад до програми. Додаток продовжуватиметься там, де він припинився (за несправною інструкцією, що отримував доступ до заміненої пам’яті), але цього разу доступ до пам'яті повинен бути успішним без помилок.

Аборт

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

Крайові випадки

Програмне забезпечення, яке викликає переривання (викликане інструкцією INT), веде себе як пастка. Інструкція завершується до того, як процесор збереже свій стан і перейде до обробника переривання.


6
Це така гарна відповідь. Я був позитивний, що черга на перегляд "Пізня відповідь нового користувача" давала мені тест, щоб переконатися, що я звертав увагу.
Номенон

1
Дякую! Це для мене багато значить :)
ruthafjord

Це чудова відповідь для x86. Спочатку питання було досить загальним і не згадувало x86. Я зробив правки, щоб спробувати досягти балансу. Можливо, ви могли б додати ще один абзац у верхній частині цієї відповіді, щоб вирішити питання про термінологію поза межами світу x86? І / або залиште іншу редакцію у питанні, якщо ви думаєте, що я зробив це гірше: PI справді знаю лише x86 сам, але, сподіваємось, це правда, що інші системи використовують дуже схожу термінологію, і ви можете просто сказати це :)
Пітер Кордес

1
Знежирене на КПП aarchitecture книгу, і, схоже , їх визначення в значній мірі дублюють один одного. Вони мають нові назви крайових випадків і трактують винятки, як підтип переривань, а не частину окремої категорії.
ruthafjord

1
Я думаю, що ця відповідь найкраще описує це. У ньому обговорюється розмита лінія, яка може існувати між ними. І згадки про те, що помилки сторінки призводять до повторної спроби процесора, що пастка пропускає інструкцію та рухається далі.
in70x

9

Взагалі кажучи, такі терміни, як винятки, помилки, аборти, пастки та переривання, означають одне і те ж і називаються "перериваннями".

Приходячи до різниці між Trap та Interrupt:

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

Де як

Переривання (апаратне забезпечення): це перерва в управлінні програмою на основі зовнішньої події апаратного забезпечення, що знаходиться поза процесором (Наприклад: натискання клавіші на клавіатурі або тайм-аут на чіпі таймера)


Гарні визначення. Джерело?
alexlomba87

6

Пастка являє собою особливий вид переривання , яке зазвичай називають програмне переривання . Переривання є більш загальний термін , який включає в себе як апаратні переривання (перебиває від апаратних пристроїв) і програмні переривання (перебиває від програмного забезпечення, такі як пастки ).


4
Це ще більше бентежить, що деякі автори (Tanenbaum) називають "апаратними пастками". Якщо у нас можуть бути апаратні пастки та переривання програмного забезпечення, чітко визначення є досить каламутними і можуть піти в будь-який бік, завжди вимагаючи слово апаратне чи програмне забезпечення.
The111

3

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


2

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


2

Я думаю, що пастки викликані виконанням поточної інструкції, і тому вони називаються як синхронні події. де переривання викликані незалежною інструкцією, що працює в процесорі, які пов'язані із зовнішніми подіями і, таким чином, називаються асинхронними.


2

Перерви - це апаратні переривання, тоді як пастки - програмні переривання. Виникнення апаратних переривань зазвичай відключає інші апаратні переривання, але це не відповідає дійсності пасток. Якщо вам потрібно заборонити апаратні переривання, поки не буде подано пастку, вам потрібно чітко очистити прапор переривання. І зазвичай прапор переривання на комп'ютері впливає на (апаратні) переривання на відміну від пасток. Це означає, що очищення цього прапора не запобіжить пасткам. На відміну від пасток, переривання повинні зберігати попередній стан процесора.


1

Пастка - це переривання програмного забезпечення. Якщо ви пишете програму, в якій оголошуєте змінну, яка має ділення на нульове значення, то вона трактується як трап. Кожного разу, коли ви запускаєте цю програму, вона одночасно викличе ту саму помилку. Виклик системи - це спеціальна версія пастки, в якій програма запитує os за необхідну послугу. У разі переривання (загальне слово для апаратних перерв), як помилка вводу-виводу, процесор переривається у випадковий час, і поза курсом, це не вина наших програмістів. Це обладнання, яке їх викликає.


1
Чи можете ви пояснити, як системний виклик є пасткою?
Радха Годжа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.