armv8/armv7中SCTLR的区别
★★★ 友情鏈接 : 個人博客導(dǎo)讀首頁—點擊此處 ★★★
以SCTLR寄存器來闡述在armv7、armv8-arch64、armv8-arch64的使用方式
(其實大多數(shù)的系統(tǒng)寄存器,都是這種處理方式)
SCTLR是系統(tǒng)控制寄存器(SCTLR : system control registers)
在ARMV8上有如下sctlr寄存器
(aarch64)
SCTLR_EL1
SCTLR_EL2
SCTLR_EL3
(aarch32)
SCTLR (NS) – banked
HSCTLR
SCTLR (S) – banked
在ARMV8上有如下sctlr寄存器
SCTLR寄存器的位定義
SCTLR的使用方式
SCTLR是system control register,系統(tǒng)控制寄存器。如果跑了雙系統(tǒng)(linux,tee),那么在兩份系統(tǒng)中對于該寄存器會產(chǎn)生不同的配置的,如linux中enable mmu,tee中disable mmu, 這樣就導(dǎo)致在兩份系統(tǒng)中的SCTLR值不同.
那么我們看看ARM的設(shè)計
(1)、在armv7中,這些通用的系統(tǒng)寄存器是有兩組的,即根據(jù)SCR.NS比特位的不同,會自動訪問相應(yīng)的那一組寄存器。也就是說,你在linux中和在tee中讀寫的SCTLR是兩個不同的寄存器;
(2)、在armv8-arch64中,有SCTLR_EL1、SCTLR_EL2、SCTLR_EL3三個系統(tǒng)控制寄存器,這里我們只看SCTLR_EL1. 該寄存器只有一組,在雙系統(tǒng)切換時(linux,tee),會在ATF代碼中save/restore 該寄存器. 其實對于大多數(shù)通用的系統(tǒng)寄存器都是如此.
(3)、在armv8-arch32中,SCTLR_EL1的低32位map成了SCTLR,該寄存器也是只有一組,在雙系統(tǒng)切換時(linux,tee),也需在ATF代碼中save/restore 該寄存器
在armv8-arch64中,是以MRS/MSR來訪問SCR寄存器的,而在armv7/armv8-arch32中是以操作協(xié)處理器cp15來訪問的
例如:
(1)、armv8-arch64 enable MMU
(2)、armv8-arch32或armv7 enable MMU
ENTRY(__turn_mmu_on)mov r0, r0instr_syncmcr p15, 0, r0, c1, c0, 0 @ write control reg //操作協(xié)處理器,將r0寫入到sctlrmrc p15, 0, r3, c0, c0, 0 @ read id reginstr_syncmov r3, r3mov r3, r13ret r3 __turn_mmu_on_end: ENDPROC(__turn_mmu_on)總結(jié)
以上是生活随笔為你收集整理的armv8/armv7中SCTLR的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux kernel中local_i
- 下一篇: linux kernel变长数组使用示例