16_TLB与流水线

1 前面做的实验起始有缺陷

访问内存之后,后面执行两句代码后;并不能保证刚才访问的代码还在TLB中;有可能被刷新出去了;

实验验证缺陷:

代码 不连续 TLB 被淘汰:

16_TLB与流水线

2万次中有1次被淘汰;由于访问代码不连续

代码:

G位即使存在 访问代码不连续也可能被淘汰:

16_TLB与流水线

我这里循环了20000次 ,有1次G位即使在也被TLB淘汰了。

代码:

总结: 注意啊 ::: 切换 cr3 刷新TLB G位的 无影响; 得 使用

__asm invlpg ds : [0x41c000] // 无视 g 位的刷新;

3 流水线指令TLB 和数据TLB 得相互影响

前置知识 : 如果我们的页面没有可执行属性的话;在没有TLB中时,我们修改pte后,第一次访问 绝对时修改pte之后的对应的物理页数据;但是如果有可执行属性,那么在cpu 流水线 技术( 执行指令的时候,也在取指令,且根据将会执行的可能性提前取指令):

16_TLB与流水线

现象:

没有 可执行属性的时候;且没有主动加入快表的时候;坑定 是可预计的数据:

16_TLB与流水线

但是 一旦加入了可执行属性,流水线的预先取指令,可能执行到这儿,取后面的指令:

16_TLB与流水线

发现后面的指令有 0x405000 ,而且 0x405000 有可执行属性,可能就预先取了这个指令;继而访问;加入了TLB。 (但是即使这样这里也是指令TLB ,但是这里影响到了 数据TLB,但是概率也不高)

16_TLB与流水线

代码: