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


Использование дескрипторов ресурсов прерывания

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

Запрос IRP_MN_FILTER_RESOURCE_REQUIREMENTS предоставляет список IO_RESOURCE_DESCRIPTOR структур. Если устройство имеет структуру возможностей MSI (прерывание с сигналом сообщения), как определено в спецификации PCI 2.2, диспетчер PnP предоставляет один дескриптор сообщений прерывания. Если устройство имеет структуру возможностей MSI-X, как определено в спецификации PCI 3.0, диспетчер PnP предоставляет одну структуру для каждого сообщения прерывания. Дескрипторы сообщений прерывания имеют тип = CmResourceTypeInterrupt и Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE. Драйверы также могут изменять параметры, такие как сходство прерываний, изменяя элементы u.Interrupt структуры. Обратите внимание, что при использовании MSI все прерывания имеют одинаковое сходство, а при использовании MSI-X они могут иметь разные сходства. Дополнительные сведения см. в разделе Сходство прерываний и приоритет.

Для MSI, как определено в PCI 2.2, u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1 — это количество сообщений прерывания, выделенных для устройства. Драйверы могут изменять количество сообщений прерываний, изменяя u.Interrupt.MinimumVector. Для сообщений прерывания MSI всегда CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN u.Interrupt.MaximumVector . Чтобы выделить сообщения прерывания MessageCount , задайте для параметра u.Interrupt.MinimumVector значение CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN — MessageCount + 1.

Для MSI-X, как определено в PCI 3.0, драйверы могут изменять количество выделенных сообщений прерываний путем добавления или удаления записей из списка. Обратите внимание, что ресурсы сообщений прерывания, добавленные таким образом, не должны быть впоследствии удалены в ответ на запрос IRP_MN_START_DEVICE . Для MSI-X диспетчер PnP предоставляет один дескриптор на прерывание сообщения, а членам u.Interrupt.MinimumVector и u.Interrupt.MaximumVector этого дескриптора задано значение CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN.

Когда диспетчер Plug and Play назначил все аппаратные ресурсы для устройства, включая сообщения о прерываниях, он отправляет драйверу запрос IRP_MN_START_DEVICE. Этот запрос предоставляет два списка CM_PARTIAL_RESOURCE_DESCRIPTOR структур, по одному для необработанных и переведенных ресурсов. Для сообщений прерываний диспетчер PnP предоставляет одну структуру для каждого выделенного адреса памяти с типом = CmResourceTypeInterrupt и Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE.

Обратите внимание, что при использовании MSI драйвер получает только один дескриптор ресурса прерывания, так как все сообщения имеют один адрес. Для определения количества назначенных сообщений можно использовать элемент MessageCountu.MessageInterrupt.Raw . При использовании MSI-X драйвер получает отдельный дескриптор ресурса для каждого сообщения прерывания.

В Windows 8 операционная система не поддерживает запросы ресурсов для более чем 2048 сообщений прерывания для каждой функции устройства. В Windows 7 и Windows Vista операционная система не поддерживает запросы ресурсов для более чем 910 сообщений прерывания для каждой функции устройства. Если драйвер устройства превышает это ограничение, устройство может не запуститься. Чтобы драйвер мог работать на компьютере с большим количеством логических процессоров, драйвер не должен запрашивать более одного прерывания на процессор.

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