(L1/L2)我想禁用運行Linux的ARMv8-A平臺上的低級別的高速緩存中,爲了測量的優化代碼的性能,獨立的高速緩衝存儲器存取。禁用CPU高速緩存上ARMv8-A的Linux
對於Intel系統我發現下面的資源(Is there a way to disable CPU cache (L1/L2) on a Linux system?),但我不能直接被直接應用於由於不同的指令集。
到目前爲止,我有一個內核模塊,它改變了相應的系統寄存器禁用指令和數據緩存。
#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上的緩存或什麼,我缺少在這裏取得成功?謝謝。
你見過這個嗎? http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0438f/BABHEJFF.html – HRgiger
和此:) https://devtalk.nvidia.com/default/topic/973472/how-to-write-bits-to-registers -in-order-to-disable-cache - /?offset = 5 – HRgiger
我已經看到它在armv6上完成了,它是一個皇家PITA,我們猛烈地進入了ldrex/strex問題(如果完全或正確實施獨佔訪問,您可以深入芯片供應商內存控制器而不是武器,因此它是芯片專用的)。我不知道AXI/AMBA是否爲armv8改變了太多,以知道總線訪問是否需要保護,並且在禁用緩存的情況下生成了mmu。 –