예전에 후지부지 넘어갔던거 같은데...
2기 분들의 관련글이 있어서 링크를 시킵니다.
http://www.iamroot.org/bbs/view.php?id=kernel_analysis&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=14
음... 저만 거꾸로 알고 있었던 건지...
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에 남아있으므로 메모리에 쓰여지게
되는 결과가 나타나게 될 것 같네요...
혹 지금도 제가 거꾸로 알고 있는거면 댓글좀... ( ㅡ.ㅡ;;;; )
2기 분들의 관련글이 있어서 링크를 시킵니다.
http://www.iamroot.org/bbs/view.php?id=kernel_analysis&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=14
음... 저만 거꾸로 알고 있었던 건지...
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 와 Clean 에 대해
[ARM System Developer's Guide] p477 에 자세히 설명 나와 있네요.
참고 하세요.
약간 귀찮으신 분(?)을 위해 간단히 적어 봅니다.
[Flush] : -------------------------------------------------------------
- 저장되어 있는 어떤 데이터를 '0으로 클리어시 시킨다.
- 캐시라인 안에 있는 유효 비트를 0 으로 클리어 해준다.
- <주의점>
. Write-Back 방식을 사용할 경우, Flush 전에 Clean 을 해야함
(왜) 데이타 손실이 발생한다.
[Clear] :--------------------------------------------------------------
캐시로 부터의 더티 캐시 라인의 값을 강제로 주 메로리에 쓴 다음
캐시 라인 안에 있는 더티 비트를 0으로 초기화한다.
- 즉, 주메모리에 캐시의 데이터를 저장하는 작업
[Flush ,Clear 목적 ] :-------------------------------------------------
시스템의 메모리 설정을 변경할 할 경우(아래의 경우) Flush나 Clean을 해준다.
- 접근 권한
- 캐시, 버퍼 정책 변경
- 가상 주소 리매핑하는 동작
[부연 설명] -----------------------------------------------------------
- 유효비트 :
. 캐시라인이 활성화 되어 있음을 표시 ,
. 주메모리에서 처음 일어온 데이터를 포함 하고 있음
. 현재 프로세서 코어가 사용 가능하다는 의미
- 더티 비트 :
. 캐시 라인이 주메모리 안에 저장되 값과 다른 데이터를 포함하나
결정한다.
. '1' 이면 주메모리 와 캐시 메모리 내용이 다름
[결론] -------------------------------------------------------------
2008년 1월12일에 의문점은 아래와 같이 간단히 결론 내면 되겠네요.
- FLUSH : 그냥 지움
- CLEAN : 주메모리에 옮기고 난 후 , 지움