2009-11-19 2 views
2

속도에 대한 몇 가지 요구 사항으로 인해 내부 메모리에서 일부 계산을 수행 한 다음 계산 결과를 외부 메모리로 DMA해야합니다. 이 애플리케이션은 ARM926EJ-S 코어 및 TI 주변 장치 (EDMA, 비디오 가속기 등)를 기반으로하는 TI DM355 프로세서에서 실행된다.GNU/Linux의 사용자 프로세스에서 ARM의 내부 메모리에 액세스

응용 프로그램에서 얼마나 깔끔하게 처리 할 수 ​​있습니까? 앞에서 언급 한 내부 메모리 주소를 가상 공간으로 mmap'ing하여 계산하는 것만 큼 간단합니까?

감사합니다.

+0

나는 이것이 어려울 수 있다고 말할 것이다. 리눅스는 심지어 mmap의 명시적인 제어를 허용 할까? 최악의 경우, 발을 조금 젖히고 커널 모듈을 작성해야 할 수도 있습니다. – Earlz

답변

3

당신은/dev/mem 장치를 메모리 매핑 할 수 있습니다. 여기에 Another question에 대한 해답이 있지만, 커널 모듈에서이 문제를 해결하는 것이 더 나을 것입니다.

+1

이 특수한 경우에'msync'가 필요하지 않다는 점을 제외하고는 올바른 것입니다 (백업 "파일"이 파일이 아니기 때문에). 아프지 않을거야. – caf

+0

Aaah-good point! 나는 기억이 얼마나 직접적 이었는지 확신 할 수 없었다. – LnxPrgr3

+0

고마워요. 나는 밖으로 mmap 시도합니다. –

0

나는 커널 및/또는 드라이버 지원이 필요하다고 생각합니다. 플랫폼과 관련된 Linux 배포판을 사용하는 경우 이미 제공되는 것이있을 수 있습니다. 가지고있는 문서 나 샘플 코드를 확인하십시오.

사실은 여기에 매핑하는 방법에 대한 기사를 발견했다 :

http://www.simtec.co.uk/appnotes/AN0014/

이 GPIO 레지스터에 접근하기위한 것입니다,하지만 코드가 다른과, 온 - 칩 메모리에 대한 동일해야합니다 주소. 물론 다른 곳에서 이미 그 공간을 사용하고 있다면지도를 작성하고 수정하기 시작하면 충돌이 발생합니다. 따라서 더 많은 문서 파기가 필요할 것입니다. 당신의 시스템을위한 커널 메모리 맵이 있습니까?

int mem_fd = open("/dev/mem", O_RDWR); 
void *buffer = mmap(NULL, mem_segment_length, PROT_READ | PROT_WRITE, MAP_SHARED, 
        mem_fd, mem_segment_addr); 
close(mem_fd); 
/* buffer now points to your device's memory */ 
/* remember to call msync after writing to this to force changes to write back to 
* /dev/mem */ 

것은 그러나, 필요에 따라,이 충분하지 않을 수 있습니다

+0

감사합니다. 나는 커스텀 rootfs와 커널을 사용하고있다. 나는 mmap을 시도 할 것이다. 링크를 가져 주셔서 감사합니다. 나는 지금 그것을 더 잘 이해하고있다. –

0

또한 메모리에 페이지를 고정 할 수 있음을 기억합니다. 내가 틀렸다면 나를 바로 잡아라.

관련 문제