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
,则系统会将 MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF}
开启状态设置为 (1, 0, 0)
,并将其关闭状态设置为 (0, 0, 1)
,同时保留其他标志。
您应配置您的产品来构建 mtectrl
二进制文件,以支持 userspace。然后,设置 ro.arm64.memtag.bootctl_supported
系统属性,向系统表明您的引导加载程序支持 memtag 消息。
界面
设置ro.arm64.memtag.bootctl_supported
属性后,您可以使用“开发者选项”菜单中的按钮,在启用 MTE 的情况下重新启动一次。其目标受众是希望使用 MTE 测试其应用的应用开发者。
系统属性
对于高级用途,系统属性 arm64.memtag.bootctl
可以接受以下值(采用逗号分隔列表形式):
-
memtag::持续启用 user-space MTE(设置
MISC_MEMTAG_MODE_MEMTAG
) -
memtag-once::启用一次 user-space MTE(设置
MISC_MEMTAG_MODE_MEMTAG_ONCE
) -
memtag-kernel:启用 kernel-space MTE(设置
MISC_MEMTAG_MODE_MEMTAG_KERNEL
) -
memtag-kernel-once::启用 kernel-space MTE 一次 (
MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE
) -
memtag-off::停用 MTE(设置
MISC_MEMTAG_MODE_MEMTAG_OFF
)
必须重新启动系统,才能使新设置生效(由引导加载程序应用的设置)。