데이터 복사 및 캐싱 정책

WaveCyclic 미니포트 드라이버는 HD 오디오 컨트롤러 하드웨어가 액세스하는 DMA 버퍼와 사용자 모드 오디오 애플리케이션이 액세스하는 클라이언트 버퍼 간에 오디오 데이터를 복사합니다.

  • 재생 데이터 스트림의 경우 드라이버는 클라이언트 버퍼에서 DMA 버퍼로 데이터를 복사합니다.

  • 캡처 데이터 스트림의 경우 드라이버는 DMA 버퍼에서 클라이언트 버퍼로 데이터를 복사합니다.

재생 및 캡처 스트림 모두에 대해 드라이버는 DMA 버퍼 메모리(캐시 형식 MmCached)의 캐싱을 사용하도록 설정하고 PCI 컨트롤러의 버스 스누핑 메커니즘을 사용하여 캐시 일관성을 보장함으로써 최상의 성능을 달성할 수 있습니다. 그러나 일부 PCI Express 컨트롤러 구현은 HD 오디오 컨트롤러의 등시 데이터 전송(예: Intel의 초기 PCI Express 칩셋)을 스누핑하지 않습니다.

함수 드라이버는 PCI 컨트롤러 하드웨어가 DMA 버퍼 전송의 스누핑을 지원하는지 또는 등시 데이터 전송을 수행하는지 여부를 감지할 수 없습니다. 잠재적 캐시 일관성 문제를 방지하기 위해 드라이버는 해당 메모리의 캐싱 유형을 MmWriteCombined로 지정하여 DMA 버퍼 메모리의 캐싱을 사용하지 않도록 설정합니다. (MmNonCached 도 작동하지만 잘 수행되지 않을 수 있습니다.) 샘플 함수 드라이버를 기반으로 하는 사용자 지정 어댑터 드라이버를 작성하는 경우 PCI 컨트롤러가 실제로 DMA 버퍼 전송 스누핑을 지원하는지 확인할 수 없는 한 WaveCyclic 미니포트 드라이버도 비슷하게 동작해야 합니다.

버스 스누핑을 수행하지 않는 디바이스 및 시스템을 지원하려면 사용자 지정 함수 드라이버가 다음 규칙을 따라야 합니다.

  • 재생 스트림의 경우 DMA 버퍼의 캐시 유형을 MmWriteCombined로 지정합니다. 클라이언트 버퍼에서 DMA 버퍼로 데이터 블록을 복사한 후 KeMemoryBarrier 함수를 호출하여 DMA 엔진에 데이터를 표시합니다. KeMemoryBarrier 는 프로세서의 데이터 캐시를 크게 방해받지 않는 효율적인 방식으로 복사된 데이터를 메모리에 플러시합니다.

  • 캡처 스트림의 경우 DMA 버퍼의 캐시 유형을 MmWriteCombined 또는 MmNonCached로 지정합니다. 또한 함수 드라이버는 DMA 버퍼에 쓰지 않아야 합니다. 오디오 샘플의 현재 위치 처리를 수행해야 하는 경우 먼저 데이터를 다른 곳에 복사해야 합니다.

함수 드라이버가 DMA 버퍼에 복사하거나 DMA 버퍼에서 복사하는 데이터 블록은 쓰기 결합 버퍼 경계에서 시작하거나 종료할 필요가 없으며, 해당 크기가 쓰기 결합 버퍼 크기의 배수(일반적으로 32바이트 또는 64바이트)일 필요는 없습니다.

DDI의 HDAUDIO_BUS_INTERFACE_BDL 버전을 사용하는 코덱 함수 드라이버의 경우 AllocateContiguousDmaBuffer 루틴은 DMA 버퍼 메모리의 할당 및 매핑을 모두 수행합니다. 루틴은 항상 버퍼의 캐시 유형을 MmWriteCombined로 설정합니다.

쓰기 결합에 대한 자세한 내용은 Intel 웹 사이트의 IA-32 Intel 아키텍처 소프트웨어 개발자 설명서를 참조하세요.