我正在尝试为ARM体系结构生成一些生成的程序集.在这种特定情况下,目标是aarch64-unknown-linux-gnu.我真的想要倒数到个人周期,花几个小时来获得最短的时间并消除差异.
我没有直接访问ARM硬件,所以我试图在QEMU下运行我的代码.
对于x86/x86_64,我使用rdtsc和rdtscp指令返回循环计数.
对于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代码尽可能匹配.