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

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 21 - 嵌入 AlexeyAB/darknet 的 Python

>>:  DAY6:Kaggle-San Francisco Crime Classification(上)

Flutter基础介绍与实作-Day17 Onboarding、Login、Sign Up范例实作(4)

今天就废话不多说把注册页写完吧! 注册页 一样先来构思画面,由上而下AppBar,标题,描述文字,e...

Day12 hover应用(一)

虽然与网页互动的过程会花费更多的时间,但它却是吸引人很重要的一项因素,因此在设计部落格版面的时候,有...

JavaScript Day 13. forEach()

为什麽必须知道怎麽使用阵列方法呢?举例来说,我们拿到一笔资料长这个样子: let data = [5...

Day7 风生水起,观元辰宫的木-2

关於地板 地板的部分,也关系到了墙壁以及布线难易度,往往很多公司在装潢完成之後,才发现东缺西缺,到之...

26 可以按按钮出牌才算出牌

出牌 出牌跟之前的游戏准备按钮一样 帮一个元件加上 phx-clixk 再绑上对应的动作, 唯一的差...