cache clean과 cache flush에 대해서 자세히 설명되어 있다.
flush는 cache를 그냥 비워버리고 clean은 write buffer의 데이터를
메모리에 write한 후 cache를 지운다.
커널의 코드를 살펴보면 다음과 같다. ( 2.6.13 버젼 기준 )
static inline void flush_pmd_entry(pmd_t *pmd)
{
const unsigned int __tlb_flag = __cpu_tlb_flags;
if (tlb_flag(TLB_DCLEAN))
asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pmd"
: : "r" (pmd) : "cc");
if (tlb_flag(TLB_WB))
dsb();
}
static inline void clean_pmd_entry(pmd_t *pmd)
{
const unsigned int __tlb_flag = __cpu_tlb_flags;
if (tlb_flag(TLB_DCLEAN))
asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pmd"
: : "r" (pmd) : "cc");
}
flush 의 경우에는
if (tlb_flag(TLB_WB)) dsb();
코드가 있어서 write back 캐시정책을 사용하는 경우에는
장벽을 사용해서 write buffer까지 비워버린다.
따라서 flush의 경우에는 캐시에서 지우게 되는 라인이 메모리에 쓰여지지 않고
clean의 경우에는 지우는 라인의 데이터가 write buffer에 남아있으므로
메모리에 쓰여지게 되는 결과가 나타나게 된다.
정리하면 다음과 같다.
Flush
- cache를 0으로 클리어
- cache를 0으로 클리어
- cache line의 유효비트를 0으로 셋팅
Clear
- cache의 dirty cache line을 메모리로 쓴 후 dirty bit를 0으로 셋팅
댓글 없음:
댓글 쓰기