二级页表缓存及虚拟化改进.

来源:百度文库 编辑:神马文学网 时间:2024/04/29 03:39:34
  页表缓存(Translation Look-aside Buffer,TLB)和CPU的一级缓存、二级缓存并没有很大区别,差别是页表缓存中存放的是一些页表文件(虚拟地址到物理地址的转换表)而一、二级缓存则是存储数据或指令。当处理器要在主内存寻址时,并不会直接在内存的物理地址里查找,而是通过一组虚拟地址转换到主内存的物理地址,TLB就是负责将虚拟内存地址翻译成实际的物理内存地址,而CPU寻址时会优先在TLB中进行寻址。   既然TLB是存放内存页表的缓存,那么它里边存放的数据实际上和内存页表区的数据是一致的。在内存的页表区里,每一条记录虚拟页面和物理页框对应关系的记录称之为一个页表条目(Entry),同样地,在TLB里边也缓存了同样大小的页表条目(Entry)。由于页表条目的大小总是固定不变的,所以TLB的容量越大,则它所能存放的页表条目数越多(类似于增大CPU一级、二级缓存容量的作用),这就意味着缓存命中率的增加,就能大大减少CPU直接访问内存的次数,实现了性能提升。   Core 2有着非常特别的TLB安排,一级数据页表缓存(DTLB)非常的小,并且只用来读取。它为4KB小页表和2MB/4MB大页表都提供16 entries,均为4路联合。二级DTLB更大一些,可以支持所有的内存访问(包括一级DTLB和其他存储器)。它提供256 entries小页表和32 entries大页表,也都是4路联合。   Nehalem微架构则将Core 2处理器原有的TLB分成了真正意义上的两级,可以为SMT在活动线程上下文之间进行动态分配。Nehalem的第一级DTLB能够进行所有的内存访问,它为4KB页表提供64 entries,为2MB/4MB大页表提供32 entries,依然采用4路联合。二级TLB则是全新设计,二级TLB不再分为ITLB或者DTLB,而是采用统一化设计,同时支持指令和数据存取。二级TLB包含512 entries,只支持小页表。   Nehalem和Core 2的TLB的一个明显的差异是它们对缓存的覆盖度不同。Core 2的Penryn处理器有6MB二级缓存,通过4KB页表(多数应用不会使用大页表)其TLB一共可以转换2176KB的内存地址,大约是1/3的二级缓存。而Nehalem一个核心就有多达576 entries的小页表,一个4核心处理器则有2304 entries,如此大量的TLB entries能够转换9216KB内存地址,这个数值已经比8MB的三级缓存还要大。   Nehalem的TLB entries还通过加入虚拟处理器ID(Virtual Processor ID,VPID)而产生微妙的改变。每一个TLB entry都为一个内存页面缓存一个虚拟到物理地址的转换,该转换具体到一个既定的进程和虚拟机(Virtual Machine,VM)。当处理器在虚拟客户端和主机环境之间切换时,Intel过去的处理器都会不断刷新TLB以确保进程只访问被允许访问的内存。而VPID会追踪TLB中某个转换entry所联合是那个虚拟机,这样当VM exit和VM re-entry发生时,TLB即使不刷新也能够保证安全度。如果一个进程试图访问不属于自己的地址转换,则会直接简单的在TLB发生命中失败而不是非法访问。VPID通过此方式减少虚拟机地址转换的开销来提升虚拟化性能。Intel宣称Nehalem一个回合的虚拟机地址转换延迟要比Penryn低1/3。   Nehalem另一个虚拟化方面的改变来自扩展页表(Extended Page Tables,EPT),它用于减免大量VM地址转换数,这要比VPID的降低VM地址转换有效成本更加有效。一般的页表用于映射客户端虚拟地址到客户端物理地址。然而在虚拟化系统中,还需要将客户端的物理地址转换为主机的物理地址。扩展页表正是负责管理客户端物理地址到主机物理地址的映射。在Nehalem之前的处理器产品(除了AMD的Barcelona)都需要系统管理程序来应付page fault,而Nehalem只需要简单的借助扩展页表减少了大量不必要的VM exits。通过VPID和EPT技术,Intel表示Nehalem的虚拟化延迟将比Penryn低40%。