>컴퓨터 튜토리얼 >문제 해결 >DMA Windows 드라이버용 소스 코드가 있습니까?

DMA Windows 드라이버용 소스 코드가 있습니까?

PHPz
PHPz앞으로
2024-01-18 08:30:16610검색

dma windows驱动源码吗?

DMA 관련 작업은 "리눅스 커널 심층 이해" 545페이지에 소개되어 있습니다. DMA에 관해 이야기할 때 캐시 문제를 언급해야 합니다. 이 책에서는 캐시 일관성 문제를 설명하기 위해 다음 예를 인용합니다.

장치 드라이버가 일부 데이터를 메모리 버퍼에 채운 다음 즉시 하드웨어 장치에 DMA 전송을 사용하여 데이터를 읽도록 명령한다고 가정합니다. DMA가 이러한 물리적 RAM 메모리 셀에 액세스하고 해당 하드웨어 캐시 라인의 내용이 아직 RAM에 기록되지 않은 경우 하드웨어 장치는 메모리 버퍼에서 이전 값만 읽습니다.

이제 DMA 버퍼를 처리하는 두 가지 방법이 있습니다.

일관적인 DMA 매핑:

이 책은 더 추상적입니다. 일반인의 용어로 말하면 DMA 버퍼를 다시 작성하면 메모리에 직접 업데이트됩니다. 동기화된 토지 또는 일관성이 있는 토지.

스트리밍 DMA 매핑:

개인적인 이해에 따르면 여기의 스트림은 입력 및 출력 스트림입니다. 버퍼를 읽을지, 쓸지 등 DMA 버퍼의 방향을 미리 지정해야 합니다. 비동기식 또는 비일관성이라고도 합니다. 자세한 내용은 아래를 참조하세요.

x86 아키텍처에서는 하드웨어 장치 드라이버 자체가 액세스된 하드웨어 캐시를 스누핑하므로 x86 아키텍처에서는 DMA 일관성 문제가 없습니다. MIPS, SPARC 및 POWERPC(ARM 포함)와 같은 다른 아키텍처의 경우 소프트웨어에서 DMA 일관성을 보장해야 합니다.

위 두 가지 중 하나를 선택하는 방법에 대해 책에 적절한 제안이 있습니다. CPU와 DMA 프로세서가 예측할 수 없는 방식으로 버퍼에 액세스하는 경우 일관된 DMA 매핑 방법을 사용해야 합니다(여기서는 제가 이야기하고 있습니다). 버퍼에 액세스하는 시기를 판단하는 것이 불가능하다는 점을 이해하세요.) 어떤 경우에는 스트리밍 DMA 매핑 방법이 더 좋습니다. 일부 아키텍처에서는 일관된 DMA 매핑을 처리하는 것이 번거롭고 시스템 성능이 저하될 수 있기 때문입니다.

스트리밍 DMA에 대한 자세한 소개는 다음과 같습니다.

액세스해야 하는 버퍼는 데이터 전송 전에 매핑되어야 합니다(여기서 매핑은 버퍼가 스트리밍된다는 것을 커널에 알리기 위해 일부 함수를 호출해야 함을 의미합니다). 전송 후 취소됩니다.

스트리밍 DMA 데이터 전송 시작은 다음 단계로 구분됩니다.

1. DMA 버퍼를 할당합니다.

DMA 장치가 S/G(분산/수집) 모드를 사용하지 않는 경우 버퍼가 물리적으로 연속적인지 확인해야 합니다. Linux 커널에는 연속 메모리를 할당하는 두 가지 기능인 kmalloc() 및 __get_free_pages( )가 있습니다. 두 함수 모두 연속 메모리 할당에 대한 최대값을 가지고 있습니다. kmalloc은 바이트를 단위로 할당하며, 최대값은 약 64KB이며, __get_free_pages()는 페이지를 단위로 할당하며 최대 2^order 수의 페이지를 할당할 수 있습니다. include/linux/Mmzone.h 파일의 MAX_ORDER 매크로에 의해 결정되는 순서 매개변수(기본 2.6.18 커널 버전에서 이 매크로는 10으로 정의됩니다. 즉, 이론적으로 __get_free_pages 함수는 최대

DMA 버퍼에 대한 액세스를 읽고 쓴 후 DMA 장치 전송을 시작하기 전에 dma_map_single() 함수를 활성화하여 스트리밍 DMA 매핑을 설정합니다.

3. 스트리밍 매핑을 해제합니다.

DMA 전송이 완료되면 dma_unmap_single() 함수를 해제해야 합니다.

(1) 일관성 문제를 피하기 위해 드라이버는 필요한 경우 DMA 버퍼에 해당하는 캐시 라인을 새로 고치기 위해 dma_sync_single_for_device()를 호출해야 합니다. 장치 드라이버는 이를 수행할 수 없습니다. DMA 데이터 전송이 완료되기 전에 메모리 버퍼에 액세스하지만 필요한 경우 드라이버는 버퍼를 읽기 전에 dma_sync_single_for_cpu() 함수를 호출하여 해당 하드웨어 캐시 라인을 무효화해야 합니다.

(3). 또한 __get_free_pages를 사용하여 구현되며 kmalloc에 ​​해당하는 릴리스 버퍼 함수는 kfree이고 __get_free_pages에 해당하는 릴리스 버퍼 함수는 free_pages입니다. __get_free_pages와 관련된 구체적인 응용 프로그램 및 릴리스 함수는 다음과 같습니다.

응용 기능:

alloc_pages(gfp_mask) ,order)는 할당된 첫 번째 페이지 프레임 설명자의 주소를 반환하고, 할당이 실패하면 NULL을 반환합니다. __get_free_pages(gfp_mask,order)는 alloc_pages()와 유사하지만 할당된 페이지의 선형 주소를 반환합니다. 선형 주소에 해당하는 페이지 프레임 번호를 얻으려면 virt_to_page(addr) 매크로를 호출하여 선형 주소를 생성해야 합니다. 여기서 해제 함수: __free_pages(page, order)는 주로 페이지가 다음을 수행해야 한다는 점을 강조합니다. 버퍼를 해제합니다. 선형 첫 번째 주소가 있는 페이지 프레임 번호 free_pages(page, order) 이 함수는 __free_pages(page, order)와 유사하지만 받는 매개변수는 첫 번째 페이지 프레임의 선형 주소 addr입니다. 출시

위 내용은 DMA Windows 드라이버용 소스 코드가 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 xtzjcz.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제