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 區域的資料是必要的。
speculatively reading data
(猜測性的讀取):例如 prefetch這份文件主要是在描述,在 kernel 中,TLB 和 cache flushing 的相關 API 以及使用這些 API 的時機,文件分為四個部分:
翻譯完成了!雖然絕大部分都還算是霧裡看花,朦朦朧朧的,不過明天開始會就這幾天所積累的疑問,試圖給出一些可能的解答!
感謝各位,我們明天見!