DMA를 사용할 때 고려해야 할 사항
이 섹션에서는 미니포트 드라이버에서 DMA 작업을 사용하려는 경우 고려해야 할 몇 가지 중요한 사항을 제공합니다.
VideoPortStartDma에 대한 추가 정보
디스플레이 드라이버는 일반적으로 해당 DMA 전송을 실제로 수행하는 미니포트 드라이버에 전송 요청을 보냅니다. 디스플레이 드라이버는 DMA 엔진이 유휴 상태이기 때문에 전송 요청의 모든 데이터가 전송되었다고 가정할 수 없습니다. 미니포트 드라이버가 큰 전송 요청에 대해 VideoPortStartDma 및 VideoPortCompleteDma 를 여러 번 호출해야 하기 때문입니다. 하드웨어의 DMA 엔진은 전송할 추가 데이터가 있을 수 있지만 이러한 두 DMA 작업 간에 유휴 상태입니다. 전송 요청이 완전히 완료되었을 때 디스플레이 드라이버에 알리는 것은 미니포트 드라이버의 책임입니다.
VideoPortStartDma의 컨텍스트 매개 변수는 하드웨어 확장의 메모리와 같이 페이지가 지정되지 않은 메모리를 가리킵니다. 이 매개 변수는 IRQL DISPATCH_LEVEL 실행되는 미니포트 드라이버의 HwVidExecuteDma 콜백 루틴으로 전달됩니다.
DMA 및 인터럽트
많은 디바이스의 경우 하드웨어 DMA 작업이 완료되면 인터럽트를 생성합니다. 비디오 미니포트 드라이버의 ISR(인터럽트 서비스 루틴)은 추가 DMA 관련 작업을 위해 DPC 루틴을 큐에 대기해야 합니다. ISR에서 비디오 포트 드라이버의 DMA 함수는 IRQL DISPATCH_LEVEL 이하에서만 호출할 수 있으므로 호출하지 마세요.
VideoPortStartDma의 pLength 인수가 가리키는 변수가 HwVidExecuteDma가 호출될 때 이미 업데이트되었으므로 VideoPortStartDma 함수가 아직 반환되지 않은 경우에도 앞서 언급한 DPC 루틴에서 전송되는 크기를 확인하는 것이 안전합니다.
논리적 주소와 실제 주소 비교
비디오 포트 드라이버의 DMA 구현은 DMA 하드웨어에서 사용하는 주소인 논리 주소의 개념을 사용합니다. 논리적 주소는 실제 주소와 다를 수 있습니다. 비디오 포트 드라이버 제공 DMA 함수는 플랫폼별 메모리 제한을 고려합니다. 이러한 이유로 MmGetPhysicalAddress와 같은 커널 모드 함수 대신 비디오 포트 드라이버 DMA 함수를 사용하는 것이 중요합니다. 논리 주소에 대한 자세한 내용은 어댑터 개체 및 DMA 를 참조하세요.
동시 DMA
동시 DMA 전송을 지원하는 디바이스의 경우 동시 읽기 및 쓰기를 지원하는 DMA 컨트롤러 또는 두 개의 개별 DMA 컨트롤러에서 미니포트 드라이버는 각 동시 경로에 대해 별도의 DMA 어댑터 개체를 가져와야 합니다. 예를 들어 디바이스에 병렬로 작동하는 두 개의 DMA 컨트롤러가 있는 경우 미니포트 드라이버는 VideoPortGetDmaAdapter를 두 번 호출하여 두 개의 VP_DMA_ADAPTER 구조에 대한 포인터를 가져와야 합니다. 그런 다음 미니포트 드라이버가 특정 DMA 컨트롤러의 DMA 전송 요청을 할 때마다 해당 요청에 적절한 포인터를 사용해야 합니다.