[architecture]-ARMv8/armv7/linux的栈/sp的学习和总结
生活随笔
收集整理的這篇文章主要介紹了
[architecture]-ARMv8/armv7/linux的栈/sp的学习和总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
文章目錄
- 1、ARMV8 ARMV7的SP寄存器的介紹
- (1)、ARMV7-aarch32的SP寄存器
- (2)、ARMV8-aarch32的SP寄存器
- (3)、ARMV8-aarch64的SP寄存器
- 2、ARMV8 ARMV7的SP寄存器的使用舉例
- (1)、aarch32狀態下讀寫SP的示例
- (2)、aarch64狀態下讀寫SP的示例
1、ARMV8 ARMV7的SP寄存器的介紹
(1)、ARMV7-aarch32的SP寄存器
在ARMV8-aarch32的狀態下,有以下SP寄存器
- sp
- sp_usr
- sp_svc
- sp_abt
- sp_und
- sp_irq
- sp_fiq
- sp_mon
- sp_hyp
注意:在armv7上,arm有七種模式:user、system、supervisor、abort、undefined、irq、fiq, 再加兩個擴展模式:hyp、monitor
(2)、ARMV8-aarch32的SP寄存器
ASRMV8為了與armv7兼容,在ARMV8-aarch32的狀態下,SP寄存器同armv7的一致
- sp
- sp_usr
- sp_svc
- sp_abt
- sp_und
- sp_irq
- sp_fiq
- sp_mon
- sp_hyp
其實armv8的aarch32的這些寄存器,map到了Xx通用寄存器上:
(3)、ARMV8-aarch64的SP寄存器
在ARMV8-aarch64的狀態下,有以下SP寄存器
- SP_EL0 //當PSTATE.SP=0(SPSel.SP == 0),高的級別訪問的sp就是sp_el0
- SP_EL1 //在EL1級別下使用
- SP_EL2 //在EL2級別下使用
- SP_EL3 //在EL3級別下使用
2、ARMV8 ARMV7的SP寄存器的使用舉例
(1)、aarch32狀態下讀寫SP的示例
(1) FUNC thread_set_abt_sp , : UNWIND( .fnstart) UNWIND( .cantunwind)mrs r1, cpsrcps #CPSR_MODE_ABT //-------------切換到abt模式mov sp, r0 //-------------此時操作的sp就是sp_abtmsr cpsr, r1bx lr UNWIND( .fnend) END_FUNC thread_set_abt_sp(2) FUNC thread_set_und_sp , : UNWIND( .fnstart) UNWIND( .cantunwind)mrs r1, cpsrcps #CPSR_MODE_UND //-------------切換到und模式mov sp, r0 //-------------此時操作的sp就是sp_abtmsr cpsr, r1bx lr UNWIND( .fnend) END_FUNC thread_set_und_sp(3) FUNC thread_set_irq_sp , : UNWIND( .fnstart) UNWIND( .cantunwind)mrs r1, cpsrcps #CPSR_MODE_IRQ //-------------切換到irq模式mov sp, r0 //-------------此時操作的sp就是sp_abtmsr cpsr, r1bx lr UNWIND( .fnend) END_FUNC thread_set_irq_sp(4) FUNC thread_set_fiq_sp , : UNWIND( .fnstart) UNWIND( .cantunwind)mrs r1, cpsrcps #CPSR_MODE_FIQ //-------------切換到fiq模式mov sp, r0 //-------------此時操作的sp就是sp_abtmsr cpsr, r1bx lr UNWIND( .fnend) END_FUNC thread_set_fiq_sp......(2)、aarch64狀態下讀寫SP的示例
/* The handler of native interrupt. */ .macro native_intr_handler mode:req ....... // 進入中斷異常后,默認的SP就是SP_EL1msr spsel, #0 // 在這里,將SP切換成SP_EL0mov sp, x1 .......adr x16, thread_nintr_handler_ptr // 真正的中斷處理函數,使用的是SP_EL0 ......./* Switch back to SP_EL1 */msr spsel, #1 // 退出中斷之前,再將SP切換成SP_EL1/* Update core local flags */ldr w0, [sp, #THREAD_CORE_LOCAL_FLAGS]lsr w0, w0, #THREAD_CLF_SAVED_SHIFTstr w0, [sp, #THREAD_CORE_LOCAL_FLAGS] .......eret 1: b eret_to_el0 .endm總結
以上是生活随笔為你收集整理的[architecture]-ARMv8/armv7/linux的栈/sp的学习和总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android init.rc执行顺序
- 下一篇: [register]-ARMV8-aar