图中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的相关知识。