声明:所有文章都是当作学习笔记使用的,如有侵权还请告知删除,谢谢!
TLB的全称是Translation Lookaside Buffer,我们知道,处理器在取指或者执行访问memory指令的时候都需要进行地址翻译,即把虚拟地址翻译成物理地址。而地址翻译是一个漫长的过程,需要遍历几个level的Translation table,从而产生严重的开销。为了提高性能,我们会在MMU中增加一个TLB的单元,把地址翻译关系保存在这个高速缓存中,从而省略了对内存中页表的访问。
当需要转换VA到PA的时候,首先在TLB中找是否有匹配的条目,如果有,那么我们称之TLB hit,这时候不需要再去访问页表来完成地址翻译。不过TLB始终是全部页表的一个子集,因此也有可能在TLB中找不到。如果没有在TLB中找到对应的item,那么称之TLB miss,那么就需要去访问memory中的page table来完成地址翻译,同时将翻译结果放入TLB,如果TLB已经满了,那么还要设计替换算法来决定让哪一个TLB entry失效,从而加载新的页表项。简单的描述就是这样了,我们可以对TLB entry中的内容进行详细描述,它主要包括:
- (1) 物理地址(更准确的说是physical page number)。这是地址翻译的结果。
- (2) 虚拟地址(更准确的说是virtual page number)。用cache的术语来描述的话应该叫做Tag,进行匹配的时候就是对比Tag。
- (3) Memory attribute(例如:memory type,cache policies,access permissions)
- (4) status bits(例如:Valid、dirty和reference bits)
- (5) 其他相关信息。例如ASID、VMID,下面的章节会进一步描述。
和TLB flush操作相关的接口API主要包括:
1、 void flush_tlb_all(void) 这个接口用来invalidate TLB cache中的所有的条目
2、 void flush_tlb_mm(struct mm_struct *mm) 这个接口用来invalidate TLB cache中所有和mm这个进程地址空间相关的条目。
3、void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr) flush_tlb_page接口函数对addr对应的TLB entry进行flush操作。
4、 void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
3、void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr) flush_tlb_page接口函数对addr对应的TLB entry进行flush操作。
4、 void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
ARM64并没有直接flush一个range的硬件操作接口,因此,在ARM64的代码中,flush一个range是通过flush一个个的page来实现的。
六、推荐阅读
《Linux内存管理:TLB flush操作》
《Linux内存管理:内存描述之内存节点node》
《Linux内存管理:内存描述之内存区域zone》
《Linux内存管理:内存描述之内存页面page》
《Linux内存管理:内存描述之高端内存》
《Linux内存管理:分页机制》
《内存管理:Linux Memory Management:MMU、段、分页、PAE、Cache、TLB》
《Linux内存管理:分页机制》
《Linux内存管理:ARM64体系结构与编程之cache(1)》
《Linux内存管理:ARM64体系结构与编程之cache(2):cache一致性》
《Linux内存管理:ARM64体系结构与编程之cache(3):cache一致性协议(MESI、MOESI)、cache伪共享》
《ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)》
《内核引导参数IOMMU与INTEL_IOMMU有何不同?》
《提升KVM异构虚拟机启动效率:透传(pass-through)、DMA映射(VFIO、PCI、IOMMU)、virtio-balloon、异步DMA映射、预处理》
《Linux内存管理:内存寻址之分段机制与分页机制》



