Arm 아키텍처는 캐시를 제어하는 명령어를 제공하는데, 명령어의 동작 원리를 제대로 파악하려면 Arm 아키텍처에서 정의된 캐시의 동작과 관련된 용어를 알아야 합니다. 먼저 캐시와 관련된 용어를 소개하고 캐시를 제어하는 명령어를 소개합니다.


실전 개발에서 캐시의 동작을 설명할 때 '캐시 플러시(Cache Flush)'란 용어를 많이 씁니다. 일반적으로 캐시의 데이터를 메인 메모리에 내린다는 의미로 사용됩니다. 리눅스 커널이나 RTOS에서 Arm 프로세서의 캐시를 제어하는 함수나 레이블의 이름에 flush가 포함된 경우가 많습니다. 일반적으로 캐시 플러시는 캐시 라인에 있는 데이터를 메인 메모리에 복사해 캐시와 메인 메모리에 있는 데이터의 싱크를 맞추는 동작을 뜻합니다. 

그런데 Arm 아키텍처 문서를 보면 Flush라는 용어 대신 다음과 같은 용어를 사용해 캐시의 동작을 설명합니다.  

 * 캐시 클린
 * 캐시 Invalidate
 * 캐시 Clean & Invalidate

위에서 명시된 용어에 대해 더 자세히 알아봅시다.  

캐시 클린

캐시 클린은 현재 레벨의 캐시 라인을 다음 레벨의 캐시나 메모리에 기록하는 동작입니다. 예를 들어 데이터 캐시를 클린한다고 하면 캐시 라인 중에 Dirty(더티)로 명시된 캐시 라인을 다음 레벨의 캐시나 메모리에 써주는 동작입니다. 예를 들어 L1 캐시를 클린하면 L1 캐시에 더티로 마킹된 캐시 라인을 L2 캐시에 써줍니다.

캐시 Invalidate

Invalidate는 캐시 라인의 데이터를 비우는 동작입니다. 처음 부팅할 때 캐시 라인의 상태로 돌아간다고 볼 수 있습니다. 그렇다면 캐시 라인의 데이터를 어떻게 비울까요? 캐시 라인의 Valid 비트를 클리어하면서 Invalidate를 수행합니다. 

캐시를 Invalidate하는 동작은 언제 수행할까요? 한 가지 예시를 들어 보겠습니다. 트러스트존 아키텍처에서는 논시큐어 상태에서 시큐어 상태로 자주 바뀌는데, 시큐어 상태에서 실행됐던 캐시 라인의 데이터는 Invalidate한 다음에 논시큐어 상태로 이동합니다. 시큐어 상태에서 실행된 데이터가 캐시 라인에 남아 있으면 보안 상 취약점으로 남게 됩니다.

캐시 Clean & Invalidate

캐시 Invalidate를 수행하는데 더티(변경) 상태로 마킹돼 있는 캐시 라인이 있으면 데이터의 불일치가 발생합니다. 그래서 Invalidate를 할 때 더티(변경) 상태로 마킹돼 있는 캐시 라인이 있으면 해당 캐시를 클린한 다음에 Invalidate를 수행합니다. 이 동작을 'Clean & Invalidate'으로 명시합니다.

 

< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>

 
 

+ Recent posts