다음을 통해 공유


I/O 작업에 대한 버퍼링 메서드 확인

디바이스 드라이버와 마찬가지로 파일 시스템은 사용자 모드 애플리케이션과 시스템의 디바이스 간에 데이터를 전송해야 합니다. 운영 체제는 데이터 버퍼에 액세스하기 위한 다음 세 가지 방법을 제공합니다.

  • 버퍼링된 I/O에서 I/O 관리자는 비페이지 풀에서 작업에 대한 시스템 버퍼를 할당합니다. I/O 관리자는 I/O 작업을 시작한 스레드의 컨텍스트에서 이 시스템 버퍼의 데이터를 애플리케이션의 사용자 버퍼로 복사합니다.

  • 직접 I/O에서 I/O 관리자는 사용자 버퍼를 검색하고 잠가줍니다. 그런 다음, 잠긴 버퍼를 매핑하는 MDL(메모리 설명자 목록)을 만듭니다. I/O 관리자는 I/O 작업을 시작한 스레드의 컨텍스트에서 버퍼에 액세스합니다.

  • 버퍼링되거나 직접 I/O에서 I/O 관리자는 시스템 버퍼를 할당하지 않으며 사용자 버퍼를 잠그거나 매핑하지 않습니다. 대신 버퍼의 원래 사용자 공간 가상 주소를 파일 시스템 스택에 전달하기만 하면 됩니다. 드라이버는 시작 스레드의 컨텍스트에서 실행 중이고 버퍼 주소가 유효한지 확인해야 합니다.

    미니필터 드라이버는 사용하기 전에 사용자 공간의 주소에 대한 유효성을 검사해야 합니다. I/O 관리자 및 필터 관리자는 이러한 주소의 유효성을 검사하지 않으며 미니필터 드라이버에 전달되는 버퍼에 포함된 포인터의 유효성을 검사하지 않습니다.

모든 표준 Microsoft 파일 시스템은 대부분의 I/O 처리에 버퍼링되거나 직접 I/O를 사용하지 않습니다.

버퍼링 메서드에 대한 자세한 내용은 데이터 버퍼에 액세스하는 메서드를 참조하세요.

IRP 기반 I/O 작업의 경우 사용되는 버퍼링 메서드는 작업별이며 다음 요인에 따라 결정됩니다.

  • 수행 중인 I/O 작업의 형식입니다.

  • 파일 시스템 볼륨에 대한 DEVICE_OBJECT 구조체의 Flags 멤버 값입니다.

  • I/O 컨트롤(IOCTL) 및 FSCTL(파일 시스템 제어) 작업의 경우 IOCTL 또는 FSCTL이 정의될 때 CTL_CODE 매크로에 전달된 TransferType 매개 변수의 값입니다.

버퍼가 있는 빠른 I/O 작업은 항상 버퍼링되거나 직접 I/O를 사용하지 않습니다.

파일 시스템 콜백 작업에는 버퍼가 없습니다.

이 단원에는 다음이 포함됩니다.

IRP-Based 또는 빠른 I/O가 될 수 있는 작업

디바이스 개체 플래그를 준수하는 IRP 기반 I/O 작업

항상 버퍼링된 I/O를 사용하는 IRP 기반 I/O 작업

항상 버퍼링되거나 직접 I/O를 사용하지 않는 IRP 기반 I/O 작업

IRP 기반 IOCTL 및 FSCTL 작업

버퍼가 없는 IRP 기반 I/O 작업