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

今天来做个文件的总结吧!
这篇文件 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 文件的阅读,就先到这里告一个段落!
    明天再见啦!

<<:  Day09 - dat GUI

>>:  Day9. 以放声思考法快速进行概念验证

[Day30] 完赛心得

感谢订阅我文章的5位邦友,希望能对你们有一点点小帮助,忏悔一下後来 Vue 先前累积的文章写完之後,...

Open API 概念

为什麽想写这个? 一样是在某次开会听到这个名词,脑中开始想说这跟api有什麽不一样,为什麽要特别加...

[Day 04] 测试驱动开发

接下来要讨论的问题是, 什麽时候开始写测试, 很多人会觉得应该在整个软件开发完之後开始写测试, 但是...

Day 7 Self-attention(一) input和output

前言 今天开始终於要来讲self-attention了,由於我对於self-attention比较不...

Day18 - 铁人付外挂前置作业(三)- 建立资料夹结构

使用 Valet 或是其他本机环境软件把 WordPress 安装好之後,切换到网站根目录,可以看到...