Прерывания, сигнализируемые сообщениями ( MSI ), представляют собой метод сигнализации прерываний , использующий специальные внутриполосные сообщения для замены традиционных внеполосных сигналов на выделенных линиях прерываний. Хотя прерывания, сигнализируемые сообщениями, сложнее реализовать в устройстве, они имеют некоторые существенные преимущества по сравнению с внеполосной сигнализацией прерываний на основе выводов, например, улучшенную производительность обработки прерываний. Это контрастирует с традиционными механизмами прерываний, такими как устаревшая система запросов на прерывания (IRQ).
Прерывания с сигналом сообщения поддерживаются в шине PCI , начиная с версии 2.2, и в более поздней версии шины PCI Express . Некоторые архитектуры, не относящиеся к PCI, также используют прерывания с сигналом сообщения.
Традиционно устройство имеет линию прерывания (контакт), которую оно устанавливает, когда хочет подать сигнал прерывания в среду обработки хоста. Эта традиционная форма сигнализации прерывания является внеполосной формой сигнализации управления, поскольку она использует выделенный путь для отправки такой информации управления отдельно от основного пути данных. MSI заменяет эти выделенные линии прерывания внутриполосной сигнализацией, обмениваясь специальными сообщениями, которые указывают на прерывания через основной путь данных. В частности, MSI позволяет устройству записывать небольшое количество данных, описывающих прерывания, в специальный отображенный в памяти адрес ввода-вывода , а затем чипсет доставляет соответствующее прерывание процессору. [1] [2] [3]
Распространенное заблуждение относительно MSI заключается в том, что он позволяет устройству отправлять данные процессору как часть прерывания. Данные, отправляемые как часть транзакции записи памяти, используются чипсетом для определения того, какое прерывание запустить на каком процессоре; эти данные недоступны для устройства, чтобы передать дополнительную информацию обработчику прерываний. [1] [2] [3]
Например, PCI Express вообще не имеет отдельных выводов прерываний; вместо этого он использует специальные внутриполосные сообщения, чтобы эмулировать утверждение или отмену утверждения вывода. Некоторые архитектуры, отличные от PCI, также используют MSI; в качестве другого примера, устройства HP GSC не имеют выводов прерываний и могут генерировать прерывания только путем прямой записи в регистр прерываний процессора в пространстве памяти. [ необходима цитата ] Протокол HyperTransport также поддерживает MSI. [4]
Хотя реализовать прерывания с сообщением сложнее, они имеют некоторые существенные преимущества по сравнению с внеполосной сигнализацией прерываний на основе контактов. С механической стороны, меньшее количество контактов делает разъем более простым, дешевым и надежным. Хотя это не является преимуществом для стандартного разъема PCI, PCI Express использует эту экономию.
MSI увеличивает количество возможных прерываний. В то время как обычный PCI был ограничен четырьмя прерываниями на карту (и, поскольку они были общими для всех карт, большинство используют только одно), прерывания с сообщением-сигналом позволяют использовать десятки прерываний на карту, когда это полезно. [1]
Также есть небольшое преимущество в производительности. В программном обеспечении прерывание на основе вывода может соревноваться с отправленной записью в память. То есть, устройство PCI записывает данные в память, а затем отправляет прерывание, чтобы указать, что запись DMA завершена. Однако мост PCI или контроллер памяти могут буферизировать запись, чтобы не мешать другому использованию памяти. Прерывание может поступить до завершения записи DMA, и процессор может считать устаревшие данные из памяти. [5] Чтобы предотвратить эту гонку, обработчики прерываний должны были считывать данные с устройства, чтобы гарантировать, что запись DMA завершена. Это чтение имело умеренное падение производительности. Запись MSI не может пройти запись DMA, поэтому гонка исключается. [6]
PCI определяет два дополнительных расширения для поддержки прерываний, сигнализируемых сообщениями, MSI и MSI-X. PCI Express определяет собственный механизм на основе сообщений для эмуляции устаревших прерываний PCI.
MSI (впервые определен в PCI 2.2) позволяет устройству выделять 1, 2, 4, 8, 16 или 32 прерывания. Устройство программируется с адресом для записи (этот адрес обычно является регистром управления в контроллере прерываний ) и 16-битным словом данных для его идентификации. Номер прерывания добавляется к слову данных для идентификации прерывания. [1] Некоторые платформы, такие как Windows, не используют все 32 прерывания, а используют только до 16 прерываний. [7]
MSI-X (впервые определенный в PCI 3.0) позволяет устройству выделять до 2048 прерываний. Единый адрес, используемый оригинальным MSI, оказался ограничивающим для некоторых архитектур. В частности, это затрудняло назначение отдельных прерываний разным процессорам, что полезно в некоторых высокоскоростных сетевых приложениях. MSI-X допускает большее количество прерываний и дает каждому из них отдельный целевой адрес и слово данных. Устройства с MSI-X не обязательно поддерживают 2048 прерываний. [3] [8] [9] [10]
Дополнительные функции MSI (64-битная адресация и маскирование прерываний) также являются обязательными для MSI-X.
PCI Express не имеет физических контактов прерывания, но эмулирует 4 физических контакта прерывания PCI с помощью выделенных сообщений PCI Express, таких как Assert_INTA и Deassert_INTC . Будучи основанным на сообщениях (на уровне PCI Express), этот механизм обеспечивает некоторые, но не все, преимущества механизма MSI уровня PCI: 4 виртуальных контакта на устройство больше не используются совместно на шине (хотя контроллеры PCI Express по-прежнему могут объединять устаревшие прерывания внутри себя), а изменения прерываний больше не страдают от условий гонки.
PCI Express позволяет устройствам использовать эти устаревшие сообщения прерываний, сохраняя программную совместимость с драйверами PCI, но они также должны поддерживать MSI или MSI-X на уровне PCI.
В системах Intel LAPIC должен быть включен для работы PCI (и PCI Express) MSI/MSI-X, даже в однопроцессорных (одноядерных) системах. [11] [12] В этих системах MSI обрабатываются путем записи вектора прерывания непосредственно в LAPIC процессора/ядра, которому необходимо обслужить прерывание. Intel LAPIC 2009 года поддерживали до 224 прерываний на основе MSI. [12] Согласно тесту Intel 2009 года с использованием Linux , использование MSI сократило задержку прерываний почти в три раза по сравнению с доставкой I/O APIC. [13]
В семействе операционных систем Microsoft, Windows Vista и более поздние версии поддерживают как MSI, так и MSI-X. Поддержка была добавлена в цикле разработки Longhorn около 2004 года. [14] MSI не поддерживается в более ранних версиях, таких как Windows XP или Windows Server 2003. [ 15]
В Solaris Express 6/05, выпущенном в 2005 году, добавлена поддержка MSI и MSI-X как часть новой инфраструктуры прерываний интерфейса драйвера устройства (DDI). [16]
В FreeBSD 6.3 и 7.0, выпущенных в 2008 году, добавлена поддержка MSI и MSI-X. [17]
OpenBSD 5.0, выпущенная в 2011 году, добавила поддержку MSI. [18] 6.0 добавила поддержку MSI-X. [19]
Linux получил поддержку MSI и MSI-X примерно в 2003 году. [20] Известно, что версии ядра Linux до 2.6.20 имеют серьезные ошибки и ограничения в реализации MSI/MSI-X. [21]
Haiku получила поддержку MSI примерно в 2010 году. [22] Поддержка MSI-X была добавлена позже, в 2013 году. [23]
В NetBSD 8.0, выпущенном в 2018 году, добавлена поддержка MSI и MSI-X.
VxWorks 7 поддерживает MSI и MSI-X
{{cite book}}
: |work=
проигнорировано ( помощь ){{cite book}}
: |work=
проигнорировано ( помощь ){{cite book}}
: |work=
проигнорировано ( помощь )