2016-12-19 45 views
0

(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上的緩存或什麼,我缺少在這裏取得成功?謝謝。

+0

你見過這個嗎? http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0438f/BABHEJFF.html – HRgiger

+0

和此:) https://devtalk.nvidia.com/default/topic/973472/how-to-write-bits-to-registers -in-order-to-disable-cache - /?offset = 5 – HRgiger

+0

我已經看到它在armv6上完成了,它是一個皇家PITA,我們猛烈地進入了ldrex/strex問題(如果完全或正確實施獨佔訪問,您可以深入芯片供應商內存控制器而不是武器,因此它是芯片專用的)。我不知道AXI/AMBA是否爲armv8改變了太多,以知道總線訪問是否需要保護,並且在禁用緩存的情況下生成了mmu。 –

回答

1

一般來說,這是行不通的,有幾個原因。

首先,清除SCTLR.C位不僅使所有數據訪問不可緩存。並阻止分配到任何緩存中。高速緩存中的任何數據仍然存在於高速緩存中,尤其是來自最近寫入的任何內容的髒行;考慮一下當你的函數返回時調用者會試圖恢復一個甚至不存在於它現在正在訪問的內存中的棧幀。其次,單處理器ARMv8系統很少;假設你正在運行SMP Linux,並且突然禁用了模塊加載器恰好安排在的任何CPU上的緩存,那麼即使忽略第一點,事情也會非常快地下降。 Linux期望所有的CPU都是相互協調的,並且如果違反了這個假設,它通常會非常迅速地被破壞。請注意,這甚至不值得冒險進入SMP交叉呼叫;足以說唯一的安全甚至試圖運行Linux的緩存禁用,以確保他們從來沒有啓用,除...

第三,不保證Linux甚至會運行緩存禁用。在當前的硬件上,內核中的所有鎖定和原子操作(更不用說用戶空間)都依賴於獨佔訪問指令。雖然CPU集羣將爲可緩存內存(通常作爲緩存機制本身的一部分)實現架構上需要的本地和全局獨佔監視器,但它依賴於系統是否實現了用於非緩存訪問的全局獨佔監視器,因爲這樣的事情必須在CPU外部(通常在互連或存儲器控制器中)。許多系統不實現這樣的全局監視器,在這種情況下,對外部存儲器的獨佔訪問可能會導致Linux崩潰或死鎖,從而導致故障,無所事事或其他各種實現定義的行爲。在這樣的系統上運行Linux緩存實際上是不可能的 - 爲了讓一個up arm64內核正常工作(SMP實際上是不可能的)的黑客攻擊量是不切實際的;用戶空間祝你好運。

碰巧,不過,最嚴重的問題是沒有這一點,那就是:

...爲了測量的優化代碼的性能,獨立的緩存訪問。

如果代碼是爲了與緩存部署禁用運行,那麼在邏輯上就不能意在Linux下運行,因此黑客攻擊了Linux的花費的努力將是一個更現實的標杆上更好地用執行環境,以便結果實際上具有代表性。另一方面,如果它意圖在啓用緩存的情況下運行(在Linux或任何其他操作系統下),那麼禁用緩存的基準測試會導致無意義的結果並浪費時間。對於例如「優化」在實踐中不存在的取指 - 帶寬瓶頸不會導致你朝着正確的方向前進。

+0

謝謝您的詳細解答,它顯示了禁用緩存的原因並未成功。所以最後一個嘗試可能是禁用內核源代碼中的緩存啓用部分,但我也看到你的觀點,爲什麼這也會很棘手。 – silvan

+0

目標本質上是要有固定的運行時間,以獲得優化的恆定時間碼。所以這就是爲什麼緩存在測試環境中有害以證明持續執行時間的原因。 – silvan

+0

如果您真的想繞過D-cache,只需簡單地修改'mmap' /'mprotect'就可以在您的進程中設置一些不可緩存的內存進行操作。禁用I緩存除了將所有的性能都拋出窗外外,再加上任何使這種情況稍微慢一點的「優化」都會使真實世界的性能變得更糟。 – Notlikethat