- 论坛徽章:
- 0
|
本帖最后由 blake326 于 2013-01-25 11:35 编辑
MRC p15,0,<Rt>,c0,c0,1 ; Read CP15 Cache Type Register
这个寄存器,L1IP 表示cache类型,我的是vipt
MRC p15,1,<Rt>,c0,c0,1 ; Read CP15 Cache Level ID Register
表示当前cache一共有几级,以及每级level的配置,我的是1级cache,并且是单独的icache和dcache
MRC p15,2,<Rt>,c0,c0,0 ; Read Cache Size Selection Register
可以设置icache或者dcache,以及cache level
MRC p15,1,<Rt>,c0,c0,0 ; Read current CP15 Cache Size ID Register
根据cssr当前的配置(比如L1 dcache),读出相应的numsets, linesize, associativity,我的是256 sets* (8word*4byte) * 4way=32KB, (L1 icache也是这样的32K)
问题是:
如何知道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等操作是透明的吗? |
|