iT邦幫忙

2021 iThome 鐵人賽

DAY 15
2
Software Development

閱讀 Linux Kernel 文件系列 第 15

# Day 15 Cache and TLB Flushing Under Linux (summary)

  • 分享至 

  • xImage
  •  

今天來做個文件的總結吧!
這篇文件 Cache and TLB Flushing Under Linux 描述的是各式的 flushing API、以及各個 API 所使用的時機和情境,並提供各個架構實作這些 API 的語意;舉例來說:

  • flush_tlb_all: 在 riscv 底下的實作是 sfence.vma 一個由 ISA 定義的 s mode 指令,用來提供類似 memory barrier 的語意,並且在 ISA 規格中也提到 The SFENCE.VMA is used to flush any local hardware caches related to address translation (privileged spec draft 1.12)。
  • flush_cache_mm:在 riscv 中,cache 相關的操作是由 platform 自行定義的,所以這部分也會交由 platform 自己訂、自己實作,像是 csky 就把它實作為自己平台上的 dcache 相關操作。

這篇文件分為 4 個部分,分別描述了 TLBcachecache aliasing 處理IO 處理 相關的 flushing API,藉由這樣的分類分項,這幾天也重新複習了 TLB、cache 相關的計算機結構基礎知識,雖然說還沒能將整篇文件的內容理解透徹,但是藉由這樣的複習,倒也回答了一些自己的疑惑。(( 還有很多懸而未決的疑問就是了XD

  • TLB: MMU(Memory Management Unit) 中的一個硬體元件,用來 cache 分頁表中的資訊,以達到快速的 VA->PA 轉換。
    • TLB 的 entry 包含哪些項目,由 TLB 的實作方式決定。
      • non-global bit 和 ASID/PCID 是可以避免 TLB 頻繁的 flush 的一種優化。
    • TLB 若座落於 CPU 和 cache 之間,那麼 cache 的比對方式就是 VIVT。
    • TLB 若座落於 cache 和 memory 之間,那麼 cache 的比對方式就是 PIPT。
    • TLB 若和 cache 並列,那麼就是 VIPT,比對 cache 的 Index 以及轉換 tag 為 PA 的 tag 可以並行。
  • cache: 快取是用來 cache 主記憶體上的資料,主要也是用來提升資料存取的效能。
    • cache 的比對方式 (cache 相關的計算)
      • 主要就是要記得整個 address 會被分成以下這些欄位,記得各個欄位所代表的意思,以及怎麼做計算,那麼 cache 相關的計算問題,大致上就沒問題啦!
      [ tag | index | block or line offset | byte offset ]
      
      • VIVT:CPU 送出來的 VA,直接取 tag 欄位和 index 欄位拿來做比對,不需要經過 TLB 轉換。
        • 優點:快且硬體實作成本低。
        • 缺點:軟體維護成本高,因為會有 aliasing 問題,包含了
          • homonyms:不同 process 可能會有相同的 VA 對應到不同的 PA,在 cache 中沒有正確的維護,導致新 process 取到舊的 VA 資料。
          • synonyms:不同的 VA 對應到相同的 PA,修改其一造成對兩個 VA 存取,取到的值有歧異。
          • 解法:flush cache (極大的 latency)
      • PIPT:CPU 送出來的 VA 經過 TLB 轉換後,用轉換後的 PA 來做 cache 比對。
        • 優點:不會有任何 aliasing 問題,因為 PA 是唯一的。
        • 缺點:硬體實作成本高;若有 TLB miss 將會有極大的 latency 在做 page walk。
      • VIPT:CPU 送出來的 VA,其 tag 經過 TLB 轉換成 PA tag,而同時其 index 直接在 cache 中做比對。
        • 優點:是個折衷作法,包含 VIVT 和 PIPT 的部分優點。
        • 缺點:仍是有可能會有 synonyms 問題。
        • 解法:
          • page coloring:將多出來的 bit 上色,不同色的 index 要對應到不同的 Physical page,這樣可以確定,不會有兩個不同的 VA 對應到相同的 PA。 (Linux 並不支援,因為實作太複雜,且這樣的 worst case 難遇到,並且有其他解法)
          • 硬體支援:讓硬體支援 alias detection 機制。
          • cache 的設計:讓 VIPT cache 運作的像是 PIPT cache (讓 index 部分和 offset 部分的 bit 數小於等於表示 page 大小所需的 bit 數)

以上是目前複習並且有整理到的內容,尚未釐清的部分,主要是文件中描述的情境,以及一些記憶體管理子系統(mm subsystem) 所用到的資料結構和 API,例如:

  • struct mm_structstruct vm_area_struct
  • vmallocvmap
  • kernel offset mappingCOW page
    ... 等等,族繁不及備載,不過這些要探究清楚,可能又可以再寫一份鐵人賽的系列文,有點超出這次系列文所設下的 scope XDDD,這部分就容筆者偷懶一回吧!有機會、有些實驗成果,再來向大家分享,那我們這次 Cache and TLB Flushing Under Linux 文件的閱讀,就先到這裡告一個段落!
    明天再見啦!

上一篇
# Day 14 Cache and TLB Flushing Under Linux (Q&A - II)
下一篇
# Day 16 Physical Memory Model(一)
系列文
閱讀 Linux Kernel 文件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
高魁良
iT邦新手 2 級 ‧ 2021-09-25 10:48:24

我有預感這篇會紅,整理得很透徹,而且人們面試前都會 google 到這篇。感謝大大整理。

我要留言

立即登入留言