一、端到端地址翻译示例
从图上看,TLBI占了t位,而TLBT占了n-p-t位。
上节我们刚把TLB开了个头,多说无益,还是具体来玩个实际例子吧,具体来做一个端到端(虚拟地址到物理地址)的地址翻译示例,来统筹下之前讲的知识点。先来做如下约定:
1、老规矩,存储器按字节寻址,访问也按一字节访问;
2、虚拟地址14位长(n=14),物理地址12位长(m=12),位数少点玩起来方便;
3、页面大小是64字节(P=64),也就是说(p=6)
4、TLB是四路组相联,总共16个条目;
5、L1 d-cache是物理寻址、直接映射的,行大小为4字节,总共有16个组。
这里得先贴出各个单元内的数据快照,以便分析,首先是TLB。
先看上面的图,要明确一点,引入TLB就是为了进一步分级VPN的,而分解方式跟VPN本身的页表逻辑可能没有对应关系!
由于页面大小64字节,p=6,因此虚拟页偏移VPO占用6位,既然是6位,再看虚拟地址是14位长(事先约定的,所以不是32位),剩下VPN是8位,也就是说TLB需要处理2^8也就是256个VPN值。而TLB是四路组相联,从上到下0~3这四路,由VPN的低两位——TLBI来标识;而TLB的四组中每组有四个条目,要处理总共256个VPN,它们被分成四路,也就是说每组还要对口处理64个VPN(256÷4=64)……注意到剩了6位给TLBT,他就是所谓的标记位,正刚好就能区分2^6=64个VPN,因此不管某个VPN被映射到哪一组,在同一组内是不会出现VPN重复歧义现象的,由TLBI确定组,再由TLBT确定标记位,于是8位VPN就这样通过6+2的方式被TLB分解和存储!
好,那假设现在CPU要读取虚拟地址0x03d4处的值会出现什么情况?