处理器的内存单元(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进行处理,非常感谢!