Проблемы с надежностью драйвера miniport WavePci
Драйвер miniport WavePci должен отслеживать сопоставления, которые он получает от драйвера порта. Драйвер miniport WavePci хранит свой список сопоставлений в структуре данных, которая совместно используется потоками драйвера. Потоки драйвера также должны совместно использовать доступ к каналу DMA, чтобы добавить новые сопоставления в очередь оборудования и удалить завершенные сопоставления из очереди. Чтобы предотвратить повреждение данных, драйверы минипорта используют спин-блокировки для сериализации доступа к общим структурам данных и периферийным устройствам. Спин-блокировка защищает общую очередь данных и оборудования от одновременного доступа с помощью двух или более потоков драйвера.
При разработке части драйвера, которая управляет сопоставлениями, поставщикам следует обратить особое внимание на следующие моменты.
Спин-блокировки
Чтобы избежать потенциальных взаимоблокировок, драйвер мини-порта не должен удерживать собственную блокировку спина при вызове Portcls.sys для получения или освобождения сопоставлений. Пример драйвера Ac97 в комплекте драйверов Microsoft Windows (WDK) иллюстрирует этот принцип. Перед вызовом IPortWavePciStream::GetMapping или IPortWavePciStream::ReleaseMapping пример драйвера вызывает KeReleaseSpinLock , чтобы освободить спин-блокировку. После возврата вызова GetMapping или ReleaseMapping драйвер вызывает KeAcquireSpinLock , чтобы снова получить спиновую блокировку. Между вызовами для освобождения и получения спин-блокировки поток драйвера не должен предполагать, что у него есть монопольный доступ к списку сопоставлений. Доступ к общим данным в течение этого незащищенного интервала опасен. Если интервал между освобождением и получением спин-блокировки невелик, вероятность повреждения данных из-за состояния гонки между двумя потоками драйвера также невелика. Это означает, что результирующий сбой является периодическим и, следовательно, трудным для трассировки. После освобождения и получения спин-блокировки хорошо написанный драйвер должен предполагать, что все временные указатели или индексы, которые он ранее использовал для доступа к содержимому общих структур данных, больше не являются допустимыми.
Отмена IRP
В любое время во время обработки потока воспроизведения или записи отмена IRP может привести к отмене операционной системой одного или нескольких сопоставлений, полученных драйвером мини-порта. В этом случае драйвер порта вызывает метод IMiniportWavePciStream::RevokeMappings , чтобы уведомить драйвер минипорта. Чтобы избежать воспроизведения или записи данных в отозванные сопоставления, драйвер минипорта должен удалить сопоставления из списка программного обеспечения и аппаратной очереди контроллера DMA. Так как список программного обеспечения и очередь оборудования совместно используются потоками драйверов, для надежного выполнения этих операций требуется определенная осторожность.
Например, набор отозванных сопоставлений может содержать сопоставление, которое только что было или только что будет выпущено. В этом случае два потока драйвера могут одновременно попытаться удалить одно и то же сопоставление из очереди DMA. Если драйверу не удается предотвратить одновременный доступ, это может привести к повреждению данных в регистрах или структурах памяти, которые управляют очередью.
Пример рабочего кода см. в примере драйвера Ac97 в комплекте драйверов Windows (WDK).