linux内核学习笔记015 页表缓存于巨型页

一、页表缓存(TLB)

处理器厂商在内存管理单元(MMU)里增加一个TLB(Translation Lookaside Buffer)的高速缓存,TLB直译为转译后备缓冲器,也被翻译为页表缓存。
TLB为CPU的一种缓存,由存储器管理单元用于改进虚拟地址到物理地址的转译速度。
TLB 用于缓存一部分标签页表条目。TLB可介于 CPU 和CPU缓存之间,或在 CPU缓存和主存之间,这取决于缓存使用的是物理寻址或是虚拟寻址。

1.地址空间标识符区分不同进程的页表项,虚拟机标识符区分不同虚拟机的页表项

地址空间标识符:为了减少在进程切换时清空页表缓存的需要,ARM64处理器的页表缓存使用非全局(not global, nG)位区分内核和进程的页表项,使用地址空间标识符(Address Space Identifer,ASID)区分不同进程的页表项。
ARM64处理器ASID长度是由具体实现定义的,可以选择8位或者16位,寄存器ID_AA64MMFRO_EL1(AArch64内存模型特性寄存器0,AArch64 Memory Model Feature Register 0)的字段ASIDBits存放处理器支持的ASID长度。

虚拟机标识符:虚拟机里面运行的客户操作系统的虚拟地址换成物理地址分两个阶段:第1阶段把虚拟地址转换成中间物理地址,第2阶段把中间物理地址转换成物理地址。第1阶段转换由客户操作系统的内存控制,和非虚拟化的转换过程相同。第2阶段转换由虚拟机监控器控制,虚拟机监控器为每个虚拟机维护一个转换表,分配一个虚拟机标识符(Virtual Machine Identifier,VMID),寄存器VTTBR_EL2(虚拟化转换表基准寄存器,Virtualization Translation Table Base Register)存放当前虚拟机的阶段2转换表的物理地址。

2.页表改变后冲刷TLB的函数:

在这里插入图片描述

在这里插入图片描述
使指定用户地址空间的所有TLB表项失效,参数mm是进程的内存描述符。

在这里插入图片描述
使指定用户地址空间的某个范围TLB表项失效,参数vma虚拟内存区域,start是起始地址,end是结束地址。

在这里插入图片描述
使指定用户地址空间里面的指定虚拟页的TLB表项失效,参数vma是虚拟内存区域,uaddr是一个虚拟页中的任意虚拟地址。

在这里插入图片描述
使内核的某个虚拟地址范围的TLB表项失效,参数start是起始地址,end是结束地址。

3.当TLB没有命中时候ARM64处理器的内存管理单元自动遍历内存中的页表,把页表复制到TLB,要软件把页表写道TLB,所以ARM64架构没有提供写TLB的指令。

ARM64架构提供一条TLB失效指令
字段常见选项:(ALL:所有表项。 VMALL:当前虚拟机的阶段1的所有表项,即表项的VMID是当前虚拟机的VMID,虚拟机里面运行客户操作系统的虚拟地址转换成物理地址分为两个阶段,第一阶段把虚拟地址转换成物理地址,第二阶段把中间物理地址转换成物理地址。ASID:匹配寄存器Xt指定的ASID的表项。VA:匹配寄存器Xt指定的虚拟地址和ASID的表项。VAA:匹配寄存器Xt指定的虚拟地址并且ASID可以是任意值的表项。)

字段指定异常级别:(E1:异常级别1。 E2:异常级别2。 E3:异常级别3。)

字段表示内部共享,即多个核共享:如果不使用字段IS,表示非共享,只被一个核使用。

字段Xt是X0-X31中的任何一个寄存器。
在这里插入图片描述
在这里插入图片描述
此函数核flush_tlb_all区别在于:
1)指令dsb中字段ish换成nsh,nsh使非共享(non-shareable),表示数据同步屏障指令仅仅在当前核起作用;
2)指令tlbi没有携带字段is,表示仅仅使当前核的TLB表项失效。

4.平时为了方便描述,假设ASID长度是8位,ASID只有256个值,其中0是保留值,可分配ASID范围是1-255,进程数量可能超过255个,两个进程ASID可能相同,如何解决这个问题,内核引入ASID版本号:

A.每个进程有一个64位的软件ASID,低8位存放硬件ASID,高56位存放ASID版本号;
B.64位全局变量的高56位保存全局ASID版本号;
C.当进程被调用的时候,比较进程的ASID版本号核全局ASID版本号,如果版本号相同,直接使用上次分配的硬件ASID。否则需要给进程重新分配硬件ASID。
引入ASID版本号的好处:避免每次进程切换都需要清空页表缓存,只需在硬件ASID回绕时把处理器的页表缓存清空。

内存描述符成员context存放结构特定的内存管理上下文,数据类型时结构体nn_context_t。ARM64架构定义结构体类型如下:
在这里插入图片描述
当全局ASIDe版本号+1时,每个处理器需要清空页表缓存,位图tlb_flush_pending保存需要清空页表缓存的处理器集合。
在这里插入图片描述

5.虚拟机标识符

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

二、巨型页

当运行内存需求量较大的应用程序时,如果使用长度为4KB的页,将会产生较多的TLB未命中和缺页异常,严重影响应用程序的性能。如果使用长度为2MB甚至更大的巨型页,可以大幅减少TLB未命中和缺页异常的数量,大幅提高应用程序的性能。这才是内核引入巨型页(Huge Page)的真正原因。

巨型页首先需要处理器能够支持,然后需要内核支持,内核有两种实现方式:
使用hugetlbfs伪文件系统实现巨型页;
透明巨型页。
hugetlbfs文件系统时一个假的文件系统,只是利用了文件系统的编程接口。使用hugetlbfs文件系统实现的巨型页称为传统巨型页。
透明巨型页,标准巨型页的优点是预先分配巨型页到巨型页池,进程申请巨型页的时候从巨型池取出,成功的概率很高,缺点时应用程序需要使用文件系统的编程接口。透明巨型页的优点是对应用程序透明,缺点是动态分配,在内存碎片化的时候分配成功的概率很低。

1.处理器对巨型页的支持

ARM64处理器支持巨型页的方式有两种:
通过块描述符支持巨型页;
通过页/块描述符的连续位支持巨型页。

通过块描述符支持巨型页:
假如:页长度4kb,那么使用4级转换表,0级转换表不能使用块描述符,1级转换表的块描述符指向1GB巨型页,2级转换表的块描述符指向2MB巨型页。
在这里插入图片描述
通过页/块描述符的连续位支持巨型页:
页/块描述符中的连续位指示表项是一个连续表项集合中的一条表项,一个连续表项集合可以被缓存在一条TLB表项里面。通常所说,进程申请了n页的虚拟内存区域,然后申请了n页的物理内存区域,使用n个连续的页表把每个虚拟页映射到物理页,每个页表项设置了连续标志位,当处理器的内存管理单元遍历内存的页表时,访问到n个页表中的任何一个页表项。发现页表项设置了连续标志位,就会把n个页表项合并以后填充到TLB表项。

假设:页长度时4KB,那么使用4级转换表,1级转换表的块描述符不能使用连续位;2级转换表的块描述符支撑16个连续块,即支持(162MB=32MB)巨型页,3级转换表的页描述符支撑16个连续页,即支持(164KB=64KB)巨型页。

假设:页长度时16KB,那么使用4级转换表,2级转换表的块描述符支持32个连续块,即支持(3232MB=1GB)巨型页,3级转换表的页描述符支撑128个连续页,即支持(12816KB=2MB)巨型页。

假设:页长度时64KB,那么使用3级转换表,2级转换表的块描述符不能使用连续位,3级转换表的页描述符支撑32个连续页,即支持(32*64KB=2MB)巨型页。
在这里插入图片描述

2.巨型页池

内核使用巨型页池管理巨型页。有的处理器架构支持多种巨型页长度,每种巨型页长度对应一个巨型页池,有一个默认的巨型页长度,默认只创建巨型页长度是默认长度的巨型页池。比如ARM64架构在页长度位4kb的时候支持巨型页长度是1GB 32MB 2MB 64KB,默认的巨型页查高度是2MB,默认只有创建巨型页长度是2MB的巨型页池。
在这里插入图片描述

巨型页池中的巨型页可以分为两种:
永久巨型页:是保留的,不能有其他用途,被预先分配到巨型页池,当进程释放永久巨型页的时候,永久巨型页被归还到巨型页池。
临时巨型页:也称为多余的巨型页,当永久巨型页用完之后,可以从页分配器分配临时巨型页;进程释放临时巨型页的时候,直接释放到页分配器。当设备长时间运行之后,内存可能碎片化,分配临时巨型页可能会失败。
hugetlb相当于hugepages页面管理者,页面的分配及释放,都是由此模块负责。
Hugetlbfs则用于向用户提供一套基于文件系统的巨型页使用界面,下层功能的实现,主要依赖hugetlb。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值