iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Software Development

閱讀 Linux Kernel 文件系列 第 12

# Day 12 Cache and TLB Flushing Under Linux (四)

  • 分享至 

  • xImage
  •  

Cache and TLB Flushing Under Linux 的最後一部份,一樣文件!

文件

最後一類 API 是用於 I/O 子系統在核心內特意設置的別名位址範圍。
這種別名是通過使用 vmap/vmalloc API 設置的。
由於核心 I/O 是通過實體分頁進行的,
I/O 子系統假定使用者映射和核心偏移映射是唯一的別名。
這對 vmap 別名來說是不正確的,
所以核心中任何對 vmap 區域進行 I/O 的嘗試,都必須手動管理快取一致性。
它必須在做 I/O 之前更新 vmap 範圍,並在 I/O 返回後使該區段無效。

  ``void flush_kernel_vmap_range(void *vaddr, int size)``

    更新 vmap 區域中指定虛擬位址範圍的核心快取。
    這是為了確保核心在 vmap 範圍內修改的任何資料對實體分頁是可見的。
    這個設計是為了使這個區域可以安全地執行 I/O。
    注意,這個 API 並 *沒有* 更新該區域的偏移映射別名。

  ``void invalidate_kernel_vmap_range(void *vaddr, int size)``
  
    使 vmap 區域內一個給定的虛擬地址範圍的快取無效,
    這可以防止處理器在實體分頁的 I/O 處理時,
    通過猜測性地讀取資料而使快取變髒。
    這只在讀取 vmap 區域的資料是必要的。

我的理解

  • flush (更新): flush 在 cache 中的操作是將 cache 中有的資料,寫到 memory 上面,更新 memory 上的資訊。
  • invalidate (使無效):invalidate 則是將 cache 中的 cache line 標上無效的標籤,致使下次對該 cache line 的存取,會直接到對應的 memory 位址上做存取。
  • 在 I/O 之前 flush,在 I/O 之後 invalidate:
    • 資料從 host 到 device (DMA),在資料搬移前,需要將 cache 中的資料 flush 到 memory 上;
    • 資料從 device 到 host,在資料搬移後,需要將 cache 中的資料 invalidate,讓 cpu 到 memory 上拿取資料
  • speculatively reading data (猜測性的讀取):例如 prefetch

整理一下

這份文件主要是在描述,在 kernel 中,TLB 和 cache flushing 的相關 API 以及使用這些 API 的時機,文件分為四個部分:

  1. TLB 相關的 flushing 介面,這些介面都以不同的 flushing 範圍作為包裝
  2. cache 相關的 flushing 介面,也是以範圍做不同的 API
  3. 處理 cache aliasing 問題的相關 API,cache aliasing 是指相同 PA 被對應到 cache 中的兩個以上不同的 cache line 而有可能造成歧異的問題
  4. 處理 IO 子系統相關的 flushing API

後記

翻譯完成了!雖然絕大部分都還算是霧裡看花,朦朦朧朧的,不過明天開始會就這幾天所積累的疑問,試圖給出一些可能的解答!

  • 什麼是 kernel offset mapping?
  • vmalloc/vmap 區域是什麼?

感謝各位,我們明天見!


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

尚未有邦友留言

立即登入留言