2014-07-05 3 views
0

나는 아주 처음으로 리눅스 디바이스 드라이버를 작성하고 있는데, 문제가 발생했다. 하나의 메모리 영역이 캐시되지 않게하고 싶습니다. 따라서 flush_cache_range()flush_tlb_range()을 사용하여이 메모리 영역의 캐시를 비 웁니다. 모든 것이 잘 컴파일되지만 커널 모듈을로드하려고하면 다음과 같은 오류가 발생합니다.리눅스 디바이스 드라이버에서 알려지지 않은 기호 flush_cache_range

Unknown symbol flush_cache_range (err 0) 
Unknown symbol flush_tlb_range (err 0) 

나는이게 이상하다고 생각합니다. 커널에 정의해서는 안됩니까?

다른 방법으로는 dma_alloc_coherent()을 사용하여 캐시되지 않은 메모리 영역을 할당 할 수도 있습니다. 하지만 장치 구조가 없으며이 매개 변수에 NULL을 전달해도 오류가 발생하지는 않았지만 거기에 있어야하는 데이터를 볼 수 없었습니다.

내 시스템에 대한 몇 가지 정보 : 통합 FPGA (자일링스 Zynq)가있는 ARM 마이크로 컨트롤러에서이를 실행하려고한다. FPGA는 일부 데이터를 CPU가 지정한 메모리 위치에 복사합니다. 이제 캐시에서 오래된 데이터를 가져 오지 않고이 메모리에 액세스하려고합니다.

도움이 매우 감사합니다.

답변

1

flush_cache_range()과 같은 기능은 모듈에서 사용하지 않기 때문에 사용할 수 없습니다.

DMA 장치가 액세스 할 수있는 메모리를 할당하려면 이어야하며 dma_alloc_coherent()을 사용해야합니다. 메모리 주소와 버스 주소를 올바르게 매핑 할 수 있도록 올바른 장치 구조가 필요합니다.

장치가 기존 프레임 워크 (예 : PCI)에서 처리되는 버스에없는 경우 플랫폼 장치를 만들어야합니다.

+0

감사합니다. 디바이스 구조가 없어도 마침내 실행되고 있다고 생각합니다. 그것은 장치에 대한 NULL 포인터를 전달할 때 작동하는 것 같습니다. 내 문제는 실제로 다른 곳에서 발생했습니다. – Konstantin

0

몇 가지 참고 사항 :

1 flush_cache_range가 .. 그냥 단순히 세척 (청소 + 무효화) "캐시되는 하나 개의 메모리 영역을 방지"하지 않는 캐시. 이후에 동일한 가상 범위를 통해이 메모리 영역에 대한 쓰기/읽기가 다시 캐시를 통과합니다.

2 FPGA가 메모리에 쓰기를하고 CPU가이 메모리에서 읽을 경우 아마도 캐시를 비우는 것이 올바른 방법이 아닙니다. 일반적으로 메모리 영역을 무효화 한 다음 FPGA에 쓰기를 지시해야합니다.

3 커널 소스에서 "$ {kernel-src} /Documentation/DMA-API.txt"를 살펴보십시오. 그것은 당신이 안전하게 (캐쉬 유지 보수 + phys_to_dma 번역) DMA를위한 특정 메모리 영역을 어떻게 사용할 수 있는지에 대한 많은 정보를 가지고 있습니다.

관련 문제