2013-10-30 7 views
0

나는 PCI 장치 드라이버를 쓰고 있어요 그리고 난 내가이 기능을 사용하고 , DMA에 대한 몇 가지 메모리를 할당해야합니다dma_addr_t를 리눅스 커널의 가상 주소로 변환하려면 어떻게해야합니까?

void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag); 

내가 장치에 dma_handle를 전달합니다.

이 함수의 반환 값은 커널에서 사용할 수있는 가상 주소입니다. 실제로 각 메모리 할당에 대해이 주소를 저장하지 않으려합니다.

물리적 주소 dma_handle을 커널에서 사용할 수있는 주소로 변환하는 방법이 있습니까? 이러한 기능/매크로 중 하나와 같은 일 :

virt_to_page(kaddr) 
page_to_pfn(page) 

phy_to_kvirt 매크로/함수 또는 가상 주소를 커널 실제 주소를 번역 할 수있는 다른 방법이?

감사

답변

5

아니, 거기하지 않고, dma_handle은 물리적 주소가 아닙니다. 특정 장치의 관점에서 본 물리적 주소입니다. 다른 버스에있는 서로 다른 장치는 주 메모리에 대해 완전히 다른 시각을 가질 수 있습니다. 그 외에도 반환 된 가상 주소는 주 메모리의 물리적 매핑과 고정 된 관계를 갖는 대신 동적으로 매핑 된 페이지 일 수 있습니다.

함께 특정 버스 아키텍처하지만 보장에 을 정보를 조각하고 빨리 기대하지 않는다 커널 구조에 충분한 정보 일 수있다 - 커널의 자신의 dma_free_coherent()는 당신이 모든 것을 제공 할 필요 , 가상 주소, 장치 및 dma_handle을 사용하여 작업을 수행해야합니다. 왜냐하면 그것이 아키텍처와 버스에서 보편적으로 작동 할 수있는 유일한 방법이기 때문입니다.

다시 말하면 다음과 같습니다. dma_handle은 자체적으로 의미가 없습니다. 여러 장치가 여전히 다른 메모리 위치를 참조하는 동일한 dma_handle을 가질 수 있습니다.

관련 문제