【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR_EL0 | CLIDR | CCSIDR | CSSELR 使用詳解 1】


請閱讀【ARM Cache 及 MMU/MPU 系列文章專欄導讀】
及【嵌入式開發學習必備專欄】


文章目錄

  • Cache 常用寄存器
    • Cache CSSELR 寄存器
      • Cache CSSELR 使用場景
      • Cache CSSELR 操作示例
    • Cache CLIDR 寄存器
      • LoUU 介紹
        • LoUU 使用
      • LoUIS 介紹
      • CLIDR 使用
    • Cache CCSIDR 寄存器
    • Cache CTR_EL0

在這里插入圖片描述

Cache 常用寄存器

ARM Cache 常用到寄存器有以下幾個:

  • CSSELR, Cache Size Selection Register
  • CLIDR, Cache Level ID Register
  • CTR, Cache Type Register
  • CCSIDR, Current Cache Size ID Register

Cache CSSELR 寄存器

在這里插入圖片描述
CSSELR(Cache Size Selection Register)是ARM架構中用于選擇當前緩存大小ID寄存器(CCSIDR)的寄存器。通過指定所需的緩存級別和緩存類型(指令緩存或數據緩存),可以讓處理器知道當前操作的是哪一級和類型的緩存。如果實現了FEAT_CCIDX特性,CSSELR還可以用來選擇當前的CCSIDR2寄存器。

寄存器映射:

  • 對于AArch32狀態,CSSELR寄存器的位[31:0]直接映射到AArch64狀態的CSSELR_EL1寄存器的位[31:0]。

此寄存器僅在EL1能夠使用AArch32狀態時存在。如果不支持AArch32,直接訪問CSSELR將是未定義的。

字段解釋:

  • Level (位[3:1]): 所需緩存的緩存級別。如果CSSELR中的{level, ind}被設置為一個未實現的緩存級別,那么讀取CSSELR時,這個字段的值是未知的。
    • 0b000 Level 1 cache.
    • 0b001 Level 2 cache.
    • 0b010 Level 3 cache.
    • 0b011 Level 4 cache.
    • 0b100 Level 5 cache.
    • 0b101 Level 6 cache.
    • 0b110 Level 7 cache.

  • IND (位[0]): 指令非數據位。它指示選擇的是指令緩存還是數據(或統一)緩存。允許的值有:
    • 0b0:數據緩存或統一緩存。
    • 0b1:指令緩存。

Cache CSSELR 使用場景

通過編程CSSELR寄存器,軟件可以查詢CCSIDR(或CCSIDR2,如果使用feat_ccidx)以獲取特定級別和類型的緩存的詳細配置信息,包括緩存的大小、行大小、關聯性等。這對于理解和優化系統性能至關重要,因為不同級別和類型的緩存可能具有不同的特性和性能影響。

例如,在性能調優或者系統初始化時,了解具體的緩存參數可以幫助開發者更好地設計數據結構和算法,以減少緩存未命中(misses)和提高數據訪問效率。

Cache CSSELR 操作示例

例如要操作 L1 Dcache,可以這樣編程CSSELR寄存器:

MOV X0, #0  			  // 選擇L1數據緩存,Level = 0b001, IND = 0b0
MSR CSSELR_EL1, X0  	  // 寫入CSSELR_EL1寄存器
ISB              		  // 確保更新立即生效

接下來,就可以通過讀取CCSIDR_EL1寄存器來獲取L1數據緩存的配置信息了。這種靈活的選擇和查詢機制為軟件提供了強大的工具,以便根據系統的實際緩存配置進行優化和調試

Cache CLIDR 寄存器

CLIDR(Cache Level ID Register)是ARM架構中用以識別每個級別上實現的緩存類型的寄存器,以及通過set/way方式操作緩存可以管理的緩存級別,最多可達七個級別。此外,CLIDR還標識了cache level結構的一致性級別(Level of Coherence, LOC)和 Level of Unification, LOU。
在這里插入圖片描述

寄存器映射

  • 對于AArch32狀態,CLIDR寄存器的位[31:0]直接映射到AArch64狀態的CLIDR_EL1寄存器的位[31:0]。

該寄存器僅在EL1能夠使用AArch32狀態時存在。否則,直接訪問CLIDR將是未定義的。

字段詳解:

  • ICB, 位[31:30]:內部緩存邊界(Inner Cache Boundary)。這個字段指示了內部可緩存內存區域的邊界。

    • 0b00 Not disclosed by this mechanism.
    • 0b01 L1 cache is the highest Inner Cacheable level.
    • 0b10 L2 cache is the highest Inner Cacheable level.
    • 0b11 L3 cache is the highest Inner Cacheable level.
  • LOUU, bits[29:27]:緩存層次結構的單處理器統一級別(Level of Unification Uni-processor), 具體見下節內容。

  • LOC, bits[26:24]:緩存層次結構的一致性級別(Level of Coherence)。

  • LOUIS, bits[23:21]:緩存層次結構內部共享的統一級別(Level of Unification Inner Shareable)。當實現feat_s2fwb特性時,架構同樣要求這個字段為0。

  • CType, bits[3(n-1)+2:3(n-1)], 對于 n = 7 到 1:緩存類型字段, 描述各個緩存等級的的類型。比如Ctype1字段,描述的是Level1緩存的類型。可以有以下值:

  • 0b000 No cache,表示無緩存

  • 0b001 Instruction cache only.表示只有指令緩存

  • 0b010 Data cache only.表示只有數據緩存

  • 0b011 Separate instruction and data caches.單獨的指令緩存和數據緩存

  • 0b100 Unified cache.統一的緩存

  • 其他 保留字段

LoUU 介紹

LoUU(Level of Unification, Uniprocessor)是ARMv9架構中的術語,指在針對處理器元素(PE)執行PoU clean 或者 invalidate 時,必須clean或invalidate的最后一級緩存。與LOC(Level of Coherence,一致性級別)類似,LoUU的值也代表了一個緩存級別。

  • LoUU字段值為0x0時,意味著在執行到 PoU clean 或 invalidate 時,不需要clean 或者 invalidate任何緩存級別。這種情況下,可以認為所有的緩存操作都是在一個更緊密的層次結構內完成,不需要對外部cache level結構進行任何操作。
  • 如果LoUU字段值是一個非零值,且對應的緩存級別沒有被實現,這表示所有已實現的緩存都位于PoU之前。這意味著,一旦數據到達了這個指定的緩存級別,就認為它已經處于一個對所有處理器核心來說,可視為統一的狀態。
LoUU 使用

LoUU的概念主要用于處理器的緩存維護操作中,確保在執行某些特定的內存操作(如上下文切換、DMA操作前后或在運行關鍵任務代碼之前)時,處理器可以正確地管理其緩存數據,保證數據的一致性和正確性。在多核處理器系統中,這一點尤為重要,因為不同核心間的數據共享和同步需要仔細控制。

假如一個系統,其LoUU值被設置為2,表示L2緩存是執行到 PoU clean 或者 invalidate操作時必須clean 或者 invalidate的最后一級緩存。這意味著,如果一個核心需要保證其修改對其他核心可見,它需要確保至少對 L2 緩存執行了clean 或者 invalidate操作。

關于PoC 和 PoU 的詳細內容見:【ARM Cache 系列文章 2 – Cache Coherence及內存順序模學習】

LoUIS 介紹

LOUIS 用于描述在內部共享的共享域(Inner Shareable Shareability Domain)執行統一點(Point of Unification)clean 或者 invalidate操作時,必須clean 或者 invalidate的最后一級緩存。

Inner Shareable Shareability Domain 是指可以在處理器的多個核心或處理單元間共享數據的特定區域。內部共享的共享域允許數據在不同的處理單元間高效共享,優化了數據同步和通信。

  • LOUIS字段值為0x0時,意味著在針對Inner Shareable Shareability Domain 執行到PoU的clean 或者 invalidate操作時,不需要對任何緩存級別進行clean 或者 invalidate。

  • 如果LOUIS字段值是非零且對應的緩存級別未被實現,這表明所有已實現的緩存都位于PoU之前。

CLIDR 使用

CLIDR_EL1寄存器為軟件提供了一種機制來發現并理解系統中實現的cache level結構,包括:

  • 緩存的類型(如數據緩存、指令緩存或統一緩存)和級別。
  • 系統的緩存一致性和統一性特性。

通過檢查CLIDR_EL1,系統軟件(如操作系統或固件)可以確定如何有效地利用和維護緩存,優化性能,特別是在設計多線程和多核心處理的高效緩存一致性策略時。

Cache CCSIDR 寄存器

如果實現了 FEAT_CCIDX 則該寄存器定義如下:
在這里插入圖片描述
否則定義如下:
在這里插入圖片描述
CCSIDR(Current Cache Size ID Register)是ARM架構中用于提供當前選定緩存結構信息的寄存器。當實現了FEAT_CCIDX 特性時,該寄存器與CCSIDR2結合使用。在AArch32系統寄存器中,CCSIDR的位[31:0]在架構上映射到AArch64系統寄存器CCSIDR_EL1的位[31:0]。只有在EL1能夠使用AArch32狀態時,該寄存器才存在。否則,直接訪問CCSIDR是未定義的。

  • bits [27:13] NUMSETS:定義了緩存中集合(Set)的數量。這個值是緩存中實際集合數減去1,因為它是從0開始計數的。
  • bits [12:3]ASSOCIATIVITY:定義了緩存的關聯度。這個值同樣是實際關聯度減去1的結果, 比如 如果Associativity = 3,則說明有4個way。
  • bits [2:0] LINESIZE:定義了緩存行的大小。這個值是以字節為單位,實際大小為 2(LINESIZE+4) 字節。例如,如果LINESIZE字段的值是4,那么緩存行大小為 2(4+4) = 256字節。

在訪問CCSIDR之前,必須先在CSSELR寄存器中寫入正確的值

Cache CTR_EL0

這里及Cortex-A520 core 為例進行介紹,寄存器組成如下:
在這里插入圖片描述
IminLine, bits [3:0]:指令緩存(Instruction Cache)中的一個cache line中,包含的字(word)的數量。其值做了一次log2的運算。若一個cache line中包含16個word(64bytes),則DminLine的值應為 0b100 = 4
L1Ip, bits [15:14]:Level1 中的指令緩存(instruction cache)的緩存策略。指示了index和tag的生成方式。可能包含的值如下,其中,VIPT和PIPT較常使用:

  • 0b00—VMID aware Physical Index, Physical tag (VPIPT)
  • 0b01—ASID-tagged Virtual Index, Virtual Tag (AIVIVT)
  • 0b10—Virtual Index, Physical Tag (VIPT)
  • 0b11—Physical Index, Physical Tag (PIPT)

DminLine, bits [19:16]:數據緩存(Data Cache)和統一緩存(Unified Cache)中的一個cache line中,包含的字(word)的數量。其值做了一次log2的運算。若一個cache line中包含16個word,則DminLine的值應為 0b100 = 4.
在這里插入圖片描述

推薦閱讀:
https://blog.csdn.net/luolaihua2018/article/details/119271704

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24708.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

移動端投屏到大屏幕的操作詳解

如果你懶得折騰電腦、電視或其他大屏設備上的影視軟件安裝及配置,可以選擇直接在手機端上將影片投屏到電腦、電視或其他大屏設備上,這里給大家分享三種手機投屏的方法。 系統自帶的投屏功能 不管是安卓、鴻蒙還是蘋果操作系統,都自帶了無線…

【RabbitMQ】exchange\channel\queue的聯系

Exchange、Channel和Queue在RabbitMQ中各自扮演不同的角色,它們之間的聯系構成了RabbitMQ消息傳遞的核心機制。以下是對它們之間聯系的詳細解釋: Exchange(交換機): 交換機是RabbitMQ中的消息路由器,它接收…

8.3 Go 包的組織結構

💝💝💝歡迎蒞臨我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:「stormsha的主頁」…

HTML靜態網頁成品作業(HTML+CSS)—— 家鄉南寧介紹網頁(2個頁面)

🎉不定期分享源碼,關注不丟失哦 文章目錄 一、作品介紹二、作品演示三、代碼目錄四、網站代碼HTML部分代碼 五、源碼獲取 一、作品介紹 🏷?本套采用HTMLCSS,未使用Javacsript代碼,共有2個頁面。 二、作品演示 三、代…

使用`dbus-monitor`命令深入了解DBus通信

使用dbus-monitor命令深入了解DBus通信 DBus是一種消息總線系統,它允許應用程序在運行時進行通信。在Linux系統中,DBus是一個重要的組成部分,特別是在桌面環境中,如GNOME或KDE。dbus-monitor是一個命令行工具,用于監視…

【Python】解決Python報錯:IndexError: list index out of range

???? 文章目錄 引言1. 錯誤詳解2. 常見的出錯場景2.1 循環中的索引錯誤2.2 錯誤的列表操作 3. 解決方案3.1 使用安全的訪問方法3.2 循環時使用正確的范圍 4. 預防措施4.1 編寫單元測試4.2 動態檢查列表長度 結語 引言 在Python中操作列表時,IndexError: list …

Web 版 | 開源數據庫設計軟件 | drawdb

文章目錄 簡介快速運行方式 1:本地運行方式 2:Docker 構建并運行方式 3:Docker 運行參考?? 目標: 安裝一個 Web 版本的 ER 圖設計軟件! ?? GitHub: https://github.com/drawdb-io/drawdb 【11.7k ?】 簡介 DrawDB:Free, simple, and intuitive database design …

算法學習筆記——二分搜索

二分搜索 在有序數組中確定num存在還是不存在&#xff1a; 當arr[m] num&#xff0c;則num存在當arr[m] > num&#xff0c;則 r m - 1&#xff0c;縮小r的范圍&#xff0c;繼續往左二分當arr[m] < num&#xff0c;則l m 1&#xff0c;縮小l的范圍&#xff0c;繼續往…

Android基礎-進程間通信

在Android系統中&#xff0c;跨進程通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;是實現不同應用程序或同一應用程序中不同進程間數據共享和交互的關鍵技術。Android提供了多種IPC機制&#xff0c;每種機制都有其特定的使用場景和優缺點。下面將詳細…

代碼隨想錄算法訓練營第36期DAY51

DAY51 121買賣股票的最佳時機 做過了。算是二刷&#xff1a;來自力扣優質題解 貪心&#xff1a; 每次記錄更新最小點和最大出售值。 class Solution {public: int maxProfit(vector<int>& prices) { int cur,resINT_MIN,curminINT_MAX; for(int…

從軍事角度理解“戰略與戰術”

戰略與戰術&#xff0c;均源于軍事術語。 戰略&#xff08;Strategy&#xff09;&#xff0c;源自希臘語詞匯“strategos&#xff08;將軍&#xff09;”和“strategia&#xff08;軍事指揮部&#xff0c;即將軍的辦公室和技能&#xff09;”。指的是指揮全局性作戰規劃的謀略…

【位運算】【前綴和】個人練習-Leetcode-1177. Can Make Palindrome from Substring

題目鏈接&#xff1a;https://leetcode.cn/problems/can-make-palindrome-from-substring/description/ 題目大意&#xff1a;給出一個字符串s&#xff0c;每次query給出l, r, k&#xff0c;要求判斷子串s[l:r1]在經過k次操作后是否能變為回文串。一次操作可以將子串內的一個字…

mysql 數據庫在liunx 上的備份和恢復

一. mysql 數據庫備份 sh 腳本 1. vim sqlback.sh #!/bin/bashUSER"root" #賬號 PASSWORD"123456" #密碼 DATABASE"test" #數據庫名 BACKUP_DIR"/home/dev/mysql" #備份存的目錄 TIMESTAMP$(date "%F") …

搭建python虛擬環境,并在VSCode中使用

創建環境 python -m venv E:\python\flask\venv激活環境 運行下圖所示的bat文件 退出環境 執行下面的語句 deactivateVSCode中配置&#xff1a; ①使用CTRLshiftp命令&#xff0c;使用CTRLshiftp命令&#xff0c;輸入&#xff1a; Python: Select Interpreter②選擇之前創建…

【計算視覺】學習計算機視覺你不得不膜拜的CVPR大神:何凱明

目錄 第一章&#xff1a;CVPR——計算機視覺的終極擂臺 第二章&#xff1a;何凱明——計算機視覺領域的耀眼星辰 第三章&#xff1a;高引用論文——計算機視覺研究的璀璨星辰 第四章&#xff1a;何凱明的CVPR論文——深度學習的探索之旅 第五章&#xff1a;結語——向何凱…

翻譯《The Old New Thing》- Why isn’t there a SendThreadMessage function?

Why isnt there a SendThreadMessage function? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081223-00/?p19743 Raymond Chen 2008年12月23日 為什么沒有 SendThreadMessage 函數&#xff1f; 簡要 文章討論了 Windows 中不存在 Sen…

WHAT - 發布訂閱

目錄 一、常見實現方案1.1 使用事件發射器&#xff08;Event Emitter&#xff09;1.2 自定義事件系統&#xff08;EventBus&#xff09;1.3 使用庫如 PubSubJS1.4 使用框架內置的狀態管理工具Vue.jsReact (使用 Context API 或 Redux) 二、先后關系2.1 緩存事件數據2.2 使用 Re…

React hooks動態配置側邊欄

React hooks根據不同需求 還有不同的角色 動態的去配置側邊欄 需求&#xff1a; 點擊某個按鈕是一套側邊欄 &#xff0c;不同角色&#xff08;比如管理員之類的權限高一點&#xff09;比普通用戶多個側邊欄 然后點擊另一個按鈕是另一套側邊欄 此時&#xff0c;就需要動態的去…

【React】classnames 優化類名控制

1. 介紹 classnames是一個簡單的JS庫&#xff0c;可以非常方便的通過條件動態的控制class類名的顯示 ClassNames是一個用于有條件處理classname字符串連接的庫 簡單來說就是動態地去操作類名&#xff0c;把符合條件的類名粘在一起 現在的問題&#xff1a;字符串的拼接方式不…

KMeans聚類分析星

1. datasample initial_centroids datasample(data, k, Replace, false); 是MATLAB中的命令&#xff0c;用于從數據集data中隨機抽取k個樣本作為初始聚類匯總新&#xff0c;并且抽取時不放回。 datasample&#xff1a;是MATLAB中的函數&#xff0c;用于從數組中隨機抽取樣本d…