# Day 13 Cache and TLB Flushing Under Linux (Q&A - I)

今天我们从 TLB 出发,来看看可以复习多少计算机组织架构的知识!

从 TLB 是什麽出发

  • TLB(Translation Lookaside Buffer) 是一个用来储存分页表(page table) 的快取(cache),用途是如同大多数快取,想要增加存取的效率,而这边增加的是虚拟记忆体(vitual memory) 转换成实体记忆体(physical memory)的效率。
    • 分页表是用来储存虚拟记忆体和实体记忆体之间的转换(映射)关系
    • 虚拟记忆体是将机器可定址的空间映射到实体记忆体上,例如:32 位元的机器 (可定址空间为 2^32 byte --> 4GB),所以不管实体记忆体多大,在这个机器上运作的程序都会认为自己有 4GB 的记忆体可以使用,而实际上储存的东西还是在实体记忆体上,那麽要怎麽从虚拟记忆体知道相对应的实体记忆体位置呢?靠的就是分页表!
      • 使用虚拟记忆体的好处
        • 程序的链结(linking)、载入(loading) 更加容易实作
        • 可以很容易的做到程序间的隔离(安全性)
        • 可以轻松的做到共享程序码(减少记忆体浪费) ...等等
    • 但是分页表是存在 memory 中的,每次 memory access 都要到 memory 中查表做转换之後,再到转换後的位置做存取实在是太耗时了,所以 TLB 就诞生了!

记忆体转换的过程

  • 那麽今天我们拿到一个虚拟记忆体位址(VA,Virtual Address),这个虚拟记忆体位址会经过怎麽样的旅程呢?
    • 首先,CPU 执行一道指令,指令里面包含 VA,那麽这个 VA 就会被传到 TLB 上做查找,查找该 VA 对应的 PA (Physical Address)
    • 若有找到 (TLB hit),那麽就找到该 VA 对应到的 PA 了
    • 但若是没找到 (TLB miss),那麽依据实作的不同,会有不同的对应操作
      • 若是硬体来做处理的话,会由硬体来遍历分页表(page table walk),看是否有有效的(valid)的分页含有对应的 PA
      • 若是软件来做处理的话,会由作业系统来遍历分页表,看是否有有效的分页含有对应的 PA
        • 若没有有效的分页,那麽就会产生分页错误 (page fault),由 OS 接管,来做相对应的处理 (page fault handler)
        • 若有的话,会将该分页载入 TLB 中,并重新做一次 TLB 查找,此次就会找到相对应的 PA

比对 TLB entry 的过程

要如何确定我们在 TLB entry 中有找到我们要的对应的 PA 呢?

  • TLB 是一种快取,如同快取,TLB 也有分不同阶层的 TLB,有 iTLB、dTLB、L1 TLB ... 等,而也如同快取的比对方式,TLB entry 会含有 VA 作为索引的部分以及实体记忆体的对应。
  • 但虚拟定址空间也分为很多个,不同的 process、host OS、guest OS、trust zone (ARM) 等等都是使用不同的虚拟定址空间,这些不同的定址空间是会有相同的 VA 索引但对应到不同的 PA ;
    • ARM 提出了 non-Global bit 和 ASID (Address Space IDentifier) 来做为判断依据
    • RISC-V 也有 ASID,在 satp 中,看起来也是 有机会/想达到 类似的效果。(但还没有好好地看过这部分的 spec)

TLB 的位置

TLB 是一个硬体 buffer,TLB 可能位於 CPU 和 CPU cache 之间、CPU cache 和 memory 之间,又或是位於不同 level 的 cache 之间,而不同的实作会影响到 cache 的定址方式是 VIVT、VIPT 还是 PIPT,至於这些 cache 的定址方式,我们就留到明天再来记录吧!

参考资料

可能可以参考的程序码

以下都有 RISC-V 上面的 TLB 相关实作,也许有相关操作的程序码可以参考(笔者仅查到这些相关资料,尚未检视过XD)


<<:  【Day 07】Sorting:Insertion Sort 插入排序法 ( 用 JavaScript 学演算法 )

>>:  轻松易懂的目标设定框架-SMART

Day 25-Unit Test 应用於 Async Code-1 (情境及应用-5)

Unit Test 应用於 Async Code-1 - 前言 今天的文章内容是参考於 Testin...

Day 30: Greedy Method

这是什麽 贪婪法,精神在於有限的条件下,每一步都采取对於当下最有利的选择(短视近利),使状态更接近答...

[C 语言笔记--Day19] Condition Code 帮忙做出 C 语言的 if 语法

大纲 C 语言中的 if x86-64 中的 condition code MSP430 的 sta...

What is Vuex?

今天要介绍的是Vuex 先来说说我们在什麽时候会比较需要用使用到Vuex呢?如果在做比较大型的专案时...

[Day 17] - 初探永丰银行线上收款API - 丰收款 - Sign值计算(2)

来实作Sign值的计算 我的想法是把要发送到api的request写成一个Object,像这样 im...