标签:失败 pthread 存在 pre end tin 上下文 函数接口 通过
异常管理SylixOS提供了一种平台无关的异常管理方法。当系统产生了写时拷贝、缺页等MMU访问失效异常或其他种类异常时,SylixOS会在异常中构建异常处理线程执行陷阱,在异常退出后的任务上下文中进行异常处理,完成所有的页面操作,如果操作失败线程将自我销毁。当为缺页中断等一般异常时,陷阱执行完毕后,系统将回到刚刚访问内存并产生异常的那条指令。其函数接口如下所示。
LW_API
VOID API_VmmAbortIsr (addr_t ulRetAddr,
addr_t ulAbortAddr,
PLW_VMM_ABORT pabtInfo,
PLW_CLASS_TCB ptcb);
函数API_VmmAbortIsr原型分析:
FPU、DSP上下文保存。
其中缺页处理陷阱外壳的建立是通过修改异常上下文的任务入口、入口参数以及堆栈起点实现的,如下所示。陷阱程序的入口函数为__vmmAbortShell,异常消息作为函数参数,堆栈直接使用任务的线程堆栈,而异常消息也保存在该堆栈中(API_VmmAbortIsr函数执行时使用的是CPU的中断堆栈)。
#if LW_CFG_VMM_EN > 0
pstkFailShell = archTaskCtxCreate(&ptcb->TCB_archRegCtx,
(PTHREAD_START_ROUTINE)__vmmAbortShell,
(PVOID)pvmpagefailctx,
(PLW_STACK)pucStkNow,
0); /* 建立缺页处理陷阱外壳环境 */
#else
pstkFailShell = archTaskCtxCreate(&ptcb->TCB_archRegCtx,
(PTHREAD_START_ROUTINE)__vmmAbortAccess,
(PVOID)pvmpagefailctx,
(PLW_STACK)pucStkNow,
0); /* 建立访问异常陷阱外壳环境 */
#endif
由于产生缺页中断时,相关线程一定是就绪的,所以不需要进行调度器处理。当异常返回后,被修改的任务上下文将被直接恢复到CPU中,也就是说此时的CPU将直接运行陷阱函数。当陷阱函数执行完之后,并不是普通的函数返回,而是直接从之前保存在错误消息中的任务上下文返回,如下所示。此时系统将回到刚刚访问内存产生异常的那条指令开始执行。
__KERNEL_SPACE_SET(pvmpagefailctx->PAGEFCTX_iKernelSpace);
/* 恢复成进入之前的状态 */
errno = pvmpagefailctx->PAGEFCTX_iLastErrno; /* 恢复之前的 errno */
iregInterLevel = KN_INT_DISABLE(); /* 关闭当前 CPU 中断 */
KN_SMP_MB();
archSigCtxLoad(&pvmpagefailctx->PAGEFCTX_archRegCtx);
/* 从 page fail 上下文中返回 */
KN_INT_ENABLE(iregInterLevel);
陷阱程序的具体执行过程将在后续介绍。
标签:失败 pthread 存在 pre end tin 上下文 函数接口 通过
原文地址:http://blog.51cto.com/12557713/2178715