다음을 통해 공유


UMDF 드라이버에서 버퍼 액세스 메서드 관리

UMDF 드라이버를 작성하는 경우 프레임워크가 읽기 및 쓰기 요청에 사용하는 버퍼 액세스 방법과 디바이스 I/O 컨트롤 요청에 대한 기본 설정을 지정할 수 있습니다. UMDF 드라이버에서 제공하는 값은 기본 설정일 뿐이며 프레임워크에서 사용하도록 보장되지 않습니다.

기본 버퍼 액세스 방법 지정

UMDF 버전 2.0부터 UMDF 드라이버는 WdfDeviceInitSetIoTypeEx 를 호출하여 읽기/쓰기 요청 및 디바이스 I/O 제어 요청에 대한 기본 액세스 방법을 등록합니다.

드라이버가 WdfDeviceInitSetIoTypeEx를 호출하지 않는 경우 UMDF는 이 디바이스에 대한 I/O 요청에 버퍼링된 메서드를 사용합니다.

프레임워크는 다음 규칙을 사용하여 사용할 액세스 방법을 결정합니다.

  • 드라이버 스택의 모든 UMDF 드라이버는 디바이스의 버퍼에 액세스하는 데 동일한 메서드를 사용해야 하며 프레임워크는 버퍼링된 I/O에 대한 기본 설정을 제공합니다.

    UMDF에서 일부 드라이버가 디바이스에 버퍼링된 I/O 또는 직접 I/O를 선호하는 반면 다른 드라이버는 디바이스에 버퍼링된 I/O만 선호한다고 판단하는 경우 UMDF는 모든 드라이버에 버퍼링된 I/O를 사용합니다. 하나 이상의 스택 드라이버가 버퍼링된 I/O만 선호하는 반면 다른 드라이버는 직접 I/O만 선호하는 경우 UMDF는 이벤트를 시스템 이벤트 로그에 기록하며 드라이버 스택을 시작하지 않습니다.

    드라이버는 WdfDeviceGetDeviceStackIoType 을 호출하여 UMDF가 디바이스의 읽기/쓰기 요청 및 I/O 제어 요청에 할당한 버퍼 액세스 방법을 확인할 수 있습니다.

  • 경우에 따라 UMDF는 디바이스에 직접 I/O를 할당하지만 최상의 성능을 위해 하나 이상의 디바이스 요청에 버퍼링된 I/O를 사용합니다. 예를 들어 UMDF는 직접 액세스를 위해 버퍼를 매핑할 수 있는 것보다 더 빠르게 드라이버의 버퍼에 데이터를 복사할 수 있는 경우 작은 버퍼에 버퍼링된 I/O를 사용합니다.

    필요에 따라 드라이버는 WdfDeviceInitSetIoTypeEx를 호출할 때 DirectTransferThreshold 값을 제공할 수 있습니다. 프레임워크는 이 값을 사용하여 프레임워크에서 직접 I/O를 사용할 가장 작은 버퍼 크기를 결정합니다. 일반적으로 프레임워크는 최상의 성능을 제공하는 설정을 사용하기 때문에 이 값을 제공할 필요가 없습니다.

  • UMDF는 메모리 페이지 경계에서 시작되고 끝나는 버퍼 공간에만 직접 I/O를 사용합니다. 버퍼의 시작 또는 끝이 페이지 경계에 있지 않으면 UMDF는 버퍼의 해당 부분에 버퍼링된 I/O를 사용합니다. 즉, UMDF는 여러 I/O 요청으로 구성된 대규모 데이터 전송에 버퍼링된 I/O와 직접 I/O를 모두 사용할 수 있습니다.

  • 디바이스 I/O 제어 요청의 경우 UMDF는 I/O 제어 코드(IOCTL)가 직접 I/O를 지정하고 해당 디바이스의 모든 UMDF 드라이버가 직접 액세스 방법을 지정하기 위해 WdfDeviceInitSetIoTypeEx 를 호출한 경우에만 직접 I/O를 사용합니다.

I/O 요청에 대한 Access 메서드 검색

드라이버는 버퍼 액세스 방법에 관계없이 동일한 요청 개체 메서드 집합을 사용하여 데이터 버퍼에 액세스합니다. 따라서 대부분의 드라이버는 일반적으로 UMDF가 I/O 요청에 버퍼링된 I/O 또는 직접 I/O를 사용하는지 여부를 알 필요가 없습니다.

경우에 따라 I/O 요청에 대한 액세스 방법을 알고 있는 경우 드라이버의 성능을 향상시킬 수 있습니다. 예를 들어 일반적으로 직접 I/O를 사용하는 처리량이 높은 디바이스를 고려해 보세요. 드라이버가 I/O 요청을 받으면 유효성 검사를 위해 공유 버퍼 공간에서 로컬 드라이버 메모리로 데이터를 복사합니다.

그러나 드라이버가 버퍼링된 I/O를 사용하는 버퍼를 수신하는 경우도 있습니다. I/O 관리자가 이미 이 데이터를 중간 버퍼에 복사했으므로 드라이버는 매개 변수를 로컬로 복사할 필요가 없습니다. 복사 작업을 방지하여 드라이버는 성능을 향상시킵니다.

UMDF 드라이버는 WdfRequestGetEffectiveIoType 을 호출하여 I/O 요청의 버퍼 액세스 메서드를 가져옵니다. 위에서 설명한 대로 특정 요청에 대한 I/O 형식은 디바이스에 대한 프레임워크 할당 I/O 유형 설정과 다를 수 있습니다.

버퍼링된 I/O 또는 직접 I/O에서 변환

UMDF 드라이버는 "둘 다" 메서드를 사용할 수 없습니다.

그러나 일부 IOCTL(디바이스 I/O 제어 코드)의 정의 는 요청이 "둘 다" 메서드를 사용하도록 지정합니다. 필요에 따라 UMDF 드라이버는 이러한 디바이스 I/O 제어 요청의 버퍼 액세스 방법을 버퍼링된 I/O 또는 직접 I/O로 변환할 수 있습니다. 다음 단계를 사용합니다.

  1. 드라이버의 INF 파일의 INF DDInstall 섹션UmdfMethodNeitherAction 지시문을 포함합니다. 지시문 값을 설정하여 UMDF가 "둘 다" 액세스 메서드를 사용하는 디바이스 I/O 제어 요청을 드라이버에 전달해야 함을 나타낼 수 있습니다. 그렇지 않으면 UMDF는 오류 상태 값으로 이러한 I/O 요청을 완료합니다.

  2. UMDF가 버퍼링된 I/O 또는 직접 I/O 에 제공하는 개체 메서드를 사용하여 I/O 요청의 버퍼에 액세스합니다.

UMDF가 액세스 메서드를 버퍼링된 I/O 또는 직접 I/O로 변환할 수 있다고 확신하는 경우에만 "둘 다" 메서드를 사용하는 IOCTL 요청을 지원해야 합니다. 예를 들어 IOCTL이 I/O 제어 코드에 대한 버퍼 설명에 설명된 버퍼 사양 규칙을 따르지 않는 사용자 지정된 요청을 지정하는 경우 UMDF는 버퍼를 변환할 수 없습니다.