一、什么是Cache
Cache是一種容量比較小,但訪問速度比較快存儲器。由于處理器的速度遠高于主存,處理器直接從內存中存取數據要等待一定周期,而Cache位于處理器與主存之間,保存著近一段時間處理器涉及到的主存塊內容。在需要讀取數據是,處理器可能就會從Cache中讀取需要的數據,而不是從主存中獲取數據,這樣就提高了系統的運行效率。
二、ARM處理器的Cache
ARM處理器支持Cache機制,并將Cache分開為I-Cache(指令緩存)和D-Cache(數據緩存)。系統剛上電時,I-Cacche中的內容是無效的,并且I-Cacche的功能也是關閉的,CP15協處理器的SCTLR寄存器(系統控制寄存器)的bit[12]控制I-Cache的打開和關閉。I-Cache關閉時,CPU每次取指令都要讀主存,所以性能比較低。因此應該盡快打開I-Cache。同樣,系統剛上電時, D-Cache中的內容是無效的,并且D-Cache的功能也是關閉的,SCTLR寄存器的bit[2]控制D-Cache的打開和關閉。因為D-Cache必須在開啟MMU(內存管理單元)后才能使能,而本程序并不打算開啟MMU,所以這里我們不是能D-Cache,只研究I-Cache。
三、Cache測試
我們使用Exynos4412處理器開發板,該處理器采用32nm制程,擁有四枚主頻可達1.4 GHz的Cortex-A9通用處理核心,擁有32 KB I- Cache和32 KB D- Cache,1 MB L2 Cache。以下是I-Cache的測試代碼,如下:
.section .text
.globl _start
_start:
ldr r0, =WTCON
mov r1, #0
str r1, [r0]
mrc p15, 0, r0, c1, c0, 0
/* orr r0, r0, #0x1000 @Enable ICache */
bic r0, r0, #0x1000 @Disable ICache
mcr p15, 0, r0, c1, c0, 0
ldr r0, =GPF3CON
ldr r1, =0x10000
str r1, [r0]
led_flash:
ldr r0, =GPF3DAT
mov r1, #0x10
str r1, [r0]
bl delay
mov r1, #0x0
str r1, [r0]
bl delay
bled_flash
delay:
cmp r0, #0
subne r0, r0, #1
bne delay
.end
將該程序放到Exynos4412開發板上測試,先使能I-Cache,再關閉I-Cache,觀察LED燈閃爍的頻率變化。我們能夠發現,使能I-Cache燈的閃爍頻率比較高,關閉I-Cache閃爍頻率低,這說明處理器執行過的指令被I-Cache緩存,當處理器再一次執行該指令時,處理器只需要從Cache中取出需要的指令,而不再需要訪問主存儲器,不必等待一段時間,從而提高了系統的效率。