背景:
在uboot中,start.s中涉及到了 CP15 的有關操作。查閱有關資料,進行學習。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iYhZjMzQ2NhRmYhFTYmNjZ4ATZmljZ2UWNhJGNwMDO08CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB
mcr p15, 0, r0, c1, c0, 0
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iYhZjMzQ2NhRmYhFTYmNjZ4ATZmljZ2UWNhJGNwMDO08CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
在基于ARM的嵌入式系統中,存儲系統通常是通過系統控制協處理器CP15完成的。很多進階的寄存器并不能夠直接通路。
CP15可以包含16個32位的寄存器,其編号為0-15。
實際上對于某些編号的寄存器可能對應有多個實體寄存器。在指令中指定特定的标志位來區分這些實體寄存器。
有些類似于ARM寄存器中,處于不同的處理器模式時,ARM某些寄存器可能不同。
在這裡不對CP15各組寄存器做詳細的分析,僅提供查閱的手段。
MCR/MRC 用于系統存儲管理的協處理器CP15,指令格式:
MCR {cond} coproc,opcode1,Rd,CRn,CRm,opcode2
MRC {cond} coproc,opcode1,Rd,CRn,CRm,opcode2
*這2條指令僅适用于32位寄存器,因為64位寄存器僅由{CRm,opcode1}辨別。
<coproc> 指令操作的協處理器名,标準名為pn,n,為0~15
<opcode1> 協處理器的特定操作碼,對于CP15寄存器來說,opcode1永遠為0,不為0時,操作結果不可預知
<Rd> 作為元寄存器的ARM寄存器。其值被讀寫到得協處理器寄存器中。
<Rd>不能為PC, 當其為PC時。指令操作結果不可預知。
<CRn> 存放第1個操作數的協處理器寄存器。
<CRm> 存放第2個操作數的協處理器寄存器。 (用來區分同一個編号的不同實體寄存器,當不需要提供附加資訊時,指定為C0)
<opcode2> 可選的協處理器特定操作碼。 (用來區分同一個編号的不同實體寄存器,當不需要提供附加資訊時,指定為0)
在明白了指令格式以後,我們記住了查閱有關的文檔:《DDI0406C arm_architecture_reference_manual.pdf》。
找到了對應的寄存器,STCLR
結合文章開頭中間那幾行語句,發現這段代碼是對于STCLR不同的位進行置位/清零。
是以,整段代碼做了這樣的事情:
1. 讀取 SCTLR 的值到 R0
2. 修改 對應的位
3. 寫回 SCTLR
* 注意: 在操作CP15 有關寄存器時,可能要求權限等級在PL1
文章完。
這個時代不會阻止你自己閃耀,但你也覆寫不了任何人的光輝。而學習的本質是一個不斷抄襲、模仿、練習、了解再創新的過程。即使知道無法超越的同主題博文,本人還會繼續堅持學習,不斷探索;總結是本能,分享是愛好。
希望本人的部落格對于大家有幫助,想聽鼓勵,更想聽批評。由于人固有能力的永久局限性,文中可能存在描述不正确,歡迎指正、補充!
若在頁首無特别聲明,本篇文章由 Schips 經過整理後釋出。
部落格位址:https://www.cnblogs.com/schips/