2011년 1월 3일 월요일

ARM에서 clean, flush, invalidate

Kernel Study중 나왔던 질문에 대해 정리한 내용입니다. 

  • 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"라는 용어 대신 사용된다."

댓글 2개:

  1. 지나가다 들렸습니다. cache flushing으로 인한 flag bit의 변화는 valid 비트가 1->0으로 변화는것 아닐런지요? 글을읽다가 좁은 지식에 궁금한것이 생겨 글 남깁니다.

    답글삭제
  2. 저도 지나가다...오래된 포스트지만 잘못된 내용이라 덧붙입니다. (ARM CPU 개발하는 현직자입니다)
    clean: cache의 dirty data를 memory에 update한다. (clean만 하면 해당 line이 dirty에서 clean이 되고 data는 cache에 그대로 있음)
    invalidate: cache line의 valid를 0으로 만든다. (해당 line을 버린다)
    flush: clean + invalidate

    flush에 대한 얘기는 신입때 ARM 엔지니어에게 직접 들었습니다.

    답글삭제