SylixOS异常管理

异常管理

SylixOS提供了一种平台无关的异常管理方法。当系统产生了写时拷贝、缺页等MMU访问失效异常或其他种类异常时,SylixOS会在异常中构建异常处理线程执行陷阱,在异常退出后的任务上下文中进行异常处理,完成所有的页面操作,如果操作失败线程将自我销毁。当为缺页中断等一般异常时,陷阱执行完毕后,系统将回到刚刚访问内存并产生异常的那条指令。其函数接口如下所示。

LW_API 
VOID  API_VmmAbortIsr (addr_t           ulRetAddr, 
                           addr_t           ulAbortAddr, 
                           PLW_VMM_ABORT   pabtInfo, 
                           PLW_CLASS_TCB   ptcb);

函数API_VmmAbortIsr原型分析:
- 此函数无返回;
- 参数ulRetAddr是异常返回地址;
- 参数ulAbortAddr是异常地址,;
- 参数pabtInfo是异常类型;
- 参数ptcb是出现异常的线程控制块;
API_VmmAbortIsr函数的主要内容便是处理MMU访问失效异常,也就通常所说的缺页中断。该函数的一般处理流程如下所示:
- 致命错误探测;
- 推展溢出检查;
- 异常信息构建和现场保存,包括异常时的上下文;
- 缺页处理陷阱外壳环境建立;
- FP保存;
- 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);   

陷阱程序的具体执行过程将在后续介绍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值