ARMV8 datasheet学习笔记5:异常模型
1.前言
?
2.異常類型描述
見?ARMV8 datasheet學習筆記4:AArch64系統級體系結構之編程模型(1)-EL/ET/ST?一文
?
3. 異常處理路由對比
AArch32、AArch64架構下IRQ?和Data Abort?異常處理流程圖對比.
?3.1?IRQ 路由
3.1.1.?? AArch32?IRQ 路由
圖 AArch32 IRQ 路由
?
?
?
3.1.2.?? ?AArch64?IRQ 路由
圖 AArch64 IRQ路由
?
?
圖 AArch64 IRQ向量查找
3.2.??? ?Data Abort 路由
3.2.1.?? ?AArch32?Data Abort 路由
?
?
?
3.2.2.?? ?AArch64 Data Abort 路由
?
4. 源代碼異常入口
4.1 ? ? C函數入口
| ?異常類型 | AArch32 State | AArch64 State | ||
| 所在文件 | C?函數 | 所在文件 | C?函數 | |
| Und | arm/kernel/traps.c | do_undefinstr | Arm64/kernel/traps.c | do_undefinstr |
| Data Abort | arm/mm/fault.c | do_DataAbort | arm64/mm/fault.c | do_mem_abort |
| IRQ | arm/kernel/irq.c | asm_do_IRQ | arm64/kernel/irq.c | handle_IRQ |
| FIQ | ? | ? | ? | ? |
| System Call | ? | ? | ? | ? |
?
4.2 ? ?上報流程圖
例舉Data Abort?和?IRQ中斷的入口流程圖
- Data Abort?上報
??
- IRQ上報
?
4.3.??? 異常進入壓棧準備
分析64位kernel_entry?壓棧代碼邏輯(代碼路徑:kernel/arch/arm64/kernel/entry.S)
| 壓棧準備 | 說明 |
| ??sp指向?#S_LR?–?#S_FRAME_SIZE?位置 | #S_FRAME_SIZE是pt_regs結構圖的size |
| ??依次把x28-x29?…?x0-x1?成對壓入棧內 | 每壓入一對寄存器,sp指針就移動?-16 =((64/8)*2)字節長度,棧是向地址減少方向增長的. |
| ??保存sp+#S_FRAME_SIZE數據到x21 | add x21, sp, #SP_FRAME_SIZE |
| ??保存elr_el1到x22 | mrs x22, elr_el1 |
| ??保存spsr_el1到x23 | mrs x23, spsr_el1 |
| ??把lr、x21寫入sp+#S_LR地址內存 | 保存lr和x21的數據到指定棧內存位置 |
| ??把x22、x23寫入sp+#S_PC地址內存 | 保存elr,spsr數據到指定棧內存位置 |
?
4.4.??? ?棧布局
?
5. 參考文檔
[1]?DDI0487A_k_armv8_arm_iss10775.pdf
?
轉載于:https://www.cnblogs.com/smartjourneys/p/6848204.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的ARMV8 datasheet学习笔记5:异常模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle--第一天PLSQL--ba
- 下一篇: Mariadb使用总结