如何解决QEMU 托管启用 MTE 的内核不会引发故障
我正在尝试在 QEMU 环境(运行支持 MTE 的内核)上编译和测试 ARMv8.5 MTE 扩展。
我尝试在承载启用 MTE 的内核的 QEMU 上引发错误。我有一个简单的 C 代码,我运行它应该会因为 MTE 而引发错误,但它运行得很好(附加日志和信息)。我在 x86 机器上将代码交叉编译为 arm64,并带有相关的 clang MTE 相关标志。
在 5.4.0-1040-gcp #43-Ubuntu SMP Fri Mar 19 17:49:48 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
上编译
使用 Linux lab 5.11.13 #1 SMP PREEMPT Sun Apr 11 11:30:52 UTC 2021 aarch64 GNU/Linux
在 CONfig_ARM64_MTE=y
上运行可执行文件
代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
printf("Hi %ld\n",(long)getpid());
int *array = (int*) malloc (sizeof(int) * 1);
array[32] = 1;
printf("here is the value: %d",array[32]);
return 0;
}
clang-11 标志:
clang-11 -target aarch64-linux-gnu -march=armv8+memtag -fsanitize=memtag main.c -static
QEMU 版本:
lab@qemu-mte:~$ qemu-system-aarch64 --version
QEMU emulator version 5.2.92
QEMU 标志:
sudo /opt/qemu/build/qemu-system-aarch64 -machine virt,mte=on -cpu max -kernel Image -hda stretch.img -m 2G -display none -serial stdio -append "root=/dev/vda"
可执行的strace输出:
root@lab:/# strace ./test
execve("./test",["./test"],[/* 11 vars */]) = 0
brk(NULL) = 0x3ada7000
brk(0x3ada7f80) = 0x3ada7f80
uname({sysname="Linux",nodename="lab",...}) = 0
readlinkat(AT_FDCWD,"/proc/self/exe","/test",4096) = 5
brk(0x3adc8f80) = 0x3adc8f80
brk(0x3adc9000) = 0x3adc9000
mprotect(0x489000,4096,PROT_READ) = 0
getpid() = 235
fstat(1,{st_mode=S_IFCHR|0600,st_rdev=makedev(204,64),...}) = 0
ioctl(1,TCGETS,{B38400 opost isig icanon echo ...}) = 0
write(1,"Hi 235\n",7Hi 235
) = 7
write(1,"here is the value: 1",20here is the value: 1) = 20
exit_group(0) = ?
+++ exited with 0 +++
我错过了什么吗? 如果需要任何其他信息,请告诉我。 谢谢。
解决方法
该 strace 日志中似乎没有任何内容为进程启用 MTE,这似乎很可疑。尝试为 MTE 构建和运行 the kernel documentation 中给出的示例 MTE 程序。这完全是“手动”执行 MTE,即没有编译器的帮助。如果它有效,那么您可以开始查看事物的叮当一面;如果它不起作用,则需要检查 QEMU 和内核。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。