vak: (Default)
[personal profile] vak
Полезное видео: ретроспектива концепции прерываний в истории компьютеростроения (на английском).

Date: 2017-01-11 08:18 (UTC)
netch80: (Default)
From: [personal profile] netch80
Хм, по-моему, оно практически ни о чём (для указанных целей). Истории тут минимум, и не самое важное. Концепция прерываний в устоявшемся виде тривиально ложится на несколько итераций типа "проблема задолбала, берём наиболее очевидное решение, как только поймём и смиримся, что это таки надо делать":

1. Надоело поллить => оно само должно переключать (реально, тот же поллинг переводится из явно программного в аппаратный).

2. Переключение должно быть предельно незаметным, кроме затраты времени. К этому уже должно быть всё идеологически готово за счёт того, что поллер из этапа 1 должен сохранять весь контекст полностью (в идеале он сводился к одному callsubr).

3. Обработка прерываний должна блокироваться, когда система к этому не готова. Кто этого сразу не понял - будет иметь грабли и в конце концов залечит любым срочным хаком (как это было с S/360 с guard bit в double float). Хотя извращенцы, которые игнорируют или маскируют проблему, есть и сейчас (NMI в x86).

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

С этого момента концепцию можно считать сформированной. Дальше начинаются странные пляски вокруг приоритетов, методов доставки, спора edge/level/message... но это уже ничего по сути не меняет.

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

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

1. Кто-то наконец осознал, что программное прерывание - системный вызов не обязано подчиняться тем же правилам - в частности, на него не распространяются требования сохранения полного контекста (в отличие от синхронных, но не заказанных исполняемым кодом прерываний, как страничное). Отсюда sysenter в x86, который планово портит некоторые регистры, зато даёт самое дешёвое переключение.
Я ожидал вслед за этим принципиального разделения таблиц векторов прерываний на внешние и внутренние, но этого не произошло.

2. Некоторые события исполняемого кода - незамаскированные прерывания floating point, неизвестная команда - не обязаны переходить на уровень супервизора, чтобы оттуда дёрнуть обратно что-то на уровне пользователя. Большинство ISA этого ещё не отрабатывает, но, например, RISC-V уже штатно предусматривает ловлю на том же уровне привилегий.

3. Разворот лестницы привилегий от "по умолчанию - всё, остальное - ограничения" до "по умолчанию - пользователь, остальное - больше прав". x86 этого ещё не успел (в результате имеем условные уровни -1, -2 для гипервизора и SMM), ARM и более поздние - уже отрабатывают это (можно видеть по тому, что уровень 0 это пользователь).