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);   

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

原文地址:http://blog.51cto.com/12557713/2178715

时间: 2024-10-09 23:46:50

SylixOS异常管理的相关文章

使用Spring进行统一日志管理 + 统一异常管理

统一日志和异常管理配置好后,SSH项目中,代码以往散落的log.info() 和 try..catch..finally 再也不见踪影! 统一日志异常实现类: [java] view plain copy package com.pilelot.web.util; import org.apache.log4j.Logger; import org.springframework.aop.ThrowsAdvice; import org.springframework.dao.DataAcces

SylixOS电源管理之外设功耗管理

1.前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就会大大提升该系统的生存竞争力.这方面,大自然已经做的很好了,如植物的落叶,如动物的冬眠,等等.而在计算机的世界里称作电源管理(Power Management). 本篇以运行SylixOS的mini2440嵌入式平台为例,分析SylixOS电源管理的外设功耗管理部分. 2.电源管理系统框架 Sylix

RDIFramework.NET ━ 9.13 系统日志与系统异常管理 ━ Web部分

RDIFramework.NET ━ .NET快速信息化系统开发框架 9.13  系统日志与系统异常管理 -Web部分  一个软件在投入运行时不可能没有任何异常,在软件发生异常时及时的记录下来,也好我们及时对异常进行跟踪,以解决发生的异常,避免异常的再次发生.异常分为两种情况,一种为客户端发生的异常,另一种为服务端发生的异常.对于客户端发生的异常,通常都会及时的弹出,用户看到后可以反馈给我们.服务器端产生的异常会自动记录到数据库中,管理员可以通过框架异常管理进行查看操作. 框架日志管理对于框架的

SpringMVC -- 梗概--源码--贰--异常管理

1.配置web.xml 2.配置SpringMVC.xml 3.配置控制器 4.配置异常管理器 5.配置视图 异常管理 定制异常管理器 声明 异常管理器作用

SylixOS异常调试的手段

1 适用范围 本文档适用于希望了解当前SylixOS的调试手段的工程师.2 cdump 系统/应用异常调试手段 2.1 cdump简介 cdump 是SylixOS系统下的shell命令,用于系统/应用崩溃的信息记录.cdump可以将内核保存在堆中的异常信息显示出来并清空内核堆中的异常信息或者保存下来. 2.2 cdump的使用方法 当系统/应用程序发生异常时,可以在系统命令行下输入 cdump -s 保存异常信息,异常信息将保存在/var/log/cdump/ 目录下,如图 2.1. [点击并

C# 程序异常管理方案

1.程序出现未处理异常(程序中未捕获异常.添加异常处理) 2.程序添加全局异常捕获 tip:程序已处理异常不在捕获范围内. /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { //全局异常捕捉 Application.ThreadException += Application_ThreadException; //UI线程异常 AppDomain.CurrentDomain.Un

java web 项目异常管理

在实际的j2ee项目中,系统内部难免会出现一些异常,如果把异常放任不管直接打印到浏览器可能会让用户感觉莫名其妙,也有可能让某些用户找到破解系统的方法. 出来工作一年时间了,我也大概对异常处理有了一些了解,在这呢小弟简单介绍下个人对异常处理的见解,抛砖引玉,希望各位大神提出宝贵的意见和建议. 就拿spring+struts2+hibernate项目说明:通常一个页面请求到后台以后,首先是到action(也就是所谓mvc的 controller),在action层会调用业务逻辑service,ser

异常以及异常处理框架探析

概述 一般情况下,企业级应用都对应着复杂的业务逻辑,为了保证系统的健壮,必然需要面对各种系统业务异常和运行时异常. 不好的异常处理方式容易造成应用程序逻辑混乱,脆弱而难于管理.应用程序中充斥着零散的异常处理代码,使程序代码晦涩难懂.可读性差,并且难于维护. 一个好的异常处理框架能为应用程序的异常处理提供统一的处理视图,把异常处理从程序正常运行逻辑分离出来,以至于提供更加结构化以及可读性的程序架构.另外,一个好的异常处理框架具备可扩展性,很容易根据具体的异常处理需求,扩展出特定的异常处理逻辑. 另

尝试封装适用于权限管理的通用API

谈谈我对权限系统的简单理解 最近一段时间在研究权限系统,在园子里看到个很牛逼的开源的基于DDD-Lite的权限管理系统,并有幸加入了作者的QQ群,呵呵,受到了很大的影响.对于权限管理我有我自己的一些简单想法,说简单也许是因为我对权限管理领域的理解有限,我所做的仅是基于我本人对权限管理的理解.以最终目的为出发点,应该就是一个系统根据不同的登陆用户的不同权限而呈现不同的界面,不同的操作,数据和资源等等.从实现方面大体可以分几个部分:用户登陆管理部分,用户权限分配部分,响应终端或界面部分.目前我已经根