Поделиться через


Общие сведения о прерываниях Message-Signaled

Прерывания с сигналом сообщения (MSIs) были представлены в спецификации PCI 2.2 в качестве альтернативы прерываниям на основе строк. Вместо использования выделенного контакта для активации прерываний устройства, использующие MSIs, активируют прерывание, записывая значение в определенный адрес памяти. СТАНДАРТ PCI 3.0 определяет расширенную форму MSI-X, которая обеспечивает большую программируемость. Windows Vista и более поздние версии Windows поддерживают MSI и MSI-X. Одно устройство может поддерживать как MSI, так и MSI-X. Для такого устройства операционная система будет автоматически использовать MSI-X.

Сообщение прерывания — это определенное значение, которое устройство записывает на определенный адрес для активации прерывания. В отличие от прерываний на основе строк, прерывания, сигнальные сообщением, имеют граничную семантику. Устройство отправляет сообщение, но не получает аппаратного подтверждения того, что прерывание было получено.

Для PCI 2.2 сообщение состоит из адреса и частично непрозрачного 16-разрядного значения. Каждому устройству назначается один адрес. Для отправки нескольких сообщений устройство может использовать более низкие 4 бита значения сообщения для различения сообщений. Таким образом, для PCI 2.2 устройства могут поддерживать до 16 сообщений.

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

Драйверы могут зарегистрировать одну подпрограмму InterruptMessageService , которая обрабатывает все возможные сообщения или отдельные подпрограммы InterruptService для каждого сообщения.

Драйверы могут обрабатывать MSIs, отправляемые устройством, следующим образом:

  1. Во время установки драйвера включите MSIs в реестре. Вы также можете использовать реестр, чтобы указать количество сообщений, выделяемых для устройства. Дополнительные сведения см. в разделе Включение прерываний Message-Signaled в реестре.

  2. При необходимости увеличьте количество сообщений о прерываниях и сохраните некоторые параметры каждого сообщения, отвечая на запрос IRP_MN_FILTER_RESOURCE_REQUIREMENTS . Дополнительные сведения см. в разделе Использование дескрипторов ресурсов прерывания.

  3. В подпрограмме диспетчеризации драйвера для IRP_MN_START_DEVICE вызовите IoConnectInterruptEx , чтобы зарегистрировать подпрограмму InterruptService или InterruptMessageService для обслуживания прерываний устройства. Используйте CONNECT_FULLY_SPECIFIED версию IoConnectInterruptEx , чтобы зарегистрировать подпрограмму InterruptService для определенного сообщения, или CONNECT_MESSAGE_BASED версию IoConnectInterruptEx , чтобы зарегистрировать одну подпрограмму InterruptMessageService для всех сообщений. Дополнительные сведения см. в разделах Использование версии CONNECT_MESSAGE_BASED IoConnectInterruptEx и Использование CONNECT_FULLY_SPECIFIED версии IoConnectInterruptEx.

  4. После того как драйвер больше не будет обслуживать прерывания с устройства, вызовите IoDisconnectInterruptEx (после отключения прерываний устройства), чтобы удалить все зарегистрированные процедуры обслуживания прерываний.

Драйверы, предназначенные для использования нескольких сообщений, должны проверка, что выделяется ожидаемое количество сообщений. Если диспетчер Plug and Play (PnP) не может выделить запрошенное количество сообщений, он выделяет устройству ровно одно сообщение. Драйверы могут проверка количество фактически выделенных сообщений одним из следующих способов:

  • Диспетчер PnP сообщает количество выделенных сообщений в списке дескрипторов необработанных ресурсов. Дополнительные сведения см. в разделе Использование дескрипторов ресурсов прерывания.

  • Когда IoConnectInterruptEx возвращает значение , параметр Parameters-MessageBased.ConnectContext.InterruptMessageTable-MessageCount>> задает количество выделенных сообщений.