2013-06-10 2 views
1

팔 코어 텍스 -a9 쿼드 코어 장치가 있고 다중 프로세스 응용 프로그램을 프로그래밍하고 있습니다. 이 프로세스는 동일한 입력 소스, 즉 mmap() 호출을 사용하여 모두 액세스하는 DMA 버퍼를 공유합니다.임시로 캐시 할 수있는 DMA 메모리 만들기

프로세스가 DMA 메모리에 액세스하는 데 걸리는 시간이 입력 소스를 정상 할당 버퍼 (즉, malloc을 사용하여 할당 됨)로 변경하는 것보다 훨씬 더 오래 걸리는 것으로 나타났습니다.

버퍼가 안정적 일 때 (대부분의 경우 하드웨어에서 변경되지 않음) 또는 더티 (데이터가 있음)를 결정할 수 있기 때문에 DMA 버퍼를 캐싱 할 수없는 이유를 이해합니다. 변경됨) 메모리 영역을 일시적으로 캐시 가능하게 만들면 속도가 크게 향상 될 수 있다고 생각했습니다.

할 방법이 있습니까?

나는 현재 메모리를 매핑이 줄을 사용하고 있습니다 :

void *buf = mmap(0, size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, phy_addr); 

감사합니다!

+0

DMA 버퍼가 너무 광범위합니다. 당신은 어떻게 그것을 얻거나 만들 수 있습니까? –

+0

장치의 커널 모듈에 DMA_ALLOC_COHERENT가있는 DMA 버퍼를 만듭니다. – oferlivny

답변

1

대부분의 최신 CPU는 스누핑을 사용하여 캐시 라인을 메모리로 플러시하거나 유효하지 않은 것으로 표시해야하는지 여부를 결정합니다. 이러한 CPU에서 "DMA 버퍼"는 kmalloc() 버퍼와 동일합니다. 물론 이것은 스눕 기능이 올바르게 작동하고 OS가 스눕 기능을 이용하는 것으로 가정합니다. DMA 및 비 -DMA 메모리 영역에 대한 액세스가 다르다면 CPU가 캐시 스누핑 기능 (CPU 문서 확인)을 가지고 있지 않거나 기능이 사용되지 않는다고 추측 할 수 있습니다 (CPU 에라타 검사). 제안 된 접근 방식

문제 : 당신이 비 캐시로 다시 메모리 영역을 변경하는 시간이있을 때

  1. 알고 계십니까?
  2. 메모리 영역에 대한 MMU 설정을 변경하는 것이 항상 쉬운 것은 아니며 (CPU에 따라 다름) 이러한 설정을 변경하기 위해 OS에 API가 존재하는지 확신 할 수 없습니다.
  3. 메모리 영역에 대한 MMU 설정을 변경하는 것은 가능한 경우에도 위험하며 이러한 변경은 DMA 작업과 신중하게 동기화되거나 데이터 손상이 사실상 보장되어야합니다.

이러한 모든 중요한 문제를 감안할 때 DMA 버퍼가 업데이트되었을 때 DMA 버퍼에서 kmalloc() 버퍼로 데이터를 복사하는 것이 더 좋습니다.

+0

나는 메모리 수정의 타이밍을 완전히 제어 할 수있다. 또한 CPU가 snoop (ARM cortex-a9 쿼드 코어)을 지원할 것이라고 확신합니다. 복사는 우리의 대체 옵션이며,이 memcpy를 자신의 가상 메모리 공간에 사용해야하는 프로세스가 너무 많아서 그렇습니다. 이것은 메모리 집약적 인 메모리 프로 시저 일 수도 있습니다 ... – oferlivny

+0

저는 이러한 로직을 안전하게 구현할 수 있다고 확신합니다. API를 찾고 있습니다 ... – oferlivny

+0

아마 시스템에 대해 혼란스러워할지 모르지만 제가 제안하고있는 것은 어떨까요? DMA 버퍼에서'kmalloc' 버퍼까지 오직 하나의 복사본 만 있으면 DMA 버퍼가 아닌'kmalloc' 버퍼가'mmap()'된다. cortex-a9가 snoop 구조로 작동한다는 것을 확신한다면 DMA 버퍼로'kmalloc' 버퍼를 사용하십시오. – slowjelj