本文主要翻譯自 Arm Cortex-M7 Processor Technical Reference Manual r1p2 其中章節 Memory System / L1 caches / Store Buffer 。
Store Buffer
Cache中的資料,在寫入memory或 AXIM 匯流排之前,先存放在store buffer中。store buffer有四個儲存單元,每個儲存單元由一個64bit資料儲存及一個32bit地址儲存組成。來自data-side的寫請求都會存放在store buffer中,但有兩個例外:寫往TCM 或 AHBP介面的資料。
注:名詞解釋 淺談嵌入式MCU CPU核心之ARM Cortex-M7核心高效能(Dual Issue ISA--雙發指令)實現要點解析
- AXIM :高效能內部匯流排互聯矩陣。ARM Cortex-M7核心配備了ARM第4代的AMBA匯流排矩陣--AXIM,給MCU/SOC提供64-bit的儲存器和外設匯流排互聯能力,透過AXIM訪問儲存器(SRAM和Flash)和外設時可以配置核心的MPU使能I-Cache和D-Cache,從而加速訪問,進一步提高系統效率。
- AHBP :高效能外設介面。ARM Cortex-M7核心還為高效能低延遲的外設連線預留了一個32-bit的AHBP介面:透過該介面擴充套件的外設,讀寫訪問時無需經過系統匯流排互聯矩陣,從而保證了高性和低延遲。
Store buffer merging
- 來自同一個cache line的寫請求,被合併到同一個store buffer單元。store buffer寫請求合併只適合於帶有普通memory屬性的寫請求。
- 如果是強記憶體序(怎麼知道是強記憶體序??),或者是device memory屬性的記憶體頁,則不會發生store buffer寫請求合併。
- 遇到強記憶體序寫或者device memory屬性記憶體,會首先將store buffer中的資料全部寫回,即清空了store buffer中的資料。
Store buffer 寫請求轉發
在指定條件下,store buffer會將寫請求轉給 Cache控制器,AXIM匯流排等(即跳過store buffer,交由cache控制器,AXIM匯流排)。
- 比如針對 Non-Cacheable標記的資料,write-through 型別的cache,等操作,交由AXIM匯流排。
比較難理解,不翻譯
Store buffer draining
有些情況下,需要先等store buffer中的資料全部寫回。有些情況下,需要等該單元的資料寫回。
需要等全部的情形:
- cache維護操作;
- 共享記憶體(Shared Memory)的獨佔操作;
- DMB, DSB指令;
- 上面提到的強記憶體序地址,或device memory標記的資料。
定義memory maps的屬性許可權等
#define ioremap(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
#define ioremap_nocache(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
#define ioremap_wc(addr, size) __ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))
#define ioremap_wt(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
ARM memory models
- 介紹了 devices memory等等。Armv8-A memory model cnblog附件
- [譯]硬體記憶體模型
- 一步一圖帶你深入理解 Linux 實體記憶體管理