DMA 확인

DMA 확인은 DMA(직접 메모리 액세스)의 사용을 모니터링합니다. Windows가 개발됨에 따라 DMA 루틴이 변경되었으므로 많은 드라이버가 DMA 호출을 잘못 사용합니다. 또한 일부 드라이버 작성기는 HAL DMA 하위 시스템을 모두 우회하려고 시도합니다. 이 연습에서는 드라이버에 교활한 버그를 도입할 수 있습니다.

드라이버 검증 도구의 DMA 확인 옵션은 일반적인 DMA 오류를 catch하려고 시도합니다. !dma 커널 디버거 확장과 함께 드라이버가 적절한 방식으로 DMA를 사용하고 있는지 확인하는 데 사용할 수 있습니다.

이 드라이버 검증 도구 옵션을 HAL 확인이라고도 합니다. 드라이버 검증 도구에서 생성된 일부 오류 메시지는 이 용어를 사용할 수 있습니다.

다양한 유형의 DMA

DMA는 하드웨어 디바이스가 프로세서를 사용하지 않고 메모리 간 데이터를 전송할 수 있는 메커니즘입니다. 프로세서는 전송을 설정해야 하며, 전송이 완료되면 디바이스가 프로세서에 신호를 보냅니다. 이 시스템의 장점은 DMA 전송이 수행되는 동안 프로세서가 다른 작업을 수행할 수 있다는 것입니다.

Windows 2000 이상에서 사용되는 DMA에는 여러 가지 유형이 있습니다.

공통 버퍼 DMA
공용 버퍼 DMA는 시스템에서 하드웨어와 소프트웨어 모두에서 액세스할 수 있는 단일 버퍼를 할당할 수 있을 때 수행됩니다. 드라이버는 버퍼에 대한 액세스를 동기화해야 합니다. 메모리가 캐시되지 않으므로 드라이버에서 이 동기화를 더 쉽게 수행할 수 있습니다. 공통 버퍼를 설정한 후 드라이버와 하드웨어는 HAL의 개입 없이 버퍼의 주소에 직접 쓸 수 있습니다.

패킷 DMA
패킷 DMA는 하드웨어에서 사용하기 위해 매핑해야 하는 단일 기존 버퍼가 있는 경우 수행됩니다. 패킷 DMA를 사용하는 예는 메모리에서 디스크로 파일을 전송하는 것입니다. 이 상황에서 공통 버퍼 DMA를 사용하는 것은 하드웨어가 디스크로 전송하기 전에 파일을 공통 버퍼로 전송해야 하기 때문에 낭비될 수 있습니다. 대신 HAL을 참조합니다. 하드웨어가 메모리에서 실제 버퍼를 찾는 데 필요한 정보를 드라이버에 제공합니다. 이 작업은 관련된 루틴이 여러 아키텍처에서 작동해야 하기 때문에 복잡합니다.

분산/수집 DMA
분산/수집 DMA는 한 번에 여러 패킷 DMA 전송을 설정하는 바로 가기 방법입니다. 예를 들어 네트워크를 통해 패킷을 전송하는 경우 네트워크 스택의 각 부분은 자체 헤더(TCP, IP, 이더넷 등)를 추가합니다. 이러한 헤더는 모두 메모리의 다른 위치에서 할당됩니다. 이 경우 분산/수집 DMA는 HAL에 일괄 처리 요청을 실행하여 각 헤더와 하드웨어의 액세스를 위한 데이터 세그먼트를 매핑하여 시간을 절약합니다. 이 메서드는 패킷의 각 부분에서 패킷 DMA 루틴을 호출하는 대신 각 루틴을 한 번 호출하고 HAL이 각 루틴을 개별적으로 매핑할 수 있도록 합니다.

참고분산/수집 기능은 디바이스가 분산/수집 루틴을 사용할 수 있음을 의미하지는 않습니다. 분산/수집 기능은 디바이스가 특정 범위가 아닌 메모리의 모든 영역에서 읽거나 쓸 수 있음을 나타내는 디바이스 설명의 플래그를 나타냅니다.

시스템 DMA
시스템 DMA는 마더보드에서 시스템 DMA 컨트롤러를 프로그래밍하여 직접 전송을 수행합니다. ISA 카드만 시스템 DMA를 사용할 수 있습니다.

DMA 확인의 효과

DMA 확인이 활성화되면 드라이버 검증 도구는 다음을 비롯한 DMA 루틴의 오용을 검색합니다.

  • DMA 메모리 버퍼를 오버런하거나 과소 실행합니다(이러한 오류는 하드웨어 또는 드라이버에서 수행할 수 있음).

  • 공통 버퍼, 어댑터 채널, 지도 레지스터 또는 분산/수집 목록을 두 번 해제합니다.

  • 일반적인 버퍼, 어댑터 채널, 맵 레지스터, 분산/수집 목록 또는 어댑터를 해제하지 않음으로써 메모리 누수.

  • 어댑터에 대해 한 번에 둘 이상의 어댑터 채널이 있습니다.

  • 이미 해제되어 더 이상 존재하지 않는 어댑터를 사용하려고 합니다.

  • 어댑터 버퍼를 플러시하지 않습니다.

  • 어댑터에 대한 미해결 참조 수가 너무 많습니다.

  • 페이딩 가능한 버퍼에서 DMA를 수행합니다(DMA 전송이 시작되기 전에 모든 버퍼를 잠가야 합니다).

  • 부서진 플래그를 사용하여 MDL에서 DMA를 수행합니다.

  • 첫 번째 MDL 앞이나 첫 번째 MDL의 끝 후 또는 MDL 버퍼보다 긴 전송 길이를 사용하여 잘못된 시스템 주소를 참조하고 MDL 내의 페이지 경계를 넘습니다.

  • 한 번에 너무 많은 맵 레지스터를 할당하거나 허용되는 최대 개수보다 더 많은 맵 레지스터를 할당합니다.

  • 지도 레지스터의 이중 매핑입니다.

  • 일부는 여전히 매핑되는 동안 맵 레지스터를 해제하려고 시도합니다.

  • 매핑되지 않은 맵 레지스터를 플러시하려고 시도합니다.

  • 맵 레지스터 파일의 끝에 너무 많은 바이트를 플러시하려고 시도합니다.

  • 부적절한 IRQL에서 DMA 루틴 호출

  • Null 값 DMA_ADAPTER HAL 루틴에 전달합니다.

  • 주소가 MDL에 포함되지 않은 경우 주소 및 MDL을 HAL 루틴에 전달합니다.

  • 이미 매핑된 주소 범위를 매핑하려고 합니다.

  • 매핑되지 않은 버퍼를 플러시하려고 시도합니다.

  • 전송을 위해 길이가 0인 버퍼를 매핑하려고 합니다.

  • 사용되지 않는 함수 HalGetAdapter 를 호출합니다(모든 드라이버는 대신 IoGetDmaAdapter 를 사용해야 합니다).

드라이버 검증 도구는 드라이버의 동작을 모니터링하고 이러한 위반이 발생하는 경우 버그 검사 0xE6 발급합니다. 버그 검사 매개 변수 목록은 버그 검사 0xE6(DRIVER_VERIFIER_DMA_VIOLATION)을 참조하세요.

DMA 확인은 언제 유용합니까?

HAL DMA 루틴을 호출하여 DMA를 직접 사용하는 모든 드라이버는 DMA 확인을 사용하여 테스트해야 합니다.

또한 미니포트 드라이버는 DMA를 사용하는 포트 드라이버를 호출하여 DMA를 간접적으로 사용하는 경우가 많기 때문에 테스트해야 합니다.

DMA 확인은 드라이버 또는 하드웨어 디바이스가 DMA 버퍼를 오버런할 때 발견할 수 있으므로 메모리 손상을 감지하는 효과적인 방법일 수도 있습니다.

DMA 확인 모니터링

커널 디버거 확장 !dma 를 사용하여 풍부한 DMA 정보를 표시할 수 있습니다. 각 DMA 어댑터의 동작에 대한 다양한 세부 정보를 표시할 수 있습니다. Windows용 디버깅 도구 패키지의 설명서에는 !dma 확장에 대한 자세한 예제와 디버거 확장에 대한 일반적인 정보가 있습니다. 자세한 내용은 Windows 디버깅을 참조하세요.

이 옵션 활성화

드라이버 검증 도구 관리자 또는 Verifier.exe 명령줄을 사용하여 하나 이상의 드라이버에 대한 DMA 확인 기능을 활성화할 수 있습니다. 자세한 내용은 드라이버 검증 도구 옵션 선택을 참조하세요.

  • 명령줄에서

    명령줄에서 DMA 확인 옵션은 비트 7(0x80)으로 표시됩니다. DMA 확인을 활성화하려면 플래그 값 0x80 사용하거나 플래그 값에 0x80 추가합니다. 예:

    verifier /flags 0x80 /driver MyDriver.sys
    

    이 기능은 다음 부팅 후에 활성화됩니다.

    Windows Vista 이상 버전의 Windows에서는 명령에 /volatile 매개 변수를 추가하여 컴퓨터를 다시 부팅하지 않고 DMA 확인을 활성화하고 비활성화할 수도 있습니다. 예:

    verifier /volatile /flags 0x80 /adddriver MyDriver.sys
    

    이 설정은 즉시 유효하지만 컴퓨터를 종료하거나 다시 부팅하면 손실됩니다. 자세한 내용은 Volatile 설정 사용을 참조하세요.

    DMA 확인 기능도 표준 설정에 포함되어 있습니다. 예:

    verifier /standard /driver MyDriver.sys
    
  • 드라이버 검증 도구 관리자 사용

    1. 드라이버 검증 도구 관리자를 시작합니다. 명령 프롬프트 창에 검증 도구 를 입력합니다.
    2. 사용자 지정 설정 만들기(코드 개발자용)를 선택하고 다음을 클릭합니다.
    3. 전체 목록에서 개별 설정 선택을 선택합니다.
    4. (검사) DMA 확인을 선택합니다.

    DMA 확인 기능은 표준 설정에도 포함됩니다. 이 기능을 사용하려면 드라이버 검증 도구 관리자에서 표준 설정 만들기를 클릭합니다.