【问题标题】:QEMU hosting MTE enabled kernel does not raise faultQEMU 托管启用 MTE 的内核不会引发错误
【发布时间】:2021-07-08 07:06:22
【问题描述】:

我正在尝试在 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上编译

使用CONFIG_ARM64_MTE=yLinux lab 5.11.13 #1 SMP PREEMPT Sun Apr 11 11:30:52 UTC 2021 aarch64 GNU/Linux 上运行可执行文件

代码:

#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 +++

我错过了什么吗? 如果需要任何其他信息,请告诉我。 谢谢。

【问题讨论】:

标签: linux linux-kernel kernel qemu arm64


【解决方案1】:

该 strace 日志中似乎没有做任何事情来为该进程启用 MTE,这似乎很可疑。尝试为 MTE 构建和运行 the kernel documentation 中给出的示例 MTE 程序。这完全“手动”完成了 MTE,即无需编译器的帮助。如果它有效,那么您可以开始研究事物的铿锵一面;如果它不起作用,那么您需要检查 QEMU 和内核。

【讨论】:

  • 运行并引发 seg 错误。我的问题是 - 是不是 -fsanitize=memtag 需要调整可执行内存分配/对 MTE 的访问 - 没有编码人员的帮助?
  • 是的,它看起来确实应该开箱即用。但至少现在你知道问题在于 clang 没有按照你的预期做,所以你可以去问问一些 clang 人这是怎么回事。
猜你喜欢
  • 2020-10-26
  • 1970-01-01
  • 2019-06-20
  • 2013-06-21
  • 2018-08-18
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多