다음을 통해 공유


WavePci 미니포트 드라이버의 안정성 문제

WavePci 미니포트 드라이버는 포트 드라이버에서 수신하는 매핑을 추적해야 합니다. WavePci 미니포트 드라이버는 드라이버 스레드 간에 공유되는 데이터 구조의 매핑 목록을 유지 관리합니다. 또한 드라이버 스레드는 하드웨어 큐에 새 매핑을 추가하고 큐에서 완료된 매핑을 제거하려면 DMA 채널에 대한 액세스를 공유해야 합니다. 데이터 손상을 방지하기 위해 미니포트 드라이버는 스핀 잠금을 사용하여 공유 데이터 구조 및 주변 디바이스에 대한 액세스를 직렬화합니다. 스핀 잠금은 두 개 이상의 드라이버 스레드가 동시에 액세스하지 못하도록 공유 데이터 및 하드웨어 큐를 보호합니다.

매핑을 관리하는 드라이버 부분을 개발할 때 공급업체는 다음 사항에 특히 주의해야 합니다.

스핀 잠금

잠재적인 교착 상태를 방지하기 위해 미니포트 드라이버는 매핑을 획득하거나 해제하기 위해 Portcls.sys 호출할 때 자체 스핀 잠금을 보유해서는 안 됩니다. Microsoft WDK(Windows 드라이버 키트)의 Ac97 샘플 드라이버는 이 원칙을 보여 줍니다. IPortWavePciStream::GetMapping 또는 IPortWavePciStream::ReleaseMapping을 호출하기 전에 샘플 드라이버는 KeReleaseSpinLock을 호출하여 스핀 잠금을 해제합니다. GetMapping 또는 ReleaseMapping 호출이 반환되면 드라이버는 KeAcquireSpinLock을 호출하여 스핀 잠금을 다시 획득합니다. 스핀 잠금을 해제하고 획득하기 위한 호출 사이에 드라이버 스레드는 매핑 목록에 대한 단독 액세스 권한이 있다고 가정해서는 안 됩니다. 보호되지 않는 이 간격 동안 공유 데이터에 액세스하는 것은 위험합니다. 스핀 잠금 해제와 획득 사이의 간격이 작으면 두 드라이버 스레드 간의 경합 조건으로 인해 데이터가 손상될 가능성도 작습니다. 즉, 결과 오류는 간헐적이므로 추적하기가 어렵습니다. 스핀 잠금을 해제하고 가져온 후 잘 작성된 드라이버는 이전에 공유 데이터 구조의 내용에 액세스하는 데 사용한 임시 포인터 또는 인덱스가 더 이상 유효하지 않은 것으로 가정해야 합니다.

IRP 취소

재생 또는 캡처 스트림을 처리하는 동안 언제든지 IRP를 취소하면 운영 체제가 미니포트 드라이버가 획득한 하나 이상의 매핑을 취소할 수 있습니다. 이 경우 포트 드라이버는 IMiniportWavePciStream::RevokeMappings 메서드를 호출하여 미니포트 드라이버에 알립니다. 데이터를 재생하거나 해지된 매핑으로 데이터를 캡처하지 않도록 하려면 미니포트 드라이버는 소프트웨어 목록과 DMA 컨트롤러의 하드웨어 큐 모두에서 매핑을 제거해야 합니다. 소프트웨어 목록과 하드웨어 큐는 드라이버 스레드 간에 공유되므로 이러한 작업을 안정적으로 수행하려면 몇 가지 주의가 필요합니다.

예를 들어 해지할 매핑 집합에는 방금 출시되었거나 출시될 매핑이 포함될 수 있습니다. 이 경우 두 드라이버 스레드가 동시에 DMA 큐에서 동일한 매핑을 제거하려고 시도할 수 있습니다. 드라이버가 동시 액세스를 방지하지 못하면 큐를 관리하는 레지스터 또는 메모리 구조의 데이터가 손상될 수 있습니다.

작업 코드 예제는 WDK(Windows 드라이버 키트)의 Ac97 샘플 드라이버를 참조하세요.