나는 아주 처음으로 리눅스 디바이스 드라이버를 작성하고 있는데, 문제가 발생했다. 하나의 메모리 영역이 캐시되지 않게하고 싶습니다. 따라서 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가 지정한 메모리 위치에 복사합니다. 이제 캐시에서 오래된 데이터를 가져 오지 않고이 메모리에 액세스하려고합니다.
도움이 매우 감사합니다.
감사합니다. 디바이스 구조가 없어도 마침내 실행되고 있다고 생각합니다. 그것은 장치에 대한 NULL 포인터를 전달할 때 작동하는 것 같습니다. 내 문제는 실제로 다른 곳에서 발생했습니다. – Konstantin