cache alias

如果cache只有4k,和物理页一样大,那么其实进行index还是相当于用物理地址进行的.

所以只有cache大于系统物理页的大小的时候才会出现cache alias,如果cache式8k,

那么cache alias只可能出现在两个地方.所以,如果我们要避免cache alias,

只需要保证多个virtual addr 产生的index一样就可以了. 比如,系统物理页是4k,

cache是8k,那么我们只要保证虚拟地址的0到13bit一样就可以保证这么多个virtaul addr不会产生cache alias,

因为他们的index都一样所以,如果我们要申请虚拟地址,这些虚拟地址有可能会有cache alias的情况,

那么我们就只需要保证这些虚拟地址是cache大小的modulo. 比如cache是8k,我们取虚拟地址只需要保证vaddr = (vaddr +((8k -1))) &(~(8k-1))

我们来看linux是怎么做的 :

1.在probe_pcache 根据处理器类型初始化cache sets和cache line size

2.在r4k_cache_init 里面初始化 shm_align_mask = max_t( unsigned long, c->dcache.sets * c->dcache.linesz - 1, PAGE_SIZE - 1); 计算出cache的大小,然后减去1,得到mask

3.看linux如何保证不会有cache alias的发生.(注意,cache alias只是在多个虚拟地址映射同一个物理page的时候才会发生,所以,我们看看do_mmap是怎么避免cache alias的发生的)

 do_mmap_pgoff --->get_unmapped_area-->get_unmapped_area(arch_get_unmapped_area)

第一个地方:

if (flags & MAP_FIXED) { /* * We do not accept a shared mapping if it would violate * cache aliasing constraints. */

        if ((flags & MAP_SHARED) && (addr & shm_align_mask))

         return -EINVAL;

         return addr;

}

第二个地方:

........

if (do_color_align)

        addr = COLOUR_ALIGN(addr, pgoff);

....... 注意:当mmap的时候强制指定addr的时候,linux是不会检查cache alias的



ref from http://www.cnblogs.com/simBCM/archive/2011/04/05/2005789.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值