- 论坛徽章:
- 9
|
本帖最后由 Tinnal 于 2014-09-14 12:35 编辑
回复 24# wLiu2007
cache和MMU在CPU内部是两个独立的硬件。你太过于强调,他们弄成一个整体了。VIPT等的模式,主要是因为(用软件的概念来说):cache有两个入参一个是index, 另一个是tag。他们从那去取的问题,从物理地址去取?不是从虚拟地址去去。这跟两个硬件的间接关系相关,但两个硬件内部的处理,就完全不相关了。因为用PAGE_SIZE和cache size/cache line size去做强相关分析是不对的。你的总体出发点就错了。
下面针对你写的内容做一下说明:
1,如果2个VA映射到同一个PA的话,这个PA可能占用2个不同的cache line,这样就有数据更新不同步的问题;
这个理解是对的。这就是cache aliasing的根因。如arm-linux-gcc兄所说,可以由软件按color对齐(目标是让两个虚拟地址一样)去解决;或硬件增加相应的电路去保证。
2,如果2个VA映射到2个不同的PA,映射关系VA1-PA1, VA2-PA2, 访问VA1的时候,有可能取得数据是VA2的数据;因为通过VA1和VA2提取的index是一样的,PA1和PA2的PFN的高几个比特相同,只有最后一个bit不同,但是tag只取高几个bit,所以通过PA1和PA2提取出来的Tag也是一样的;
你应该是指如下的情况:- |->page shift |->page shift
- | |->cache line shift | |->cache line shift
- X001|a|o(虚拟地址) -> A000|b|o(物理地址)
- | | | |
- Y001|a|o -> A111|b|o
复制代码 X001a0和Y001a0两个虚拟地址有相同的index:001a和相同的Tag: A,因此同在一个cache line里头。但他们对应的物理地址并不一样。因此如果X001a0先读,发生cache miss,然后再读Y001a0,将cache命中,并把属于A000bo的内容读进来。
这个问题在http://en.wikipedia.org/wiki/CPU_cache的VIPT节里已经有说明: VIPT requires more tag bits, as the index bits no longer represent the same address.
另外,对于你所于的解决方面。你要清楚组相关cache,一个SET内部是全相关的,而set间是直接映射的。全相关电路需要的比较器数量是直接映射的需要的比较器不是一个级数的。要不然直接全相关好了,都不用来个组相关的了。这个用多级页表来形容你应该会清楚一点。谁想转换一个地址查半天,但如果用一个表,那就表就实在太大、浪费太多的内存了。
|
|