您好,登錄后才能下訂單哦!
這次學(xué)習(xí)一下高速緩存icache的功能的開(kāi)關(guān)。
首先鞏固一下這個(gè)mrc指令
MRC 指令的格式為:
MRC{<cond>}(條件)協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2。
如 mrc p15 , 0 , r0 , c1 , c0 , 0 ;
<cond>為指令執(zhí)行的條件碼,忽略則視為無(wú)條件執(zhí)行,該指令的作用是將 cp15 的寄存器c1,c0中的數(shù)據(jù)傳送到 ARM 處理器寄存器r0中,如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。源寄存器1,2:存放第1個(gè)和第2個(gè)操作數(shù)的協(xié)處理器寄存器。協(xié)處理器操作碼2:可選的協(xié)處理器特定操作碼,用來(lái)區(qū)分同一個(gè)編號(hào)的不同物理寄存器,當(dāng)不需要提供附加信息時(shí),指定為0。
cp15是用于系統(tǒng)存儲(chǔ)管理的協(xié)處理器,對(duì)于CP15寄存器來(lái)說(shuō)協(xié)處理器操作碼1永遠(yuǎn)為0,否則結(jié)果不可預(yù)知。
cp15中的C1寄存器存放了高速緩存的控制功能,所以我們要通過(guò)寫(xiě)這個(gè)協(xié)處理器寄存器里面的位,來(lái)啟用icache高速緩存。
C1寄存器的各個(gè)位說(shuō)明以及應(yīng)用:
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
各個(gè)位的作用和含義:
M:禁止/使能MMU或者M(jìn)PU(0:禁止MMU或者M(jìn)PU,1:使能MMU或者M(jìn)PU)(如果系統(tǒng)中沒(méi)有MMU或者M(jìn)PU,讀取時(shí)該位返回0,寫(xiě)入時(shí)忽略)
A:對(duì)于可以選擇是否支持內(nèi)存訪問(wèn)時(shí)地址對(duì)齊檢查的系統(tǒng),本位禁止/使能地址對(duì)齊檢查功能(0:禁止地址對(duì)齊檢查功能,1:使能地址對(duì)齊檢查功能)(對(duì)寄存器進(jìn)行寫(xiě)操作時(shí),忽略該位)
C: 當(dāng)數(shù)據(jù)Cache和指令Cache分開(kāi)時(shí),本控制位禁止/使能數(shù)據(jù)Cache。當(dāng)數(shù)據(jù)Cache和指令Cache統(tǒng)一時(shí),該控制位禁止/使能整個(gè)Cache.(0:禁止Cache, 1:使能Cache)
W:禁止/使能寫(xiě)緩存(0:禁止寫(xiě)緩存,1:使能寫(xiě)緩存)
P:對(duì)于向前兼容26位ARM處理器,本控制位控制PRGC32控制信號(hào)(0:異常中斷處理程序進(jìn)入32位地址模式,1:異常中斷處理程序進(jìn)入26位地址模式)
D:對(duì)于向前兼容26位ARM處理器,本控制位控制DATA32控制信號(hào)(0:禁止26位地址異常檢查,1:使能26位地址異常檢測(cè))
L:對(duì)于ARMv3及以前版本,本控制位可以控制處理器的中止模式(0:選擇早期中止模式,1:選擇后期中止模式)
B: 對(duì)于存儲(chǔ)系統(tǒng)同時(shí)支持大/小端(big-endian/little-endian)的ARM處理器,該控制位配置系統(tǒng)使用哪種內(nèi)存模式
S:支持MMU的存儲(chǔ)系統(tǒng)中,本控制位用作系統(tǒng)保護(hù)
R:支持MMU的存儲(chǔ)系統(tǒng)中,本控制位用作ROM保護(hù)
F:本控制位由生產(chǎn)廠商定義
Z:對(duì)于支持跳轉(zhuǎn)預(yù)測(cè)的ARM系統(tǒng),本控制位禁止/使能跳轉(zhuǎn)預(yù)測(cè)功能(0:禁止跳轉(zhuǎn)預(yù)測(cè)功能,1:使能跳轉(zhuǎn)預(yù)測(cè)功能)
I:當(dāng)數(shù)據(jù)Cache和指令Cache是分開(kāi)的,本控制位禁止/使能指令Cache(0:禁止指令Cache ,1:使能指令Cache)
我們要寫(xiě)它的第I位,也就是第bit12位
bic指令的用法:bic是位清除的指令,把操作數(shù)中為1的位對(duì)應(yīng)位置的數(shù)(寄存器中)變?yōu)?,然后再放到那個(gè)寄存器里去。
比如 bic r0 ,r0 ,0xF0000000 意思就是把r0高四位的值清零,然后再放回r0寄存器中。
orr指令則相反,把操作數(shù)中為1的位對(duì)應(yīng)位置的數(shù)(寄存器中)變?yōu)?,然后再放到那個(gè)寄存器里去。
//下面就是開(kāi)/關(guān)icache的匯編程序
mrc p15,0,r0,c1,c0,0;
//bic r0, r0, #(1<<12)// bit12 置0 表示關(guān)上icache
orr r0, r0, #(1<<12)// bit12 置1 表示開(kāi)啟icache
mcr p15,0,r0,c1,c0,0;
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。