Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1132520
  • 博文数量: 254
  • 博客积分: 1242
  • 博客等级: 少尉
  • 技术积分: 1581
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-03 21:49
文章分类

全部博文(254)

文章存档

2017年(16)

2016年(4)

2013年(94)

2012年(140)

分类:

2012-12-04 14:27:43

TLBs, Paging-Structure Caches, and Their Invalidation
                         (intel 手册阅读总结)
一 地址转换
1 处理器是通过“分页机制”实现的线性地址到物理地址的转换,这些转换主要包括:
  (1)指令的获取和普通数据的访问
  (2)推测执行的预取和内存访问(这部分并不在代码的执行路径中,也不会引起缺页异常)
  ”分页机制“的执行主要由分页模型决定,下面我们就来看一下主要的分页模型:
  (1)CR4.PAE = 0,此时将32位的线性地址转换为32的物理地址,当开启大页模式时,也可以把32位线性地址转换成36位的物理地址
 (2)CR4.PAE = 1 and IA32_EFER MSR.LMA =0,此时将32位的线性地址转换成36位的物理地址
 (3)CR4.PAE = 1 and IA32_EFER MSR.LMA =1,此时将48位的线性地址转换成52位的物理地址
2 Paging in IA-32e Mode

图中63-48位是第47位的符号扩展,CR3中存储的是PML4 table的物理地址,那么整个寻址的过程如下:
CR3 + PML4 确定PML4 table中的某一项,512=2^9,所以只有一个PML4 table
CR3 + PML4 + Directory Ptr 确定页目录项中的某一项,同理,也只有一个页目录项表
CR3 + PML4 + Directory Ptr + Directory 确定某一个页表项,也只有一个页表项表
CR3 + PML4 + Directory Ptr + Directory + table 确定某一个也表,也只有一个也表
最后加上便宜就可以得到相应的物理地址。
注意:每一级的表中都是512项,每一项是一个64位的入口
   另外,在每一个入口的64位中除了52位的物理地址,还有一些其他的标志位:
(1)present: 标识包含访问物理地址的页框是否在内存中
(2)read/write: 读写权限位
(3)user/supervisor: 用户/内核访问权限位
(4)access:是否被访问,1表示被访问过
(5)dirty:是否被写过, 1 表示被写过
(6)resevred:这些位必须被设为0,否则将产生page fault
(7)Execute-disable:1 正常 0产生page fault

3 Translation Lookaside Buffers (TLBs)
先给出自己理解的TLBs,如果有错,敬请斧正。

每次寻址时,首先比较线性地址的也号是否在TLBs中,如果在直接取其物理地址,否则,进行其他的地址转换步骤。对于TLBs感觉从这个表中就可以理解了,这里就不在罗嗦了!

4 Paging-Structure Caches
  现在我们再来看看,如果TLBs不命中的时候的地址转换方式,三种cache:
PML4 cache,PDE cache和PTE cache.
顾名思义,上面这些cache就是用来缓存以前相应的级别的线性地址转换的结果的,这没有什么好讲的,另一方面,采用这种机制无非也是想加快线性地址到物理地址的转换,使得以前的转换结果可以得到最大可能的利用。那么,寻址的过程就变成了这么一个顺序:
   如果在TLBs中没有命中,就到PTE cache中查找,找到,直接就取得相应页表的物理地址,如果不命中,就到上一级的PDE cache中查找,一次类推,直到到达PML4 cache,如果还没有找到,就要从头开始进行分页机制的地址转换了,具体的转换过程上面已经讲到过。

5 Multiple Cached Entries for a Single Paging-Structure Entry
  按照题目翻译,这部分的意思就是可能存在这么一种情况:
对于某一级的一个页结构的入口地址,可能有多个缓存入口的情况,下面我们来考虑一下,在什么情况下会出现这种情况。
  我们很容易想到:不同的线性地址映射到同一物理地址这种情况。
这种情况下到底有什么优缺点我还怎么看明白,以后补充!

6 TLBs 和各级页结构cache的无效
  这部分就是讲无何保证TLBs和各级页结构cache的内容是最新的,即是修改过的。
下面讲了使cache无效的方法:
(1)INVLPG指令:对某一个线性地址进行单独的操作,这条指令将会使线性地址指向的页号任何的TLBs入口无效,包括那些被设置了G位的入口,另外,还会无效所有的页结构cache而不管是否是不是与所指的线性地址相对应。
(2)Mov to CR3:无效所有的TLBs,除了那些G=1的TLBs入口。同时无效所有的页结构cache
(3)mov to CR4:
如果这条指令修改了CR4的PGE位,将会无效所有的TLBs入口,包括那些G=1的入口,同时,无效所有的页结构cache
  除了上面提到的无效的情况,page fault也会使TLBs和各级cache中相同的线性地址的的入口无效。

这本intel手册后面还讲到了一些优化的使无效方法,带有扩展的32位的页模式,以及多处理器上页结构变化的传播。总体来说对我们用户级的程序设计没有什么太大关系,个人感觉仅仅是讲了一种原理,而且,我是本着了解L2cache的替换策略来阅读这本手册的,读完后,感觉对我的目的没有什么太大的帮助,就当是增加一点intel体系结构的常识吧!
   最后,希望有兴趣的朋友能和我多家讨论关于cache的相关知识。




阅读(954) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~