본문 바로가기
카테고리 없음

ARMv8에서 Virtual address를 통해 cache flush 시키기1

by HaveaNiceDay! 2020. 3. 18.

[환경]

ARM cortex-A53 quad core (64bit), r0p4[2]

Linux 4.9.0 - armv8

목표: VA나 PFN을 통해서 dcache에 해당 데이터를 flush(clean and invalidate)

기존에 내가 사용하던 cache flush 함수와 kernel(arch/arm64/include/asm/cacheflush.h)에서 볼 수 있는 함수들 중에 쓸만한 게 없다.

 

[현 상황]

나는 user space에서 사용되던 데이터를 D-cache에서 flush하고 싶은데, kernel 안의 함수를 보면, __flush_dcache_area(내가 기존에 작동하는 줄 알고 쓰고 있던것)은 kaddr용이였으며, user data를 flush할 수 없는 것으로 보인다.

1. arch/arm64/include/asm/cacheflush.h: flush_cache_mm

 - 설명은 user space cache entry를 다 clean and invalidate한다고 되어 있지만, 함수가 비어있다.

 - 인수로 받는 mm은 mm_struct라고, process의 task_sturct가 갖는 memory mapping 정보인듯하다.

2. arch/arm64/mm/flush.c

 - flush_cache_range 함수는 특정 가상주소 영역의 데이터를 flush해주는 함수인데, arm64용 리눅스에서는, icache flush만 있다

arch/arm64/mm/flush.c
arch/arm64/include/asm/cacheflush.h

소스에는 flush_cache_mm이나 flush_cache_range가 user영역을 flush해준다고 되어있는데 어찌된일인지 함수가 비어있다.

여기서 사용되는 dsb(ish)는 data syncronization barrier라는 것으로 해당 배리어가 생성되면 memory operation이 다 끝날때까지 기다린다 - flush 함수를 새로만들게 되면 꼭 넣어야될 듯 함[1]참조

"ic ialluis"는 Instruction cache invalidate all to PoU, inner shareable이라는 instruction이다 i-cache를 inner shareable상태로 모두 flush하는 함수 인듯

[정보]

일단 ARM에서 제공하는 문서를 보면(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488d/CIHGGBGB.html)

assembly를 통해서 구현할 수 있을 것 같기는 하다 - 먼저 위에서 만하는 VA는 kaddr인 듯 하다. 그럼 user va는 어떻게 하지, data cache miantanence 관련 함수들은 유저 영역인 EL0에서는 실행하지 못하는 듯. 그럼 kernel 모드에서만 실행 할 수 있다는 얘기인데, kernel 모드로 전환되면 user VA가 kaddr로 바뀌기(context switch) 때문에 불가능?

일단은 해보는 걸로

 1. 커널 영역에서 DC CIVAC가 user VA가 아닌 kernel VA로 되는지 해본다.

 2. 유저 영역에서 DC CIVAC가 되는지 본다.

 3. 그럼 aarch32에서는 어떻게 한거지??

 

 

 

 

 

 

 

 

 

관련 질문 글

 - https://static.docs.arm.com/ddi0487/ca/DDI0487C_a_armv8_arm.pdf [arm v8 스펙문서]

- https://stackoverflow.com/questions/53056423/how-to-flush-cache-line-in-aarch64

https://stackoverflow.com/questions/48452801/can-arm64-cache-be-flushed-from-el0/48453252#48453252

  [답변은 보면 유저 영역인 EL0에서는 못하지만 나는 Kenel system call을 고쳤기 때문에 EL1로 가능하지 않을까]

 - https://patchwork.kernel.org/patch/6241251/

  [ kernel 패치하면서 flush_dcache_all을 삭제 하는 과정, 중간 assembly 코드가 있다]

 - https://android.googlesource.com/kernel/msm.git/+/android-msm-anthias-3.10-lollipop-wear-release/arch/arm64/mm/cache.S

  [ 안드로이드 코드인듯, 안에 flush_cache_all이 구현되어 있음)

관련 kernel source

 - arch/arm64/include/asm/assembler.h

 - arch/arm64/mm/flush.c

 - arch/arm64/include/asm/cacheflush.h

 - arch/arm64/mm/cache.S

 

참조

[1] http://jake.dothome.co.kr/barriers/

[2] https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf

댓글