处理Cache alias

来源:互联网 发布:国际数据公司 收购 编辑:程序博客网 时间:2024/05/16 17:21

如果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) {

        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的

0 0