|
VOID | OsExcHook (UINT32 excType, ExcContext *excBufAddr, UINT32 far, UINT32 fsr) |
| 由注册后回调,发送异常情况下会回调这里执行,见于 OsUndefIncExcHandleEntry, OsExcHandleEntry ==函数 更多...
|
|
STATIC | SPIN_LOCK_INIT (g_excSerializerSpin) |
|
UINT32 | OsGetSystemStatus (VOID) |
| 获取系统状态 更多...
|
|
STATIC INT32 | OsDecodeFS (UINT32 bitsFS) |
|
STATIC INT32 | OsDecodeInstructionFSR (UINT32 regIFSR) |
|
STATIC INT32 | OsDecodeDataFSR (UINT32 regDFSR) |
|
UINT32 | OsArmSharedPageFault (UINT32 excType, ExcContext *frame, UINT32 far, UINT32 fsr) |
| 共享页缺失异常 更多...
|
|
STATIC VOID | OsExcType (UINT32 excType, ExcContext *excBufAddr, UINT32 far, UINT32 fsr) |
| 异常类型 更多...
|
|
STATIC VADDR_T | OsGetTextRegionBase (LosVmMapRegion *region, LosProcessCB *runProcess) |
|
STATIC VOID | OsExcSysInfo (UINT32 excType, const ExcContext *excBufAddr) |
| 打印异常系统信息 更多...
|
|
STATIC VOID | OsExcRegsInfo (const ExcContext *excBufAddr) |
| 异常情况下打印各寄存器的信息 更多...
|
|
LITE_OS_SEC_TEXT_INIT UINT32 | LOS_ExcRegHook (EXC_PROC_FUNC excHook) |
| 注册异常处理钩子 更多...
|
|
EXC_PROC_FUNC | OsExcRegHookGet (VOID) |
| 获取hook函数 更多...
|
|
STATIC VOID | OsDumpExcVaddrRegion (LosVmSpace *space, LosVmMapRegion *region) |
| dump 虚拟空间下异常虚拟地址线性区 更多...
|
|
STATIC VOID | OsDumpProcessUsedMemRegion (LosProcessCB *runProcess, LosVmSpace *runspace, UINT16 vmmFlags) |
| dump 进程使用的内存线性区 更多...
|
|
STATIC VOID | OsDumpProcessUsedMemNode (UINT16 vmmFlags) |
| dump 进程使用的内存节点 更多...
|
|
VOID | OsDumpContextMem (const ExcContext *excBufAddr) |
| dump 上下文内存,注意内核异常不能简单的映射理解为应用的异常,异常对内核来说是一个很常见操作,
比如任务的切换对内核来说就是一个异常处理 更多...
|
|
STATIC VOID | OsExcRestore (VOID) |
| 异常恢复,继续执行 更多...
|
|
STATIC VOID | OsUserExcHandle (ExcContext *excBufAddr) |
| 用户态异常处理函数 更多...
|
|
STATIC INLINE BOOL | IsValidFP (UINTPTR regFP, UINTPTR start, UINTPTR end, vaddr_t *vaddr) |
| 此函数用于验证fp或验证检查开始和结束范围 更多...
|
|
STATIC INLINE BOOL | FindSuitableStack (UINTPTR regFP, UINTPTR *start, UINTPTR *end, vaddr_t *vaddr) |
| 找到一个合适的栈 更多...
|
|
BOOL | OsGetUsrIpInfo (UINTPTR ip, IpInfo *info) |
|
UINT32 | BackTraceGet (UINTPTR regFP, IpInfo *callChain, UINT32 maxDepth) |
|
VOID | BackTraceSub (UINTPTR regFP) |
|
VOID | BackTrace (UINT32 regFP) |
| 打印调用栈信息 更多...
|
|
VOID | OsExcInit (VOID) |
| 异常接管模块的初始化 更多...
|
|
VOID | OsCallStackInfo (VOID) |
| 打印调用栈信息 更多...
|
|
VOID | OsTaskBackTrace (UINT32 taskID) |
| Kernel task backtrace function. 更多...
|
|
VOID | OsBackTrace (VOID) |
| Kernel backtrace function. 更多...
|
|
VOID | OsUndefIncExcHandleEntry (ExcContext *excBufAddr) |
| 未定义的异常处理函数,由汇编调用 见于 los_hw_exc.s 更多...
|
|
VOID | OsPrefetchAbortExcHandleEntry (ExcContext *excBufAddr) |
| 预取指令异常处理函数,由汇编调用 见于 los_hw_exc.s 更多...
|
|
VOID | OsDataAbortExcHandleEntry (ExcContext *excBufAddr) |
| 数据中止异常处理函数,由汇编调用 见于 los_hw_exc.s 更多...
|
|
STATIC VOID | WaitAllCpuStop (UINT32 cpuid) |
| 等待所有CPU停止 更多...
|
|
STATIC VOID | OsWaitOtherCoresHandleExcEnd (UINT32 currCpuid) |
|
STATIC VOID | OsCheckAllCpuStatus (VOID) |
| 检查所有CPU的状态 更多...
|
|
STATIC VOID | OsCheckCpuStatus (VOID) |
|
LITE_OS_SEC_TEXT VOID STATIC | OsExcPriorDisposal (ExcContext *excBufAddr) |
| 执行期间的优先处理 excBufAddr为CPU异常上下文, 更多...
|
|
LITE_OS_SEC_TEXT_INIT STATIC VOID | OsPrintExcHead (UINT32 far) |
| 异常信息头部打印 更多...
|
|
STATIC VOID | OsSysStateSave (UINT32 *intCount, UINT32 *lockCount) |
|
STATIC VOID | OsSysStateRestore (UINT32 intCount, UINT32 lockCount) |
|
LITE_OS_SEC_TEXT_INIT VOID | OsExcHandleEntry (UINT32 excType, ExcContext *excBufAddr, UINT32 far, UINT32 fsr) |
|
| __attribute__ ((noinline)) |
| 可变参数,输出到控制台 更多...
|
|
VOID | __stack_chk_fail (VOID) |
|
VOID | LOS_RecordLR (UINTPTR *LR, UINT32 LRSize, UINT32 recordCount, UINT32 jumpCount) |
| record LR function. 更多...
|
|
异常接管主文件
基本概念
异常接管是操作系统对运行期间发生的异常情况(芯片硬件异常)进行处理的一系列动作,
例如打印异常发生时当前函数的调用栈信息、CPU现场信息、任务的堆栈情况等。
异常接管作为一种调测手段,可以在系统发生异常时给用户提供有用的异常信息,譬如异常类型、
发生异常时的系统状态等,方便用户定位分析问题。
异常接管,在系统发生异常时的处理动作为:显示异常发生时正在运行的任务信息
(包括任务名、任务号、堆栈大小等),以及CPU现场等信息。
运作机制
每个函数都有自己的栈空间,称为栈帧。调用函数时,会创建子函数的栈帧,
同时将函数入参、局部变量、寄存器入栈。栈帧从高地址向低地址生长。
以ARM32 CPU架构为例,每个栈帧中都会保存PC、LR、SP和FP寄存器的历史值。
ARM处理器中的R13被用作SP
堆栈分析
LR寄存器(Link Register),链接寄存器,指向函数的返回地址。
R11:可以用作通用寄存器,在开启特定编译选项时可以用作帧指针寄存器FP,用来实现栈回溯功能。
GNU编译器(gcc)默认将R11作为存储变量的通用寄存器,因而默认情况下无法使用FP的栈回溯功能。
为支持调用栈解析功能,需要在编译参数中添加-fno-omit-frame-pointer选项,提示编译器将R11作为FP使用。
FP寄存器(Frame Point),帧指针寄存器,指向当前函数的父函数的栈帧起始地址。利用该寄存器可以得到父函数的栈帧,
从栈帧中获取父函数的FP,就可以得到祖父函数的栈帧,以此类推,可以追溯程序调用栈,得到函数间的调用关系。
当系统发生异常时,系统打印异常函数的栈帧中保存的寄存器内容,以及父函数、祖父函数的
栈帧中的LR、FP寄存器内容,用户就可以据此追溯函数间的调用关系,定位异常原因。
异常接管对系统运行期间发生的芯片硬件异常进行处理,不同芯片的异常类型存在差异,具体异常类型可以查看芯片手册。
异常接管一般的定位步骤如下:
打开编译后生成的镜像反汇编(asm)文件。
搜索PC指针(指向当前正在执行的指令)在asm中的位置,找到发生异常的函数。
根据LR值查找异常函数的父函数。
重复步骤3,得到函数间的调用关系,找到异常原因。
注意事项
要查看调用栈信息,必须添加编译选项宏-fno-omit-frame-pointer支持stack frame,否则编译时FP寄存器是关闭的。
参考
http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/%E7%94%A8%E6%88%B7%E6%80%81%E5%BC%82%E5%B8%B8%E4%BF%A1%E6%81%AF%E8%AF%B4%E6%98%8E.html
- 版本
- 作者
- weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
- 日期
- 2021-11-20
在文件 los_exc.c 中定义.