QEMU运行启用MTE的内核时 测试代码未触发预期MTE故障
MTE未触发故障的排查与修正方案
已确认的异常点
- 从strace输出可见,无任何开启用户空间标签检查的
prctl系统调用,说明memtag sanitizer运行时未正确生效 - 内核、编译、QEMU参数均存在默认未开启MTE的配置缺陷
逐项修正
1. 内核启动参数补全
5.11版本内核的MTE功能编译入后默认关闭,必须在启动参数中显式启用,修改QEMU的-append参数:
-append "root=/dev/vda mte=on mte.sync=on"
其中mte=on启用MTE硬件支持,mte.sync=on使用同步模式,越界访问会立即触发故障。
2. QEMU硬件参数对齐
你使用的QEMU 5.2.92版本中-cpu max可能未默认开启MTE辅助支持,修改CPU参数:
-cpu max,mte=on
和machine参数的mte=on对齐,确保硬件层面MTE实际可用。
3. 编译参数修正
当前编译参数存在多处错误,修正后的完整命令:
clang-11 -target aarch64-linux-gnu -march=armv8.5-a+memtag -fsanitize=memtag -fsanitize-memtag-mode=sync main.c -static -static-libsan -o test
参数修正点:
- 替换错误的
-march=armv8+memtag为-march=armv8.5-a+memtag,MTE属于ARMv8.5-A扩展,原参数不会生成MTE指令 - 新增
-fsanitize-memtag-mode=sync,clang 11的memtag sanitizer默认不启用标签检查与内存打标,必须显式指定模式 - 新增
-static-libsan,确保sanitizer运行时被静态链接,运行时会自动给堆分配内存打唯一标签,并通过prctl向内核注册开启标签检查
4. 测试逻辑验证
MTE标签的内存覆盖粒度为16字节,修正参数后可先测试小偏移越界(比如将array[32] = 1改为array[1] = 1),先验证基础功能是否触发故障,再测试大偏移越界场景。
内容的提问来源于stack exchange,提问作者RRR
相关产品推荐
相关产品推荐

