Прерывания, сигнализируемые сообщением - Message Signaled Interrupts

Прерывания с сигнализацией сообщений ( MSI ) - это альтернативный внутриполосный метод сигнализации прерывания , использующий специальные внутриполосные сообщения для замены традиционного внеполосного подтверждения выделенных линий прерывания. Хотя более сложные для реализации в устройстве прерывания, сигнализируемые сообщением, имеют некоторые существенные преимущества по сравнению с внеполосной сигнализацией прерываний на основе выводов.

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

Обзор

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

Распространенное заблуждение относительно MSI заключается в том, что он позволяет устройству отправлять данные процессору как часть прерывания. Данные, которые отправляются как часть транзакции записи в память, используются набором микросхем, чтобы определить, какое прерывание запускать на каком процессоре; эти данные недоступны устройству для передачи дополнительной информации обработчику прерывания.

Например, PCI Express вообще не имеет отдельных контактов прерывания; вместо этого он использует специальные внутриполосные сообщения, позволяющие имитировать подтверждение вывода или отмену подтверждения. Некоторые архитектуры без PCI также используют MSI; в качестве другого примера, устройства HP GSC не имеют контактов прерывания и могут генерировать прерывания только путем записи непосредственно в регистр прерывания процессора в пространстве памяти. Протокол HyperTransport также поддерживает MSI.

Преимущества

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

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

Также есть небольшое преимущество в производительности. В программном обеспечении прерывание на основе вывода могло конкурировать с опубликованной записью в память. То есть устройство PCI записывает данные в память, а затем отправляет прерывание, чтобы указать, что запись DMA завершена. Однако мост PCI или контроллер памяти могут буферизовать запись, чтобы не мешать другому использованию памяти. Прерывание могло появиться до завершения записи DMA, и процессор мог прочитать устаревшие данные из памяти. Чтобы предотвратить эту гонку, обработчики прерываний должны были читать с устройства, чтобы гарантировать, что запись DMA завершена. Это чтение имело умеренное снижение производительности. Запись MSI не может пройти запись DMA, поэтому гонка устраняется.

Типы MSI

PCI определяет два дополнительных расширения для поддержки прерываний, сигнализируемых сообщением, MSI и MSI-X. PCI Express определяет свой собственный механизм на основе сообщений для эмуляции устаревших прерываний PCI.

MSI

MSI (впервые определенная в PCI 2.2) позволяет устройству выделять 1, 2, 4, 8, 16 или 32 прерывания. Устройство запрограммировано с адресом для записи (обычно это регистр управления в контроллере прерываний ) и 16-битным словом данных для его идентификации. Номер прерывания добавляется к слову данных для идентификации прерывания. Некоторые платформы, такие как Windows, не используют все 32 прерывания, а используют только до 16 прерываний.

MSI-X

MSI-X (впервые определенный в PCI 3.0) позволяет устройству выделять до 2048 прерываний. Единый адрес, используемый исходным MSI, оказался ограничивающим для некоторых архитектур. В частности, это затрудняло нацеливание отдельных прерываний на разные процессоры, что полезно в некоторых высокоскоростных сетевых приложениях. MSI-X допускает большее количество прерываний и дает каждому из них отдельный целевой адрес и слово данных. Устройства с MSI-X не обязательно поддерживают 2048 прерываний.

Дополнительные функции MSI (64-битная адресация и маскирование прерываний) также являются обязательными для MSI-X.

Эмуляция устаревших прерываний PCI Express

PCI Express не имеет физических линий прерывания, но эмулирует 4 физические линии PCI через выделенные сообщения PCI Express, такие как Assert_INTA и Deassert_INTC . Будучи основанным на сообщениях (на уровне PCI Express), этот механизм обеспечивает некоторые, но не все, преимущества механизма MSI уровня PCI: 4 виртуальных линии на устройство больше не используются совместно на шине (хотя контроллеры PCI Express могут по-прежнему объединяют устаревшие прерывания внутри), и изменения прерывания больше не страдают от состояний гонки.

PCI Express позволяет устройствам использовать эти устаревшие сообщения о прерываниях, сохраняя программную совместимость с драйверами PCI, но они также должны поддерживать MSI или MSI-X на уровне PCI.

системы x86

В системах Intel LAPIC должен быть включен для работы PCI (и PCI Express) MSI / MSI-X, даже в однопроцессорных (одноядерных) системах. В этих системах MSI обрабатываются путем записи вектора прерывания непосредственно в LAPIC процессора / ядра, который должен обслуживать прерывание. Intel LAPIC 2009 года поддерживала до 224 прерываний на основе MSI. Согласно тесту Intel 2009 года с использованием Linux , использование MSI сократило задержку прерываний почти в три раза по сравнению с доставкой ввода-вывода APIC.

Поддержка операционной системы

В операционных системах семейства Microsoft Windows Vista и более поздние версии поддерживают как MSI, так и MSI-X. Поддержка была добавлена ​​в цикле разработки Longhorn примерно в 2004 году. MSI не поддерживается в более ранних версиях, таких как Windows XP или Windows Server 2003 .

В версии Solaris Express 6/05 добавлена ​​поддержка MSI и MSI-X как часть их новой инфраструктуры обработки прерываний интерфейса драйверов устройств (DDI).

FreeBSD 6.3 и 7.0 добавили поддержку MSI и MSI-X.

В OpenBSD 5.0 добавлена ​​поддержка MSI. 6.0 добавлена ​​поддержка MSI-X.

Linux получил поддержку MSI и MSI-X примерно в 2003 году. Известно, что версии ядра Linux до 2.6.20 имеют серьезные ошибки и ограничения в реализации MSI / MSI-X.

Компания Haiku получила поддержку MSI примерно в 2010 году. Поддержка MSI-X была добавлена ​​позже, в 2013 году.

В NetBSD 8.0 добавлена ​​поддержка MSI и MSI-X.

VxWorks 7 поддерживает MSI и MSI-X

Рекомендации

внешние ссылки