页表缓存TLB原理

2024-04-12 16:52
文章标签 原理 缓存 tlb 页表

本文主要是介绍页表缓存TLB原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

处理器的内存管理单元(Memory Management Uint,MMU)负责把虚拟地址转换成物理地址,为了加快虚拟地址到物理地址的转换速度,避免每次转换都需要查询内存中的页表,处理器厂商在MMU中增加了一个高速缓存TLB(Translation Lookaside Buffer),TLB直译为转换后背缓冲区,也叫页表缓存;
页表缓存用来缓存最近使用过的页表项,有些处理器使用两级页表缓存:第一级TLB分为指令TLB和数据TLB,取指令和取数据可以并行执行;第二级TLB是统一TLB(Unified TLB),即指指令和数据共用TLB;

TLB表项格式

不同处理器架构的TLB表项的格式不同;ARM64处理器的每条TLB表项不仅包含虚拟地址和物理地址,也包含属性:内存类型、缓存策略、访问权限、地址空间标识符(Address Space Identifier,ASID)和虚拟机标识符(Virtual Machine Identifier,VMID);ASID区分不同进程的页表项,VMID区分不同虚拟机的页表项;

TLB管理

flush_tlb相关函数

如果内核修改了可能缓存在TLB里面的页表项,那么内核必须负责使旧的TLB表项失效;内核定义了每种处理器架构必须实现的函数,主要是flush tlb,即冲刷tlb,使tlb失效;如下表所示:
arm64架构实现在arch/arm64/include/asm/tlbflush.h

函数说明
void flush_tlb_all(void);使所有tlb表项失效;
void flush_tlb_mm(struct mm_struct *mm);使指定用户地址空间的所有tlb表项失效;参数mm是进程的内存描述符;
flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end);使指定用户地址空间的某个范围的TLB表项失效;参数vma是虚拟内存区域,start是起始地址,end是结束地址;

arm64架构中关于tlb管理的说明如下:

/**	TLB Management*	==============**	The TLB specific code is expected to perform whatever tests it needs*	to determine if it should invalidate the TLB for each call.  Start*	addresses are inclusive and end addresses are exclusive; it is safe to*	round these addresses down.**	flush_tlb_all()**		Invalidate the entire TLB.**	flush_tlb_mm(mm)**		Invalidate all TLB entries in a particular address space.*		- mm	- mm_struct describing address space**	flush_tlb_range(mm,start,end)**		Invalidate a range of TLB entries in the specified address*		space.*		- mm	- mm_struct describing address space*		- start - start address (may not be aligned)*		- end	- end address (exclusive, may not be aligned)**	flush_tlb_page(vaddr,vma)**		Invalidate the specified page in the specified address range.*		- vaddr - virtual address (may not be aligned)*		- vma	- vma_struct describing address range**	flush_kern_tlb_page(kaddr)**		Invalidate the TLB entry for the specified page.  The address*		will be in the kernels virtual memory space.  Current uses*		only require the D-TLB to be invalidated.*		- kaddr - Kernel virtual memory address*/

arm64 tlb失效指令

当tlb没有命中的时候,arm64处理器的MMU自动遍历内存中的页表,把页表项复制到tlb,不需要软件把页表写道tlb,所有arm64架构没有提供写tlb的指令;

arm64架构提供了一条tlb失效指令:


TLBI <type><level>{IS} {, <Xt>}


1)字段type的常见选项如下:

  • ALL:所有表项;
  • VMALL:当前虚拟机的阶段1的所有表项,即表项的VMID是当前虚拟机的VMID;虚拟机里面运行的客户操作系统的虚拟地址转换成物理地址分为两个阶段:第1阶段把虚拟地址转换成中间物理地址;第2阶段把中间物理地址转换成物理地址;
  • VMALLS12:当前虚拟机的阶段1和阶段2的所有表项;

2)字段level指定异常级别;

  • E1:异常级别1;
  • E2:异常级别2;
  • E3:异常级别3;

3)字段IS表示内部共享(Inner Shareable),即多核共享;如果不使用IS字段,表示非共享,只被一个核使用;在SMP系统中,如果指令TLBI不携带字段IS,仅使当前核的TLB表项失效;如果指令TLBI携带字段IS,表示使所有核的TLB表项失效;
4)字段Xt是X0~X31中的任一寄存器;

arm64 flush tlb函数分析

函数flush_tlb_all,用来使所有核的所有TLB表项失效;

/**	flush_tlb_all()**		Invalidate the entire TLB.
*/static inline void flush_tlb_all(void)
{dsb(ishst);__tlbi(vmalle1is);dsb(ish);isb();
}

是一些汇编代码,将宏展开后代码如下:

static inline void flush_tlb_all(void)
{asm volatile("dsb ishst": : : "memory");asm ("tlbi vmalle1is" : :);asm volatile("dsb ish" : : : "memory");asm volatile("isb" : : : "memory");
}

最主要的是tlbi vmalle1is,根据前面介绍的arm64架构tlb失效指令:使所有核上匹配当前VMID、阶段1和异常级别1的所有TLB表项失效;

对比一下ARM64架构的函数local_flush_tlb_all,作用是使当前核的所有TLB表项失效,代码如下:

static inline void local_flush_tlb_all(void)
{dsb(nshst);__tlbi(vmalle1);dsb(nsh);isb();
}

vmalle1,根据前面介绍的arm64架构tlb失效指令:使当前核上匹配当前VMID、阶段1和异常级别1的所有TLB表项失效;

地址空间标识符(Address Space Identifier,ASID)

为了减少进程切换时清空TLB的需要,ARM64处理器的TLB使用非全局(not global,nG)位区分内核和进程的页表项(nG位为0表示内核的页表项),使用ASID区分不同进程的页表项;
ARM64处理器的ASID的长度时可以设置的,支持8bit或者16bit;
SMP系统中,ARM64架构要求ASID在处理器的所有核上是唯一的;
假设ASID长度是8bit,ASID只可以有256个值,其中0是保留值;有效的ASID范围是1~255;进程的数量可能超过255,那么两个进程的ASID值可能冲突,这个问题怎么解决呢?内核引入了ASID版本号,方法如下:

  1. 每个进程有一个64位的软件ASID,低8位存放硬件ASID,高56位存放ASID版本号;
  2. 64位全局变量asid_generation的高56位保存全局ASID版本号;
  3. 当进程被调度时,比较进程的ASID版本号和全局ASID版本号;如果版本号相同,那么直接使用上次分配的硬件ASID,否则需要给进程重新分配硬件ASID;

1)如果存在空闲的硬件ASID,那么选择一个分配给进程;
2)如果没有空闲的硬件ASID,那么把全局的ASID版本号加1,重新从1开始分配硬件ASID,即硬件ASID从255回绕到1;因为刚分配得硬件ASID可能和某个进程的硬件ASID相同,只是ASID版本号不同;TLB中的ASID是硬件ASID,8bit;TLB中可能包含了这个进程的页表项,所以必须把所有处理器的TLB清空;
引入ASID版本号的好处是:避免每次进程切换都需要清空TLB,只需要在硬件ASID回绕的时候把处理器的TLB清空;

虚拟机标识符(Virtual Machine Identifier,VMID)

每个虚拟机有独立的ASID空间,TLB使用VMID区分不同虚拟机的转换表项,可以避免每次虚拟机切换都要清空TLB,只需要在VMID回绕时把处理器的TLB清空;

这篇关于页表缓存TLB原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897705

相关文章

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中