无线电爱好网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

无线电爱好网 首页 技术应用 单片机 查看内容

ARMv8 异常处理简介

2022-10-13 10:19| 发布者: 闪电| 查看: 10| 评论: 0

摘要: 内核稳定性问题复杂多样,最常见的莫过于“kernel panic”,意为“内核恐慌,不知所措”。这种情况下系统自然无法正常运转,只能自我结束生命,留下死亡信息。诸如:“Unable to handle kernel XXX at virtual addre ...


x0~x2分别对应do_mem_abort函数的三个参数:addr,esr,*regs。


(4)跳转至异常处理程序


do_mem_abort 函数位于/kernel/msm-4.19/arch/arm64/mm/fault.c


do_mem_abort首先根据esr寄存器获取data abort fault_info。在2.3.5章节介绍了ESR寄存器BIT[24:0]的ISS域,它记录了data abort的具体类型。这里将用到ISS域,也就是fault_info中的name变量。我们通常看到的“do_page_fault”、“do_translation_fault”等data abort下细分的调用栈就是由这里的ISS域区分而来。


fault_info结构体:


Fault_info[]数组:


fault_info 数组中对应的处理函数对当前的异常进一步处理,如果发现当前的data abort确实是属于非法,无法处理的,比如paging request 非法地址,就会抛出异常信息,并走到panic流程。


最后,调用arm64_notify_die,如果是用户空间发生data abort,输出异常信息和发送signal给当前进程。如果是异常发生在内核空间,走die流程。


die函数最终可能会调用到panic。但die函数也不是一定会走到panic,它先是走oops流程告警系统现在的异常,如果异常发生在中断上下文,走panic。或者如果设定了CONFIG_PANIC_ON_OOPS_VALUE=y,无论是否在中断上下文均走panic。


如果此次异常并没有走到panic流程,那么系统还是要继续运行,抛出oops警告后系统如何恢复异常发生前的环境?回到el1_da处理指令,do_mem_abort执行完如果不需要panic,跳转到kernel_exit进行异常退出处理。



4.kernel_exit


kernel_exit恢复现场。主要恢复kernel_entry保存在栈上的处理器相关寄存器等。至此发生在el1级别的data baort异常处理流程分析结束。



参考资料



[1]《DDI0487F_a_armv8_arm.pdf》


[2]《DEN0024A_v8_architecture_PG.pdf》

12345

路过

雷人

握手

鲜花

鸡蛋

QQ|关于本站|小黑屋|Archiver|手机版|无线电爱好网 ( 粤ICP备15040352号 ) 无线电爱好技术交流5 无线电爱好技术交流1无线电爱好技术交流9开关电源讨论群LED照明应用、电源无线电爱好技术交流4无线电爱好技术交流8无线电爱好技术交流10无线电爱好技术交流11

粤公网安备 44030702001224号

GMT+8, 2022-10-13 10:19 , Processed in 0.109201 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

返回顶部