今天我们从 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)