필터 드라이버에 대한 BypassIO
BypassIO 정보
BypassIO 기능은 파일에서 읽기에 최적화된 I/O 경로를 제공합니다. 이 경로의 목표는 읽기를 수행하는 CPU 오버헤드를 줄이는 것이며, 이는 Windows에서 차세대 게임을 로드하고 실행하는 I/O 요구를 충족하는 데 도움이 됩니다. BypassIO는 Windows에서 DirectStorage를 지원하는 인프라의 일부입니다. Windows 11부터 사용할 수 있습니다.
미니 필터가 BypassIO에 대한 지원을 구현하고 BypassIO를 최대한 사용하도록 유지하는 것이 중요합니다. 필터 지원이 없으면 게임 성능이 저하되어 최종 사용자에게 게임 환경이 저하됩니다.
향후 Windows 릴리스에서는 게임 외에 더 광범위한 애플리케이션 사용이 있을 것입니다.
BypassIO는 핸들당 개념입니다. BypassIO가 요청되면 명시적 파일 핸들을 위한 것입니다. BypassIO는 해당 파일의 다른 핸들에 영향을 주지 않습니다.
FSCTL_MANAGE_BYPASS_IO 및 이와 동등한 IOCTL_STORAGE_MANAGE_BYPASS_IO 이 인프라의 일부로 추가되었습니다. IOCTL_STORAGE_MANAGE_BYPASS_IO 파일 시스템에서 볼륨/스토리지 스택으로 전송하는 동안 미니 필터는 FSCTL_MANAGE_BYPASS_IO 처리합니다. 이러한 제어 코드는 진단 가능하도록 설계되었습니다. 두 코드는 모두 BypassIO 요청에 실패한 드라이버의 ID와 거부 이유를 반환합니다.
이 페이지에서는 파일 시스템 필터 및 스토리지 스택 전반의 아키텍처 세부 정보와 미니 필터 드라이버에서 BypassIO를 구현하는 방법에 대한 정보를 제공합니다. 스토리지 드라이버와 관련된 BypassIO 정보는 스토리지 드라이버에 대한 BypassIO를 참조하세요.
BypassIO 지원 범위
Windows 11부터 BypassIO는 다음과 같이 지원됩니다.
Windows 클라이언트 시스템에서만. 서버 시스템 지원은 향후 릴리스에서 추가될 예정입니다.
NVMe 스토리지 디바이스에서만. 다른 스토리지 기술에 대한 지원은 향후 릴리스에서 추가될 예정입니다.
NTFS 파일 시스템에서만. 다른 파일 시스템에 대한 지원은 향후 릴리스에서 추가될 예정입니다.
캐시되지 않은 읽기만 지원됩니다. 캐시되지 않은 쓰기에 대한 지원은 향후 릴리스에서 추가될 예정입니다.
파일에서만 지원됩니다(디렉터리 또는 볼륨 핸들에서는 지원되지 않음).
BypassIO 작동 방식
BypassIO 지원 FileHandle에서 NtReadFile을 호출하는 경우 작업은 일반적으로 전체 파일 시스템 스택, 볼륨 스택 및 스토리지 스택을 트래버스하는 기존 I/O 스택을 통과하지 않습니다. 대신, 작업은 I/O 관리자에서 (NTFS) 파일 시스템으로, 디스크(classpnp) 드라이버로, 그리고 StorNVMe 드라이버로 직접 이동합니다. 완전히 BypassIO 사용 FileHandle 사용:
- 모든 파일 시스템 필터를 건너뜁니다.
- 모든 볼륨 스택 필터를 건너뜁니다.
- 디스크 드라이버 위의 모든 스토리지 스택 필터 및 드라이버와 디스크와 StorNVMe 드라이버 간에 건너뜁니다.
파일 시스템 필터 스택이 BypassIO를 지원하지만 볼륨 및/또는 스토리지 스택이 지원하지 않는 시나리오에서는 다음을 수행하지 않습니다.
- 읽기 IO는 필터 스택을 무시합니다.
- 읽기 IO는 여전히 볼륨 및/또는 스토리지 스택을 통해 전송됩니다.
이 지원 수준을 부분 BypassIO라고 합니다.
BypassIO에 대한 DDI 변경 및 추가
BypassIO 지원을 제공하기 위해 필터 드라이버와 관련된 다음 DPI가 추가되었습니다.
- FltVetoBypassIo 함수
- FS_BPIO_INFLAGS 열거자
- FS_BPIO_INFO 구조체
- FS_BPIO_INPUT 구조체
- FS_BPIO_OPERATIONS 열거자
- FS_BPIO_OUTFLAGS 열거자
- FS_BPIO_OUTPUT 구조체
- FS_BPIO_RESULTS 구조체
- FSCTL_MANAGE_BYPASS_IO 제어 코드
- FsRtlGetBypassIoOpenCount 함수
또한 BypassIO를 지원하도록 다음 DPI가 변경되었습니다.
- BypassIoOpenCount 필드가 FSRTL_ADVANCED_FCB_HEADER 구조체에 추가되었습니다. 파일 시스템은 이 필드를 사용하여 현재 BypassIO를 사용하도록 설정된 스트림에서 고유한 FileObject의 수를 유지 관리합니다. 이 필드를 추가하면 구조체 크기가 증가합니다. Windows 11 부터 사용할 구조 버전은 FSRTL_FCB_HEADER_V4.
BypassIO 사용 핸들에 대한 다른 작업의 영향
핸들에서 BypassIO를 사용하도록 설정해도 다른 핸들에는 영향을 주지 않습니다. 그러나 BypassIO 사용 핸들의 다른 작업은 다음 시나리오와 같이 BypassIO 사용에 영향을 줍니다.
BypassIO가 활성화되고 작동하는 파일에 대한 핸들 A가 열려 있고 다른 사람(예: 다른 스레드 또는 프로세스)이 핸들 B를 열어 캐시되거나 메모리 매핑된 IO를 수행하는 경우 Handle B가 닫히기 전까지 Handle A에서 BypassIO가 일시적으로 일시 중단됩니다. 대신 시스템은 기존 I/O 경로를 사용하여 부실 데이터가 발생하지 않도록 보장합니다. 시스템은 모든 데이터 섹션 및 캐시 맵이 삭제될 때까지 해당 핸들에서 기존 I/O 경로를 계속 사용합니다. 따라서 BypassIO를 다시 시작하려면 먼저 필터가 핸들의 파일을 닫아야 합니다.
BypassIO 사용 파일이 스파스로 표시된 경우 모든 BypassIO 작업은 기존 I/O 경로를 사용하기 시작합니다.
BypassIO 사용 파일을 디버깅하면 모든 BypassIO 작업이 기존 I/O 경로를 사용합니다. 조각 모음이 완료되면 시스템은 해당 핸들의 BypassIO 경로로 다시 전환됩니다.
미니 필터에서 BypassIO 지원 구현
INF 또는 MANIFEST 파일 업데이트
Windows 11부터 필터 개발자는 드라이버의 INF 또는 MANIFEST 파일에서 SupportedFeatures에 SUPPORTED_FS_FEATURES_BYPASS_IO 추가해야 합니다. (관리자 권한 명령 프롬프트를 입력 fltmc instances
하여 모든 활성 필터에 대한 "SprtFtrs" 값을 볼 수 있습니다.)
참고 항목
BypassIO를 지원할 수 없는 필터는 여전히 SupportedFeatures 상태에 SUPPORTED_FS_FEATURES_BYPASS_IO 추가한 다음 필터 내에서 적절하게 거부하여 이유를 지정해야 합니다.
미니 필터는 바이패스IO 거부를 최대한 최소화하는 것이 좋습니다.
미니 필터가 BypassIO를 사용하도록 설정된 볼륨에 연결하지만 해당 미니 필터가 SUPPORTED_FS_FEATURES_BYPASS_IO 포함하도록 SupportedFeatures 설정을 업데이트하지 않은 경우 해당 볼륨의 모든 BypassIO 작업이 즉시 차단되어 기존 I/O 경로로 되돌아가 게임 성능이 저하됩니다.
IRP_MJ_READ 또는 IRP_MJ_WRITE 필터링하지 않는 미니 필터는 SupportedFeatures에서 SUPPORTED_FS_FEATURES_BYPASS_IO 추가한 것처럼 BypassIO 지원에 자동으로 옵트인됩니다.
옵트인하지 않는 연결된 미니 필터가 있는 경우 스택에서 FS_BPIO_OP_ENABLE 및 FS_BPIO_OP_QUERY 작업이 실패합니다.
BypassIO 요청에 대한 지원 구현
미니 필터는 FSCTL_MANAGE_BYPASS_IO 제어 코드를 통해 전송되는 BypassIO 요청에 대한 지원을 추가해야 합니다. 자세한 내용은 BypassIO 작업 지원을 참조 하세요 .
BypassIO가 작동하는지 확인
추가된 fsutil 명령은 FS_BPIO_OP_QUERY 작업을 지정하는 FSCTL_MANAGE_BYPASS_IO 실행합니다. 표시된 결과는 BypassIO를 방지하는 첫 번째 드라이버와 그 이유를 식별합니다.
> fsutil bypassIo state /v <path>
여기서 <경로> 는 볼륨, 디렉터리 또는 특정 파일 이름이 될 수 있으며 /v 는 선택적 자세한 정보 표시 플래그입니다.
이 첫 번째 예제에서는 WOF 미니 필터가 BypassIO를 옵트인하지 않았다고 가정합니다. 명령을 fsutil bypassIo state c:\
실행하면 다음 출력이 생성됩니다.
BypassIo on "c:\" is not currently supported.
Status: 506 (At least one minifilter does not support bypass IO)
Driver: wof.sys
Reason: The specified minifilter does not support bypass IO.
이 두 번째 예제에서는 BitLocker를 사용하는 시스템에서 실행 fsutil bypassIO state /v c:\
하면 다음 출력이 생성됩니다.
BypassIo on "c:\" is partially supported
Volume stack bypass is disabled (fvevol.sys)
Status: 495 (The specified operation is not supported while encryption is enabled on the target object)
Reason: BitLocker Drive Encryption is enabled.
Storage Type: NVMe
Storage Driver: BypassIo compatible
Driver Name: stornvme.sys
NTFS 관련 동작
BypassIO는 NTFS 상주 파일에서 사용하도록 설정할 수 있습니다. 그러나 파일이 상주하는 한 기존 I/O 경로를 취합니다. 파일이 비주거형이 되도록 파일에 쓰기가 발생하면 시스템은 BypassIO 경로를 사용하도록 전환합니다.
BypassIO 활성 파일에서는 NTFS 압축을 사용하도록 설정할 수 없습니다.
BypassIO 활성 파일에서 NTFS 암호화를 사용하도록 설정할 수 있습니다. BypassIO가 일시 중지되었습니다.
BypassIO는 읽기/쓰기 작업 오프로드에 영향을 주지 않습니다.