2011년 7월 16일 토요일

linux kernel의 cache clean과 cache flush

ARM System Developer's Guide에 보면 


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 line의 유효비트를 0으로 셋팅

Clear
- cache의 dirty cache line을 메모리로 쓴 후 dirty bit를 0으로 셋팅 

댓글 없음:

댓글 쓰기