본문 바로가기

Programming/ARM

Cache - Flush, clean, Invalidate

cache 의 disable 하는 방법을 찾다가
invalidate 와 diable 의 용어의 혼돈이 생겨서 검색하던중 좋은 자료를 발견하였다.
헌데 cache disable 은 어떻게 하는걸까 ㅡㅡ;
찾으면 추가로 정리하겠다.

원문 :  http://blog.naver.com/PostView.nhn?blogId=sadbiker&logNo=90016135740&redirect=Dlog&widgetTypeCall=true



Cache Flush와 Invalidate

 

Cache란 뭐 다들 아시다시피..

저장공간(일반적 메모리와 하드등 저장공간)과 CPU사이에 속도차이를 줄여주기 위하여 있는 소형(비싸서 작은것만 쓰져) 메모리 공간입니다.. 주로 CPU내부에 장착되어 있다지요? ^^

 

그래서 CPU는 저장장치에서 Data를 리드하기 이전에 Cache를 뒤져보고 없으면 저장공간에서 읽고, 있으면 Cache에서 읽어드립니다..

 

근데.. 그냥 단순하게 Read면 문제가 없지만 Read하여 수정할경우 Write operation이 됩니다.. 그럼 CPU는 Cache의 값만 변경합니다..

그럼 어찌될까요?

저장공간과 Cache 상의 데이터 불일치가 일어나게 됩니다.. Cache는 저장공간의 복사본이니까요.. 하지만 단순하게 CPU만 저장장치에 접근한다면 아무문제없습니다..

다시 Data를 읽어도 Cache에서 읽기 때문에 수정된값을 다시 읽게 됩니다..

 

그럼.. 왜 Cache Flush와 Invalidate 라는게 있을까요?

Cache Flush는 Cache의 내용을 저장공간에 다시 써주는걸 말합니다. Data 일치화를 시키려는 거지요..

Cache Invalidate는 Cache의 내용을 무효화 합니다.. 머.. 지워버린다고 생각하시면 되지요..

보통 Cache Flush 작업은. Cache Invalidate를 수반합니다.. Cache를 저장공간과 일치시킨뒤 무효화를 자동적으로 수행하지요.. 라이브러리에 따라 안그런경우도 있으니 매뉴얼을 꼭확인하시기 바랍니다. ^^

 

갑자기 설명이 나와서 왜 사용하는지에 대해서 언급을 안했군요 ^^

사실 폰노이만 구조(중앙처리장치가 모든 제어권을 관장하는 구조)에서는 별로 사용할 일이 없습니다 하버드 구조(다중 처리장치가 제어권을 공유하는 구조)에서는 많이 쓰겠네요 ^^

 

하지만 일반 CPU 장치는 대부분 폰노이문 구조로 되어있습니다.. 근데.. 폰노이만 구조에서 CPU에게 제어권을 훔쳐오는 녀석이 있으니. 이녀석이 바로

(~쿠쿵)DMA Controller(쿠쿵~) 입니다. 이녀석은 CPU의 버스제어권을 훔쳐서 지가 저장장치(주메모리)에 바로 값을 읽고 쓰고 하는 녀석이지요.. CPU 모르게..살짝~(사실 물어보고 하긴 하지만)  만약.. DMA로 값을 읽어온 Data가 Cache에 존재하고 있었다면 CPU는 원값이 바뀐줄도 모르고 계속 Cache에서 값을 읽어오게 됩니다. 호환 마마보다 더무섭다는 Data 불일치가 발생하는거지요 바로 이때가..

Cache Invalidate 가 필요할때입니다.

Cache를 무효화하여 다시 주메모리의(DMA에 의해서 몰래 변경된) Data를 다시 읽어 드리게 해야 합니다.

 

그럼 Cache Flush는 어느때 사용하느냐?

마찬가지 입니다. CPU가 계속 읽고 쓰면서 변경한 Data를 타보드나 타장비로 전송하려고 할 때.. 뭐 for loop를 돌려서 쓰면야.. 문제 없겠지만.. 그럼 무지 느려지겠지요? ㅋㅋ

보통 DMA로 전송하게 됩니다. DMA는 Cache에서 값을 읽지 않고 주메모리에서 바로 읽어서 보내기 때문에.. 역시 내가 바꾼값이 전송되지 않고 이전값이 전송되게 되어있습니다.

 

바로 이때 Cache Flush가 필요할때입니다..

Cache의 내용을 주메모리에 다시 써주어 Data 불일치를 해소시키고나서..

DMA로 전송하셔야 바뀐값이 전송됩니다. ^^

 

그냥 참고삼아서 말씀드리면(사족)

보통 장비에서.. 주메모리는 Cacheable 영역과 Non Cacheable 영역이 구분되어있습니다. (아닌경우도 있지만) 연산이 많이 필요하여 Data를 주기적으로 읽어야 하는 변수(배열등)은 Cacheable 영역에 두셔야 연산이 빠르고.. 타장비와 DMA등을 통한 입출력 Data는 Non Cacheable영역에 두는 것이 효율적입니다. ^^

 

그럼 이만~ ^^



원문 : http://www.iamroot.org/xe/?mid=Kernel_4_ARM11&page=3&listStyle=gallery&document_srl=5705

Flush 와 Clean 에 대해
[ARM System Developer's Guide] p477 에 자세히 설명 나와 있네요.
참고 하세요.

약간 귀찮으신 분(?)을 위해 간단히 적어 봅니다.

[Flush] : -------------------------------------------------------------
- 저장되어 있는 어떤 데이터를 '0으로 클리어시 시킨다.
- 캐시라인 안에 있는 유효 비트를 0 으로 클리어 해준다.
- <주의점>
. Write-Back 방식을 사용할 경우, Flush 전에 Clean 을 해야함
(왜) 데이타 손실이 발생한다.


[Clear] :--------------------------------------------------------------
캐시로 부터의 더티 캐시 라인의 값을 강제로 주 메로리에 쓴 다음
캐시 라인 안에 있는 더티 비트를 0으로 초기화한다.
- 즉, 주메모리에 캐시의 데이터를 저장하는 작업


[Flush ,Clear 목적 ] :-------------------------------------------------
시스템의 메모리 설정을 변경할 할 경우(아래의 경우) Flush나 Clean을 해준다.

- 접근 권한
- 캐시, 버퍼 정책 변경
- 가상 주소 리매핑하는 동작


[부연 설명] -----------------------------------------------------------
- 유효비트 :
. 캐시라인이 활성화 되어 있음을 표시 ,
. 주메모리에서 처음 일어온 데이터를 포함 하고 있음
. 현재 프로세서 코어가 사용 가능하다는 의미

- 더티 비트 :
. 캐시 라인이 주메모리 안에 저장되 값과 다른 데이터를 포함하나
결정한다.
. '1' 이면 주메모리 와 캐시 메모리 내용이 다름


< 추가 정리 >
제가 disable 과 invalidate 를 헷갈릴 수 밖에 없는 이유가 있었군요.
Document 에서 혼용에서 사용한다고 합니다.

원문 : http://cafe.daum.net/lksas/7F0S/75

  • [노서영] ARM Developer's Guide에 나온 설명을 기반으로 말씀드리면, Cache에 쓰이는 용어가 flush/ invalidate/ clean이라고 보면되고, Write Buffer에 사용하는 용어가 Drain이라고 일단 구분하면 되겠습니다. Cache에서 Flush란 Cache Line의 Dirty Bit를 0으로 reset 시키는 것입니다.  메모리에 반영은 없습니다. 반면 Clean은 Dirty Bit가 1로 Set된 것을 모두 메모리에 반영시키는 것입니다. 반영시킨다는 것은 Write Buffer가 존재하면 WB에 쓰기가 수행될 것입니다.  그럼 Cache Line에서 Clean을 통해 메모리에 반영하기 위해 WB에 썼다면 WB의 내용을 모두 메모리에 반영해야 할 것입니다. 이를 Drain이라고 정리하면 될 것 같습니다. (여기서 주의할 사항은 ARM Cache에 쓰이는 Flush라는 용어가 우리가 흔히 사용하는 Flush와는 다른 것이고 오히려 Clean과 의미가 유사합니다.)
  • [노서영] 한가지 주의 깊게 보아야 할 용어가 Invalidate입니다. 커널 소스와 책을 통해서 느낀 점은 Invalidate가 두가지 의미로 사용된 다는 점입니다. 첫번째는 Cache Flush와 같은 의미로 사용될 때가 있습니다. 즉 Dirty Bit를 무효화 (Invalidate) 시킨다는 의미로 사용될 때가 있고, Cache Line에서 Valid Bit를 무효화 (Invalidate) 시킨다는 의미로 사용될 때가 있습니다. 후자의 경우는 Cache Line 전체를 활성화 비활성화 시킨다는 점에서 Flush와는 완전 다른 개념입니다. 따라서, 이 부분들을 잘 고려하고 문맥을 파악해서 Invalidate이 어떤 의미로 사용되었는지 파악하면 될것 같습니다. 책의 설명을 빌리자면 "메모리를 설정할 때 변경된 것을 지원할 경우, 캐시의 모든 영역이나 일부 영역을 플러시할 필요가 생길 수 있다. "Invalidate"란 용어가 "flush"라는 용어 대신 사용된다."