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


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

Диспетчер 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 предоставляет одну структуру для каждого сообщения прерывания. Дескрипторы сообщений прерывания имеют Type = 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 u.Interrupt.MaximumVector всегда устанавливается в CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN. Чтобы выделить сообщения о прерываниях 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 драйвер получает только один дескриптор ресурса прерывания, так как все сообщения имеют одинаковый адрес. Элемент MessageCount в u.MessageInterrupt.Raw можно использовать для определения количества назначенных сообщений. При использовании MSI-X драйвер получает отдельный дескриптор ресурса для каждого сообщения прерывания.

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

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