2013-07-03 4 views
0

낮은 수준의 드라이버에 동기 요청을 보내려고 할 때 드라이버가 멈추는 데 문제가 있습니다. 루틴은 현재이 루틴이 호출 될 때 DISPATCH_LEVEL에서 실행 중입니다.Windows 커널 모드 프로그래밍 : 드라이버 간의 교착 상태가 있습니까?

가 나는 마이크로 소프트가 제공하는 문서 "Locks, Deadlocks, and Synchronization"를 검토 봤는데 다음과 같은 말한다 :

낮은 IRQL에서 실행되는 코드가 성공적으로 잠금을 획득하는 경우를 고려하지만, 스레드가 코드를 실행 중단 높은 IRQL에서. 상위 IRQL 코드가 동일한 잠금을 획득하려고 시도하면 스레드가 영원히 중단 될 수 있습니다. 상위 IRQL 코드가 종료 될 때까지 하위 IRQL 코드는 실행될 수 없지만 상위 IRQL 코드는 하위 IRQL 코드가 잠금을 해제 할 때까지 종료 할 수 없습니다. 하나의 스레드 만이 관련됩니다. 이 문제를 방지하기 위해 잠금을 얻는 코드는 일반적으로 잠금을 획득하는 드라이버 코드를 실행할 수있는 가장 높은 IRQL로 IRQL을 올립니다.

우리의 문제는 우리에게 정지 화면과 블루 스크린을 제공하는 것입니다. DISPATCH_LEVEL에서 대기하는 호출을하지 말아야한다는 것과 이해할 수있는 디자인이 필요하다는 것을 알고 있지만 IRQL 메커니즘을 제대로 이해하고 있는지 확인하고 싶습니다.

IRQL이 프로세서 단위이고 다른 드라이버가 다른 프로세서에서 실행될 것이라고 수정합니까? 낮은 수준의 드라이버를 대상으로 한 동기 요청을 DISPATCH_LEVEL에서 발생시키는 것이 더 높은 IRQL로 인해 다른 드라이버의 스레드를 선점함으로써 실제로 문제를 일으키는 지 확인하고 싶습니다.

답변

2

일반 호출을 수행하는 경우 다른 코드는 동일한 CPU에서 같은 레벨로 실행됩니다. 비동기 전송을 수행하는 경우 다른 CPU에서 예약 될 수 있습니다. 높은 수준의 드라이버에서 낮은 수준의 드라이버로 동기화 보내기를 수행하는 경우 아마도 응답이 중지되어야합니다. 그냥 비동기로 만들고 완료 루틴을 작성하십시오.

+0

위대한 질문에 대답했습니다. 감사. – 8bitcartridge