linux内核源码分析之页表缓存

        处理器的内存单元(MMU)负责把虚拟地址转换成物理地址。为了改进虚拟地址到物理地址的转换速度,引入TLB的高速缓存。即页表缓存

        页表缓存用来缓存最近使用过的页表项,有些处理器使用两级页表缓存:第一级TLB分为指令TLB和数据TLB,第二级TLB是统一TLB,即指令和数据公用TLB

TLB管理

如果内核修改了缓存在TLB中的数据,那么旧的数据必须废除,内核如何保证一致性/p>

函数
flush_tlb_all 使所有TLB失效
flush_tlb_mm 使指定用户地址空间的所有TLB失效
flush_tlb_range 使指定的地址空间范围的TLB失效
flush_tlb_page 使指定用户地址空间里面的指定虚拟地址页的TLB表项失效
flush_tlb_kernel_range 使内核虚拟地址范围的TLB表项失效
update_mmu_cache 修改页表项后把页表项设置到页表缓存,由软件管理页表缓存的处理器必须实现此函数。
tlb_migrate_finish 内核把进程从一个处理器迁移到另外一个处理器后,调用此函数以更新页表缓存或上下文特定信息。

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

 展开后的程序为

 local_flush_tlb_all用来使当前核的所有TLB表项失效

和函数flush_tlb_all的区别如下

1)指令dsb中的ish换成了nsh,nsh是非共享,表示数据同步屏障指令仅在当前核起作用

2)指令tlbi没有携带is,表示仅仅使当前核的TLB表项失效。

地址空间标识

        为了减少在进程切换时清空页表缓存的需要,ARM64处理器的页表缓存使用非全局位区分内核和进程的页表项。使用地址空间标识符ASID(Address Space Identifier)区分不同进程的页表项。

虚拟机标识符

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


《linux内核深度解析 (余华兵) 》

文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24693 人正在系统学习中

来源:为了维护世界和平_

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年11月20日
下一篇 2022年11月20日

相关推荐