Android 13 引入了一个 ABI,供用户空间与启动加载程序通信请求的 MTE 模式。这可以用于在具有硬件支持但默认情况下未启用 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
,则 on 会将 MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF}
设置为 (1, 0, 0)
,off 设置为 (0, 0, 1)
,同时保留其他标志。
您应该配置您的产品以构建 mtectrl
二进制文件以获得用户空间支持。然后,设置 ro.arm64.memtag.bootctl_supported
系统属性,以向系统表明您的启动加载程序支持 memtag 消息。
用户界面
当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
)
系统必须重启才能使新设置生效(因为它是由启动加载程序应用的)。