개요

Arm memory tagging extension(MTE)는 적은 overhead로 메모리 버그를 탐지할 수 있도록 하는 하드웨어 기술이다. 최대 16개의 segment로 메모리의 접근을 조절할 수 있기 때문에, 항상 메모리 버그를 탐지하지는 못한다. 그러나, Sequential tag가 항상 다르도록 설정할 수 있어서, 대다수의 메모리 버그를 하드웨어적으로 막을 수 있다.

Design

MTE는 lock and key매커니즘을 하드웨어 적으로 가능하게 한다. Lock은 메모리에 주어지고, Key값이 메모리의 Lock값과 일치하는지를 체크한다. Lock은 최대 4비트로 구성된 메타데이터를 16바이트 granualrity로 설정할 수 있다. Pointer (Virtual address)와 같은 경우에는, Key값을 Top Byte에 표시할수 있도록 한다. 이 기술은 Top Byte Ignore (TBI)로 메모리 Access에서 Top byte에 표시된 Key값이 메모리 접근에 무시되도록 할수 있게하는 기술에 의존한다. MTE에서는 VA의 4비트가 Key값으로 사용된다. 더 일반적으로는 MTE는 Random Lock생성을 지원하며, Seed에 의존한 Pseudo-random Lock생성을 지원한다.

Architecture

MTE작동 모드는 동기화 모드와 비동기 모드로 구분된다.

  • 동기 모드: 동기 모드에서는 잘못된 접근이 있을 경우 바로 Exception을 통해서 어떤 Load나 Store instruction에서 Fault가 났는지를 리포트한다. 동기모드는 비동기 모드에 비해서 성능상의 오버헤드가 있다.
  • 비동기 모드: 비동기 모드에서는 잘못된 접근이 있을 경우 "잘못된 접근이 있었다는 사실"만을 특정 Register에다가 표시한다. 즉 동기 모드에 비해서 낮은 Precision을 제공한다.

두 모드 전부 Fault가 났을 경우 Process를 중단시킬지, 아니면 계속할지는 OS에 따라서 결정할 수 있다.

MTE는 다음과 같은 명령어를 이용하여서 작동한다.

  • IRG: IRG는 Random한 숫자값을 생성하여 다음의 명령어에서 사용하는 Lock값을 설정한다.
  • GMI: IRG에 의해서 생성되는 Random한 Lock값에서 특정한 범위를 제외할 수 있다.
  • LDG, STG, STZG: Memory에 있는 Lock값을 가져오고, (STZG와 같은 경우는 zeroing도 수행하면서)설정한다.
  • ST2G, STZ2G: STG, STZG와 같은 작업을 수행하나, 32바이트의 영역을 설정한다.
  • STGP: Lock과 Data를 메모리에 설정한다.
  • ADDG, SUBG, SUBP: VA에 있는 Key값과 독립적으로 Pointer arithmetic 연산을 수행할 수 있도록 한다.