免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3502 | 回复: 3

[硬件及驱动] arm-v7 cache 类型怎样判断的 [复制链接]

论坛徽章:
0
发表于 2013-01-25 11:33 |显示全部楼层
本帖最后由 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等操作是透明的吗?

论坛徽章:
0
发表于 2013-01-26 10:43 |显示全部楼层

论坛徽章:
0
发表于 2013-01-26 18:53 |显示全部楼层
估計因為dcache是hardware做掉,可以參考arch/arm/include/asm/cachetype.h
/*
* __LINUX_ARM_ARCH__ is the minimum supported CPU architecture
* Mask out support which will never be present on newer CPUs.
* - v6+ is never VIVT
* - v7+ VIPT never aliases on D-side
*/
所以儘管這邊dcache和icache一樣一個way也是8k,但是在v7以後已經不會需要軟體處理aliasing的問題。
有興趣可以一同討論,我最近主要在研究big.LITTLE和arm virtualization extension的virtual gic相關的部分。以前曾經待過台灣自主設計的cpu架構公司。在freenode上面的##arm, ##kernel, #armlinux上面的代號是gavinguo

论坛徽章:
0
发表于 2013-01-26 20:43 |显示全部楼层
回复 3# bboygzy


    原来是宝岛友人啊,厉害。arm我接触的比较菜,以后还请多多指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP