這次學習一下高速緩存icache的功能的開關。
首先鞏固一下這個mrc指令
MRC 指令的格式爲:
MRC{<cond>}(條件)協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操作碼2。
如 mrc p15 , 0 , r0 , c1 , c0 , 0 ;
<cond>爲指令執行的條件碼,忽略則視爲無條件執行,該指令的作用是將 cp15 的寄存器c1,c0中的數據傳送到 ARM 處理器寄存器r0中,如果協處理器不能成功地執行該操作,將產生未定義的指令異常中斷。源寄存器1,2:存放第1個和第2個操作數的協處理器寄存器。協處理器操作碼2:可選的協處理器特定操作碼,用來區分同一個編號的不同物理寄存器,當不需要提供附加信息時,指定爲0。
cp15是用於系統存儲管理的協處理器,對於CP15寄存器來說協處理器操作碼1永遠爲0,否則結果不可預知。
cp15中的C1寄存器存放了高速緩存的控制功能,所以我們要通過寫這個協處理器寄存器裏面的位,來啓用icache高速緩存。
C1寄存器的各個位說明以及應用:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16~31
M A C W P D L B S R F Z I V RR L4 SBZP/UNP
各個位的作用和含義:
M:禁止/使能MMU或者MPU(0:禁止MMU或者MPU,1:使能MMU或者MPU)(如果系統中沒有MMU或者MPU,讀取時該位返回0,寫入時忽略)
A:對於可以選擇是否支持內存訪問時地址對齊檢查的系統,本位禁止/使能地址對齊檢查功能(0:禁止地址對齊檢查功能,1:使能地址對齊檢查功能)(對寄存器進行寫操作時,忽略該位)
C: 當數據Cache和指令Cache分開時,本控制位禁止/使能數據Cache。當數據Cache和指令Cache統一時,該控制位禁止/使能整個Cache.(0:禁止Cache, 1:使能Cache)
W:禁止/使能寫緩存(0:禁止寫緩存,1:使能寫緩存)
P:對於向前兼容26位ARM處理器,本控制位控制PRGC32控制信號(0:異常中斷處理程序進入32位地址模式,1:異常中斷處理程序進入26位地址模式)
D:對於向前兼容26位ARM處理器,本控制位控制DATA32控制信號(0:禁止26位地址異常檢查,1:使能26位地址異常檢測)
L:對於ARMv3及以前版本,本控制位可以控制處理器的中止模式(0:選擇早期中止模式,1:選擇後期中止模式)
B: 對於存儲系統同時支持大/小端(big-endian/little-endian)的ARM處理器,該控制位配置系統使用哪種內存模式
S:支持MMU的存儲系統中,本控制位用作系統保護
R:支持MMU的存儲系統中,本控制位用作ROM保護
F:本控制位由生產廠商定義
Z:對於支持跳轉預測的ARM系統,本控制位禁止/使能跳轉預測功能(0:禁止跳轉預測功能,1:使能跳轉預測功能)
I:當數據Cache和指令Cache是分開的,本控制位禁止/使能指令Cache(0:禁止指令Cache ,1:使能指令Cache)
我們要寫它的第I位,也就是第bit12位
bic指令的用法:bic是位清除的指令,把操作數中爲1的位對應位置的數(寄存器中)變爲0,然後再放到那個寄存器裏去。
比如 bic r0 ,r0 ,0xF0000000 意思就是把r0高四位的值清零,然後再放回r0寄存器中。
orr指令則相反,把操作數中爲1的位對應位置的數(寄存器中)變爲1,然後再放到那個寄存器裏去。
//下面就是開/關icache的彙編程序
mrc p15,0,r0,c1,c0,0;
//bic r0, r0, #(1<<12)// bit12 置0 表示關上icache
orr r0, r0, #(1<<12)// bit12 置1 表示開啓icache
mcr p15,0,r0,c1,c0,0;