월별 글 목록: 2004년 12월월

consistent_alloc() & consistent_sync()

아아.. 간신히 정체를 조금 알았다.

모든 문제는 DMA가 CPU를 거치지 않고 메모리를 읽고 쓰기 때문…

예를 들어 디바이스에서 메모리에 데이터를 쓴 경우, CPU가 그 주소에 대한

캐쉬를 가지고 있다면 CPU는 엉뚱한 데이터를 읽게 되는 것이다.

이를 해결하는 방법은 2가지.

하나는 CPU가 그 메모리 영역에 대해서는 캐쉬를 쓰지 않게 하는 것이고,

또 하나는 디바이스<->메모리 간의 데이터 이동이 일어나거나 일어난 후,

CPU의 캐쉬와 메모리를 동기화 시켜 주는 것이다.

전자에 쓰는 함수가 consistent_alloc()이고 후자에 쓰는 함수가 consistent_sync().

즉, consistent_alloc()과 consistent_free()가 없더라도, 원하는 바는 달성할 수 있지만… 좀더 복잡해 진다.

consistent_alloc()과 consistent_free()는 메모리 할당/해제시에 한번만 해주면 되지만,

consistent_sync()의 경우에는 디바이스에서 메모리를 읽기전이나,

디바이스에서 메모리에 쓴 후에 일일이 consistent_sync()를 호출해 줘야 된다.

흠… 결국…. dsplink소스를 다 뒤져서 해당 부분마다 consistent_sync()를 호출해 줘야 한단 말인데;;;