ARM Linux中的cache (1)

这篇博客深入探讨了ARM32和ARM64架构下,如何执行flush cache操作。在Arm32中,通过`flush_cache_all`和`v7_flush_dcache_all`函数来清除缓存,涉及到CLIDR寄存器和多级循环以遍历不同级别的缓存。而在Arm64中,使用类似的机制,但函数`__flush_dcache_all`在Linux 4.2之后被删除,取而代之的是使用`msr`、`mrs`和`dc`指令进行缓存清理。
摘要由CSDN通过智能技术生成

Arm32 flush cache函数

函数:flush_cache_all

定义:

#define flush_cache_all()                   __cpuc_flush_kern_all()

 

从sharkl3的32 bit的System.map文件看,此函数最终对应的是下面的函数

v7_flush_kern_cache_all

ENTRY(v7_flush_kern_cache_all)

 ARM(       stmfd         sp!, {r4-r5, r7, r9-r11, lr}       )

 THUMB(  stmfd         sp!, {r4-r7, r9-r11, lr}   )

         bl      v7_flush_dcache_all

         mov  r0, #0

         ALT_SMP(mcr     p15, 0, r0, c7, c1, 0)     @ invalidate I-cache inner shareable

         ALT_UP(mcr        p15, 0, r0, c7, c5, 0)     @ I+BTB cache invalidate

 ARM(       ldmfd         sp!, {r4-r5, r7, r9-r11, lr}       )

 THUMB(  ldmfd         sp!, {r4-r7, r9-r11, lr}   )

         ret     lr

ENDPROC(v7_flush_kern_cache_all)

其实从config中的CONFIG_CPU_CACHE_V7=y也可以看出。

 

v7_flush_dcache_all

ENTRY(v7_flush_dcache_all)

         dmb                                       @ ensure ordering with previous memory accesses

         mrc   p15, 1, r0, c0, c0, 1                @ read clidr

CLIDR寄存器介绍  读出来的值是0xc3000123 说明sharkl3中包含L1L2L3三级cache

ICB, [31:30]

0b10 L2 cache is the highest inner level.

0b11 L3 cache is the highest inner level.

LoC, [26:24]

0b010 L3 cache is not implemented.

0b011 L2 and L3 cache are implemented.

这个寄存器的值仅表明集成到core的cache,不包括外挂cache的信息。

         mov  r3, r0, lsr #23                         @ move LoC into position

         ands  r3, r3, #7 << 1                        @ extract LoC*2 from clidr   r3cache_level的个数

         beq   finished                        @ if loc is 0, then no need to clean

start_flush_levels:</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值