Pull to refresh

Comments 25

>>— что такое PIC и для чего он нужен?
>>— что такое APIC и для чего он нужен? Для чего нужны LAPIC и I/O APIC?
>>— в чём отличия APIC, xAPIC и x2APIC?
>>— что такое MSI? В чём отличия MSI и MSI-X?
>>— как с этим связаны таблицы $PIR, MPtable, ACPI?

Чем провинились SMI/SCI, что они не попали в список?
Безусловно важные термины в контексте разговора о прерываниях. Но в данной статье хотелось обсудить контроллеры прерываний и те прерывания, на которые драйвер устройства может повесить обработчик.
>>и те прерывания, на которые драйвер устройства может повесить обработчик.
Как вариант, для особо беспокойных, зайти в биос из него в Shell, там повесить свой обработчик на SMI, выйти снова в биос и загрузив ДОС, пользоваться в нем своим SMI прерыванием, хоть программным, хоть железным.
Но что делать если устройств много? На все внешние устройства ножек процессора не напасёшься.

В свое время у PDP-11 в этом плане было продуманнее.
А какой ассемблер был…
Там у процессора изначально несколько входов разноприоритетных прерываний (4 + немаскируемое). Несколько устройств подключенных к одной линии прерывания могут дновременно подавать на нее запрос, а процессор в ответ подает ответ на разрешение, проходщий транзитом через все устройства на этой линии. Устройство расположенное ближе в цепочке ответа на разрешение блокирует передачу разрешения дальше и по шине данных передает процессору вектор прерывания.
При этом, если Вы вынимаете из корзины плату управления периферийным устройством (для ремонта или еще для чего), то все платы, расположенные дальше по цепочке, перестают вырабатывать прерывания — очень удобно ).
Как именно продуманнее?
Несколько устройств могло выдавать запрос прерывания на одну ножку процессора без контроллеров-расширителей прерываний. И могли иметь при этом разные вектора обработки прерывания.
Вообще-то MSI появилось куда раньше PCI express. Уже в спецификации PCI 2.2 от 1998 года есть MSI. MSI-X описано в спецификации PCI 3.0 (которая конечно по году и совпадает с появлением PCI express, но всё же). Для самой шины что MSI, что MSI-X — обычные записи от девайса в хост, неотличимые от любых других, о том, что они сигнализируют прерывания, говорит только их специальный адрес.
прерывания ISA не разделяемые

Может, перед таким категоричным заявлением стоит первоисточники почитать? Например, главу “Interrupt sharing” из “IBM PC AT technical reference” (первое, что под руку попало). Еще заодно можно посмотреть схему какого-нибудь ISA адаптера (только нормального, а не совсем уж “no name” изделия — например, контроллер жесткого диска от той же IBM) и убедиться, что IRQ формируется с учетом возможности использования нескольких устройств на одной линии.
Там другая засада: 8259A (в т.ч. в составе чипсетов) конфигурировался, так, чтобы реагировать на фронт сигнала запроса прерывания, а не на уровень. То есть «посадить» несколько устройств на одну линию можно, но драйвер, который будет обрабатывать прерывания, должен знать о них всех, чтобы сбросить все запросы с этой линии, иначе контроллер перестанет сигнализировать о прерываниях на ней. Если же назначить для двух разных устройств (например, сетевых карточек) один и тот же номер IRQ (джамперами), могло работать только одно из них.
В том же Technical reference объясняется, как правильно садиться на прерывания с программной точки зрения. Только довольно много обработчиков этого не делали — отбирали управление полностью на себя, не парясь насчет возможных других инициаторов прерываний на той же линии.

Верно, а почему они так поступали? Потому что для правильного взаимодействия все обработчики на одной линии должны вызываться в цикле до тех пор, пока каждый из них не определит, что "его" устройство больше не выставляет запрос на прерывание. Только так можно гарантировать, что следующий запрос пойдет фронтом сигнала. В рамках MS/DOS реализовать такое взаимодействие очень сложно. Я уже не говорю про другие тонкости, например, чтобы 8259A поймал сигнал запроса, перед фронтом сигнала необходим некоторый промежуток “тишины“.

rutenis curiousGeorge — спасибо за замечания. Будет ли более правильным сказать, что «на самом деле ISA устройства могут разделять линию прерываний, при условии что они спроектированы с учётом возможности подобного разделения. Но стандарт не делает это требование обязательным, поэтому в целом подключение нескольких ISA устройств к одной линии IRQ не является безопасным»?
Спасибо за статью, то что давно было интересно но лень было искать теперь прояснилось.

Спасибо за статью. Настраивал в qemu/kvm прямой доступ к GPU из гостя и говорили что MSI значительно уменьшает издержки на прерывания. Из статьи становится немного понятней почему.

Это всё хорошо, но все эти измерения не учитывают задержки из-за обработки перерывания сначала host системой и передачу в guest. Вроде как MSI даёт серьёзный прирост в этой ситуации при использовании qemu/kvm. Возможно из-за использования mmio. Вот и хотелось услышать квалифицировонное мнение на эту тему. Виртуализация этой системы возможно за рамками данной статью, заранее прошу извинений если так.
UFO just landed and posted this here
Спасибо за статью, есть небольшая поправка.
30 лет назад в институте у нас был стенд, на котором мы потактово разбирали работу контроллера прерываний 8259, предназначенный для процессоров Intel 8080 и 8085. Его работа была принципиально иная, нежели 8259A. Данная статья описывает именно 8259A и позднее, в принципе логично т.к. рассматривается архитектура x86, но в статье очень желательно заменить 8259->8259A как в тексте, так и слайдах.

Чем же так принципиально отличался первоначальный 8259? У него не было маски прерываний, он брал из своих регистров три байта и последовательно выставлял их на шину команд! CPU не делал коллбек, просто выполнял команду (вызова подпрограммы), которую ему «подсунул» контроллер. Естественно тогда ни о каких оптимизациях и конвейерах в CPU речь не шла, поэтому работало как надо ))
По сигналу подтверждения прерывания она выдавала на шину три байта, первый соответствовал коду операции «Вызов подпрограммы» (значение 0xCD в шестнадцатеричной системе), затем два байта адреса вызова этой подпрограммы, которые нужно было записать в соответствующие каждому источнику прерывания внутренние регистры контроллера. Для процессоров семейства x86 была выпущена микросхема 8259A, так как механизм передачи управления изменился.

Источник: ru.wikipedia.org/wiki/Intel_8259
Спасибо, поправил!
Sign up to leave a comment.

Articles