2019独角兽企业重金招聘Python工程师标准>>>

异常管理

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

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

函数API_VmmAbortIsr原型分析:

  1. 此函数无返回;
  2. 参数ulRetAddr是异常返回地址;
  3. 参数ulAbortAddr是异常地址;
  4. 参数pabtInfo是异常类型;
  5. 参数ptcb是出现异常的线程控制块;

  API_VmmAbortIsr函数的主要内容便是处理MMU访问失效异常,也就通常所说的缺页中断。该函数的一般处理流程如下所示:

  1. 致命错误探测;
  2. 推展溢出检查;
  3. 异常信息构建和现场保存,包括异常时的上下文;
  4. 缺页处理陷阱外壳环境建立;
  5. FP保存;
  6. FPU、DSP上下文保存。

  其中缺页处理陷阱外壳的建立是通过修改异常上下文的任务入口、入口参数以及堆栈起点实现的,如下所示。陷阱程序的入口函数为__vmmAbortShell,异常消息作为函数参数,堆栈直接使用任务的线程堆栈,而异常消息也保存在该堆栈中(API_VmmAbortIsr函数执行时使用的是CPU的中断堆栈)。

#if LW_CFG_VMM_EN > 0pstkFailShell = archTaskCtxCreate(&ptcb->TCB_archRegCtx,(PTHREAD_START_ROUTINE)__vmmAbortShell,(PVOID)pvmpagefailctx,(PLW_STACK)pucStkNow,0);        /*  建立缺页处理陷阱外壳环境    */
#elsepstkFailShell = 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);

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

转载于:https://my.oschina.net/u/3248663/blog/2120700

SylixOS异常管理相关推荐

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

    统一日志和异常管理配置好后,SSH项目中,代码以往散落的log.info() 和 try..catch..finally 再也不见踪影! 统一日志异常实现类: [java] view plaincop ...

  2. runtimeexception异常_应用系统的异常管理-持续更新

    Java的异常管理层级关系还是很清晰的. 其中,RuntimeException 可能是日常应用系统中出现最多的异常了,一般系统都会继续本系统的业务功能,继承RuntimeException,定义各种 ...

  3. php定时发送生日模块消息_Swoft 2.0.5 更新,新增高效秒级定时任务、异常管理组件...

    什么是 Swoft ? Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架.Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP-F ...

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

    1.前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就会 ...

  5. springboot 应用:异常管理,应用启动过程,应用监控 Prometheus 和 Grafana

    异常管理 springboot 应用中默认的全局异常处理类是 BasicErrorController,内部判断 accept 如果是 text/html 则返回 /error 路径的模板:如果是 a ...

  6. 应用程序异常管理组件 Example 程序

    由于写程序的人都不是神仙,经常会有Bug存在是难免的,当然我们也不能以此为借口,平时不重视代码质量, 代码质量可以体现出一个人的性格.品味等,做事严谨的人写代码的错误也会少一些,本来就是稀里糊涂的人不 ...

  7. java 异常管理员_GitHub - kangZan/JCatch: Exception异常管理平台,支持Java、PHP、Python等多种语言...

    什么是JCatch 当程序发生异常(Exception),处理方式一般是通过日志文件记录下来,这种方式很容易被忽略,而且查询起来比较麻烦. JCatch提供了一种方案,当程序发生异常时,通过JCatc ...

  8. RTT的线程同步篇——异常管理

    野火RTT第25章异常 2018年12月29日 10:47 一.中断中使用RRT的IPC通信机制. 异常分为同步异常和异步异常. 中断属于异步异常. RTT建议在中断中采用信号量.消息.事件来标记. ...

  9. SylixOS异常调试的手段

    1 适用范围 本文档适用于希望了解当前SylixOS的调试手段的工程师. 2 cdump 系统/应用异常调试手段 2.1 cdump简介 cdump 是SylixOS系统下的shell命令,用于系统/ ...

最新文章

  1. java中标识符,关键字,数据类型
  2. 2.ceph高级操作
  3. HDU_oj_2021 发工资喽
  4. 基于DirectUI搭建Windows窗体程序
  5. [书目20080220]UML 2工具箱
  6. SAP UI5 应用开发教程之五十六 - SAP UI5 树控件(tree)的开发试读版
  7. ASP.NET MVC下使用AngularJs语言(三):ng-options
  8. Linux关闭防火墙详述
  9. java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?
  10. Handler处理器 和 自定义Opener
  11. Kudu : 插入无法获取主键冲突的异常
  12. android - 调用系统分享功能分享图片
  13. UVALive 6181
  14. Unity3D笔记 英保通三 脚本编写 、物体间通信
  15. 智慧校园安防平台应用解决方案
  16. 黑马程序员并发编程笔记(一)
  17. 设计模式-外观模式(家庭影院你值得拥有)
  18. Xcode8注释快捷键不能使用
  19. 金额转大写java实现
  20. CentOS7安装 SGE

热门文章

  1. ROS机器人程序设计(原书第2版)3.4 设置动态参数
  2. 面试-设计模式六大原则
  3. 注册表 ControlSet001、ControlSet002以及CurrentControlSet
  4. Oracle数据库基础教程:入门其实很简单
  5. ADO.NET知识汇总
  6. 高端企业级存储IBM XIV访谈视频
  7. BZOJ.4199.[NOI2015]品酒大会(后缀自动机 树形DP)
  8. PHP数组——自定义排序
  9. JavaScript特点、优缺点及常用框架
  10. 错误HIERARCHY_REQUEST_ERR: DOM Exception 3