Android 13에서는 요청된 MTE 모드를 부트로더에 전달할 수 있도록 사용자 공간용 ABI를 도입했습니다. 이는 하드웨어를 지원하지만 기본적으로 MTE가 사용 설정된 상태로 제공되지 않는 기기에서 MTE를 사용 설정하거나 기본적으로 MTE가 사용 설정된 상태로 제공되는 기기에서 MTE를 사용 중지하는 데 사용할 수 있습니다.
부트로더 지원
이 ABI를 지원하려면 부트로더가 misc
파티션에서 misc_memtag_message
(bootloader_message.h에 정의됨)를 읽어야 합니다.
유효한 misc_memtag_message
가 있으면(MISC_VIRTUAL_AB_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
을 추가합니다.
부트로더는 부팅할 때마다 MISC_MEMTAG_MODE_MEMTAG_ONCE
및 MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE
를 삭제해야 합니다.
부트로더가 fastboot oem mte
를 지원하면 다른 플래그를 보존하면서 MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF}
를 (1, 0, 0)
으로 설정하여 사용하고 (0, 0, 1)
로 설정하여 사용 중지합니다.
사용자 공간 지원을 위한 mtectrl
바이너리를 빌드하도록 제품을 구성해야 합니다. 그런 다음 부트로더가 memtag 메시지를 지원한다고 시스템에 나타내도록 ro.arm64.memtag.bootctl_supported
시스템 속성을 설정합니다.
사용자 인터페이스
ro.arm64.memtag.bootctl_supported
속성이 설정되면 개발자 옵션 메뉴의 버튼을 사용하여, MTE가 사용 설정된 상태에서 사용자가 한 번 재부팅할 수 있습니다. 타겟층은 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
설정)
새로운 설정을 적용하려면 시스템을 재부팅해야 합니다(부트로더에서 적용함).