小编Djz*_*zin的帖子

如何在aarch64程序集中使用硬件性能计数器?

我正在尝试为ARM体系结构生成一些生成的程序集.在这种特定情况下,目标是aarch64-unknown-linux-gnu.我真的想要倒数到个人周期,花几个小时来获得最短的时间并消除差异.

我没有直接访问ARM硬件,所以我试图在QEMU下运行我的代码.

对于x86/x86_64,我使用rdtscrdtscp指令返回循环计数.

对于aarch64,我以为我可以使用

let clocks: u64;
asm!("mrs $0, pmccntr_el0" : "=r" (clocks) ::: "volatile");
Run Code Online (Sandbox Code Playgroud)

但是当我跑步的时候

qemu-aarch64 -L /usr/aarch64-linux-gnu myprogram
Run Code Online (Sandbox Code Playgroud)

我正进入(状态

qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Run Code Online (Sandbox Code Playgroud)

我想可能pmcr_el0需要在寄存器中设置一些位,但是甚至可以从中读取

let pmcr: u32;
asm!("mrs $0, pmcr_el0" : "=r" (pmcr) ::: "volatile");
Run Code Online (Sandbox Code Playgroud)

给出了同样的Illegal instruction错误.

这让我感到震惊,好像这些都是需要为我启用的特权指令 - 但我找不到如何使用QEMU执行此操作的文档.

那么有没有办法访问QEMU中的性能硬件?有没有办法以其他方式计算周期?我真的希望它与x86代码尽可能匹配.

assembly qemu arm64

4
推荐指数
1
解决办法
1181
查看次数

标签 统计

arm64 ×1

assembly ×1

qemu ×1