Android 13에서는 요청된 MTE 모드를 부트로더에 전달할 수 있도록 사용자 공간용 ABI를 도입했습니다. 이를 사용하여 하드웨어를 지원하지만 기본적으로 MTE가 사용 설정된 상태로 제공되지 않는 기기에서 MTE를 사용 설정하거나 기본적으로 MTE가 사용 설정된 상태로 제공되는 기기에서 MTE를 사용 중지할 수 있습니다.
부트로더 지원
이 ABI를 지원하려면 부트로더가 misc 파티션에서 misc_memtag_message (
bootloader_message.h에 정의됨)를 읽어야 합니다.
유효한 misc_memtag_message가 있으면(MISC_MEMTAG_MAGIC_HEADER가 일치하고 버전 번호가 지원됨) 부트로더가 다음과 같이 계산합니다.
memtag = (default_memtag && !(misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_OFF)) || misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG || misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_ONCE memtag_kernel = misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL || misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE
default_memtag는 SKU의 기본 memtag 사용 또는 사용 중지 설정입니다. memtag가 true인 경우 부트로더는 MTE 태그 예약을 설정하고 하위 예외 수준에서 태그 확인을 사용 설정하며 태그 예약 영역을 기기 트리 (DT)를 사용하여 커널에 전달합니다. memtag이 false인 경우 부트로더는 커널 명령줄에 arm64.nomte를 추가합니다.
memtag_kernel이 true인 경우 부트로더는 커널 명령줄에 kasan=on를 추가합니다. 그렇지 않으면 kasan=off를 추가합니다.
부트로더는 부팅할 때마다 MISC_MEMTAG_MODE_MEMTAG_ONCE 및 MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE를 삭제해야 합니다.
부트로더가 fastboot oem mte를 지원하면 on 인수는 MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF} 플래그를 (1, 0, 0)로 설정해야 하고 off 인수는 다른 플래그를 보존하면서 (0, 0, 1)로 설정해야 합니다.
사용자 공간 지원을 위한 mtectrl 바이너리를 빌드하도록 제품을 구성합니다.
그런 다음 부트로더가 memtag 메시지를 지원한다고 시스템에 나타내도록 ro.arm64.memtag.bootctl_supported 시스템 속성을 설정합니다.
사용자 인터페이스
ro.arm64.memtag.bootctl_supported 속성이 설정되면 개발자 옵션 메뉴의 MTE로 재부팅 옵션을 사용하여 MTE가 사용 설정된 상태에서 한 번 재부팅할 수 있습니다. 타겟층은 MTE로 앱을 테스트하려는 앱 개발자입니다.

그림 1. MTE 개발자 옵션
시스템 속성
고급 사용을 위해 시스템 속성 arm64.memtag.bootctl은 다음 값의 쉼표로 구분된 목록을 사용할 수 있습니다.
-
memtag는 사용자 공간 MTE를 지속적으로 사용 설정합니다 (MISC_MEMTAG_MODE_MEMTAG설정). -
memtag-once는 사용자 공간 MTE를 한 번 사용 설정합니다 (MISC_MEMTAG_MODE_MEMTAG_ONCE설정). -
memtag-kernel는 커널 공간 MTE를 사용 설정합니다 (MISC_MEMTAG_MODE_MEMTAG_KERNEL설정). -
memtag-kernel-once는 커널 공간 MTE를 한 번 사용 설정합니다(MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE설정). -
memtag-off는 MTE를 사용 중지합니다 (MISC_MEMTAG_MODE_MEMTAG_OFF설정).
이 설정은 부트로더에 의해 적용되므로 변경 후 시스템을 재부팅합니다.