我想在运行Linux的ARMv8-A平台上禁用低级缓存,以测量经过优化的代码的性能,独立于缓存访问。对于英特尔系统,我找到了以下资源 ( Is there a way to disable CPU cache (L1/L2) on a Linux system? ),但由于指令集不同,无法直接应用。目前,我有一个内核模块,它改变相应的系统寄存器来禁用指令和数据缓存。
然而,当加载时(当我在系统寄存器中设置相应的位)会导致完整系统冻结。 我猜我仍然需要某种缓存清除,但我在ARM手册中没有找到任何有用的信息。
请问有什么帮助提示可以让我成功禁用ARM上的缓存或者我错过了什么?谢谢。
#include <linux/module.h>
int init_module(void)
{
int64_t value;
asm volatile("\
MRS %0, SCTLR_EL1 // Read SCTLR_EL1 into Xt\n\
BIC %0, %0, (1<<2) // clear bit 2, SCTLR_EL1.C\n\
BIC %0, %0, (1<<12) // clear bit 12, SCTLR_EL1.I\n\
MSR SCTLR_EL1, %0 // Write Xt to SCTLR_EL1\n\
" : "+r" (value));
return 0;
}
void cleanup_module(void)
{
int64_t value;
asm volatile("\
MRS %0, SCTLR_EL1 // Read SCTLR_EL1 into Xt\n\
ORR %0, %0, (1<<2) // set bit 2, SCTLR_EL1.C\n\
ORR %0, %0, (1<<12) // set bit 12, SCTLR_EL1.I\n\
MSR SCTLR_EL1, %0 // Write Xt to SCTLR_EL1\n\
": "+r" (value));
}
MODULE_LICENSE("GPL");
然而,当加载时(当我在系统寄存器中设置相应的位)会导致完整系统冻结。 我猜我仍然需要某种缓存清除,但我在ARM手册中没有找到任何有用的信息。
请问有什么帮助提示可以让我成功禁用ARM上的缓存或者我错过了什么?谢谢。