硬件高速缓存是通过高速缓存行寻址的。L1_CACHE_BYTES宏产生以字节为单位的高速缓存行的大小。
为了使高速缓存的命中率达到最优化,采取下列决策:
一个数据结构中最常用使用的字段放在该数据结构内的低偏移部分,以便他们能够处理高速缓存的同一行中。
当为一大数组数据分配空间时,内核师徒把他们放在内存中,以便所有高速缓存行按同一方式使用。
TLB是一个内存管理单元用于改进虚拟地址到物理地址转换速度的缓存.
TLB是位于内存中的页表的cache,如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据.
2)tlb的原理
当cpu对数据进行读请求时,CPU根据虚拟地址(前20位)到TLB中查找.
TLB中保存着虚拟地址(前20位)和页框号的对映关系,如果匹配到虚拟地址就可以迅速找到页框号(页框号可以理解为页表项),通过页框号与虚拟地址后12位的偏移组合得到最终的物理地址.
如果没在TLB中匹配到虚拟地址,就出现TLB丢失,需要到页表中查询页表项,如果不在页表中,说明要读取的内容不在内存,需要到磁盘读取.
TLB是MMU中的一块高速缓存,也是一种Cache.
TLB是MMU中的一块高速缓存,也是一种Cache.
在分页机制中,TLB中的数据和页表的数据关联,不是由处理器维护,而是由OS来维护,TLB的刷新是通过装入处理器中的CR3寄存器来完成.
如果MMU发现在TLB中没有命中,它在常规的页表查找后,用找到的页表项替换TLB中的一个条目.
3)tlb的刷新原则
当进程进行上下文切换时重新设置cr3寄存器,并且刷新tlb.
有两种情况可以避免刷tlb.
第一种情况是使用相同页表的进程切换.
第二种情况是普通进程切换到内核线程.
lazy-tlb(懒惰模式)的技术是为了避免进程切换导致tlb被刷新.
当普通进程切换到内核线程时,系统进入lazy-tlb模式,切到普通进程时退出该模式.
当内核为某个用户态进程分配页框并将它的物理地址存入页表项时,必须刷新与相应线性地址对应的任何本地TLB表项;在多cpu中,有多个CPU在使用相同的页表集,那么内核还必须刷新这些CPU上使用的相同的页表集的TLB表项。