linux内存管理 (二) [硬件] MMU及其运行过程 关键过程一 TLB

===========================================
虚拟地址和物理地址的转换 关键过程1 从TLBs获取pa
	
当处理器要访问一个虚拟地址时,首先会在TLB中查询。
	如果TLB表项中没有相应的表项,称为TLB Miss,那么就需要
		1.访问页表(translation table walk)来计算出相应的物理地址。
		2.并在TLB中放置映射
	如果TLB表项中有相应的表项,那么直接从TLB表项中获取物理地址,称为TLB命中。 

TLB 的产生原因及作用

  • TLB的 产生
在现代处理器中,软件使用虚拟地址访问内存,而处理器的MMU单元负责把虚拟地址转换成物理地址
为了完成这个映射过程,软件和硬件共同来维护一个多级映射的页表。

为了完成虚拟地址到物理地址的转换,查询页表需要两次访问内存
	1.访问页表(translation table walk,walk 一级页表和二级页表)来计算出相应的物理地址
	2.根据物理地址访问主存,得到物理地址对应的值

而 我们可以在步骤1 进行优化,即 优化虚拟地址到物理地址转换的速度
	通过 TLB (将一级二级等页表项缓存到MMU内部的cache,即TLB)

综上,TLB是为了
	优化虚拟地址到物理地址转换的速度
	降低内存访问的平均成本
	

TLB是什么,TLB项内容是什么

  • TLB 本质
// 物理本质
TLB(Translation Lookaside Buffer)传输后备缓冲器是位于MMU中的小的缓存,其中每一行都保存着一个由单个PTE组成的块。
// 内容本质
TLB 用于缓存内存中的页表项(用于 虚拟寻址)
  • TLB 物理组成
// 物理组成
	实现可以有
		一个统一的TLB(von Neumann架构)
		或单独的指令和数据TLB(Harvard架构)。
	TLB表项( TLB entry )数量比较少,一般有多少个?
	TLB表项 有4字节.
  • TLB表项内容
// 内容

每个TLB条目都包含
	修改过的虚拟地址
	页面大小
		TLB可以基于以下块大小存储条目:
			超节由16MB内存块组成
			部分由1MB内存块组成
			大页面由64KB的内存块组成
			小页面由4KB内存块组成。
	物理地址
	一组内存属性
		内存属性1: 每个TLB条目被标记为  // 用于 匹配 tlb表项与 vma
			1.与特定的应用程序空间关联, 
			2.或被标记为所有应用程序空间的全局。
		内存属性2: Domain // 用于校验权限
			Register 3: Domain access control 和 页表项中的 Domain[8:5]  定义了 四种情况
		内存属性3: Access permissions // 用于校验权限
			当前执行指令时的特权级 和 页表项中的AP[11:10] 定义了四种情况
		内存属性4: 一组相关的内存区域属性,用来表示该块的 内存区域类型 // 用于定义内存块的 内存区域类型
			// 内存区域类型 : ARMv6 memory attributes - introduction on page B2-8.
			每个TLB条目都有一组相关的内存区域属性。
			这些控制访问 缓存/写缓冲区/内存区域 的 内存区域类型
			在VMSAv6之前
				只提供了C(可缓存)和B(可缓冲)位。
				它们的准确使用模型(例如,位设置如何影响直写与回写缓存策略)和任何其他控件都是由实现定义的。
			VMSAv6
				引入了一个更正式的内存模型(参见第B2-8页上的ARMv6内存属性-简介),由本节中描述的附加位字段(TEX)和定义支持。
				页表格式使用5bit(TEX[2:0]和C位和B位)来编码内存区域类型
				第B4-12页的表B4-3显示了类型扩展字段(TEX)和可缓存和可缓冲位(C和B)到内存区域类型的映射
					没有TEX字段的页表格式
						TEX = 0b000
					如果页表包含共享位。
						共享位 仅适用于普通内存,而不是设备内存或强顺序内存
						并确定内存区域是共享(1)还是不共享(0)。
					如果页表不包含共享位。
						假定S位为0(不共享)。




// 内容什么时候填充的
	TLB中内容是  硬件翻译单元 从内存中维护的一组页表(转换表)中查找得来的.
		如果在TLB中找不到地址的映射,则硬件会自动读取转换表,并在TLB中放置映射。
		执行完整翻译表查找的过程称为 translation table walk。
	

TLB hit/miss

  • TLB hit/miss过程
// 虚拟地址 和 其他 东西  与 tlb 表项比较 ,并 命中了  tlb 表项A
tlb表项 = tlb_map_func(虚拟地址)
tlb_map_func有三种
	全关联
	直接映射
	分组关联
        
直接映射方式 // 直接映射方式是指每一个虚拟地址只能映射到TLB中唯一的一个表项
    TLB条目与VMA匹配
        修改后的虚拟地址的位31-N匹配,且它被标记为全局,其中N=log2(TLB条目 页面大小)
        修改后的虚拟地址的位31-N匹配,且TLB条目中的ASID与当前ASID(CP15中的寄存器13)匹配,其中N=log2(TLB条目 页面大小)
            在使用ASID的地方,CP15中的寄存器13确定当前选择的应用空间。

    TLB条目与TLB条目匹配
        如果TLB条目能够匹配TLB条目,则TLB的行为是不可预测的。
        操作系统必须确保在任何时候都不能有多个TLB条目匹配,通常是在更改全局页映射时刷新其TLB来实现这个目标
  • TLB hit/miss机率
TLB内部存放的基本单位是TLB表项(表项所占字节是一定的)
	TLB容量越大,所能存放的TLB表项就越多,TLB命中率就越高
	但是TLB的容量是有限的(一般不超过1000个TLB表项)
	所以 一般 通过 提高页面大小 来提高TLB miss 机率.

页越大,TLB miss 机率就越小
	如果一个程序使用4M,
		Linux内核目前默认采用4KB大小的小页面,
			1024个页面,那么需要1024个TLB表项就可以保证不会出现 TLB Miss的情况。
		如果使用2MB大小的大页
			2 个页面  ,那么需要2   个TLB表项就可以保证不会出现 TLB Miss的情况。
		以1GB为单位的大页
			1 个页面  ,那么需要1   个TLB表项就可以保证不会出现 TLB Miss的情况。

After TLB hit

  • TLB 命中之后,生成物理地址的过程


If a matching TLB entry is found then the information it contains is used as follows:

1. The access permission bits and the domain are used to determine whether access is permitted. If the access is not permitted the MMU signals a memory abort. Otherwise the access is allowed to proceed.
2. The memory region attributes are used to control:
• the cache and write buffer
• whether the access is cached or uncached
• the target memory type
• whether the target memory is shared or unshared.
3. The physical address is used for any access to external or tightly coupled memory, and can be used to perform TAG matching for cache entries in physically tagged cache implementations.

TLB 与 Translation Table walk

  • TLB项与页表项区别
相同点
	表项都是4字节
不同点
	1. tlb项存储在tlb中,页表项存储在主存中
	2. tlb项 没有 页表项 多, 是因为 tlb 没有 主存 大
	4. 内容不同
		3.1 tlb 的索引过程通过 标识(VMA[19:31])index(VMA[13:18]) 来索引 // TODO
			更正: 通过  VMA[31:log2(页面大小)] 和 应用程序空间关联关系  来 命中.
		3.2 页表项通过 虚拟地址 (which entry + offset in block) 中的 which entry 来索引
  • Translation Table walk 时间 与 TLB 时间 消耗 比较
如果没有TLB,则每次取数据都需要两次访问内存,即
	1.从内存中查页表获得物理地址
	2.从内存中取数据。
	
如果有TLB,则每次取数据最少需要1次访问内存,至多需要2次访问内存,
	1.从TLB中查页表获得物理地址,如果能查到,执行2,如果查不到,则从内存中查页表获得物理地址(执行一次Translation Table walk),然后执行2
	2.从内存中 取数据。

Translation Table walk
	//它由硬件自动执行,并且在执行时间上有很大的开销,至少有一个主内存访问,通常有两个。(到底是几个?)


TLB的operations

  • 上下文切换之后需要软件操作TLB 刷新
当进程地址空间进行了切换,
	比如现在是进程1运行,TLB中放的是进程1的相关数据的地址;
	突然切换到进程2,TLB中原有的数据不是进程2相关的,
此时TLB需要刷新数据。怎么刷新数据? 

目前两种方法:
	一,全部刷新。
		全部刷新很简单,但花销大,很多不必刷新的数据也进行刷新,增加了无畏的花销。 
	二,部分刷新。 
		部分刷新是根据标志位,刷新需要刷新的数据,保留不需要刷新的数据。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章