MRC p15,0,
MRC p15,1,
MRC p15,2,
MRC p15,1,
问题是: 如何知道L1 dcache的类型的? (pipt, vipt, vivit) 假设L1 dcache是vipt,如何知道他是否是alasing的?
kernel代码: static void __init cacheid_init(void) { unsigned int cachetype = read_cpuid_cachetype(); unsigned int arch = cpu_architecture();
if (arch >= CPU_ARCH_ARMv6) {
if ((cachetype & (7 << 29)) == 4 << 29) {
/* ARMv7 register format */ 》》》》》》》》》》》》》会走到这里
cacheid = CACHEID_VIPT_NONALIASING;
if ((cachetype & (3 << 14)) == 1 << 14)
cacheid |= CACHEID_ASID_TAGGED;
else if (cpu_has_aliasing_icache(CPU_ARCH_ARMv7))
cacheid |= CACHEID_VIPT_I_ALIASING;
kernel的意思是,默认L1 dcache是vipt noaliasing的。 l1 icache的类型vipt是从ctr读出来的。 l1 icache的vipt是否aliasing,是根据csid的大小的出来的,现在我的是numset*linesize= 8KB 大于pagesize,所以设置为vipt aliasing。为什么dcache不这样计算的? 假设也多个level的cache,对软件来说cache的inv,flush等操作是透明的吗?
http://nieyong.github.io/wiki_cpu/CPU%E4%BD%93%E7%B3%BB%E6%9E%B6%E6%9E%84-Cache.html
tree /sys/devices/system/cpu/cpu0/cache
http://igoro.com/archive/gallery-of-processor-cache-effects/