首页> 中国专利> 一种中断不响应的检测方法及系统

一种中断不响应的检测方法及系统

摘要

本发明适用于计算机技术领域,提供了一种中断不响应的检测方法及系统。所述方法包括以下步骤:读取异常入口地址中的数据;通过系统符号表得到excNormVec函数的入口地址;读取所述入口地址的数据直到函数的末尾;比较所述读取异常入口地址中的数据与读取所述excNormVec入口地址的数据直到函数的末尾的数据是否相同;如果相同,则分析出异常分发函数能够正常工作;如果不相同,则分析出没有将异常分发函数正确放入在异常入口点,输出错误信息,报告出错点。通过本发明能够极大的提高开发效率和诊断能力。

著录项

  • 公开/公告号CN102789400A

    专利类型发明专利

  • 公开/公告日2012-11-21

    原文格式PDF

  • 申请/专利权人 深圳市普联技术有限公司;

    申请/专利号CN201110125949.0

  • 发明设计人 邸宝生;

    申请日2011-05-16

  • 分类号G06F11/00(20060101);

  • 代理机构44237 深圳中一专利商标事务所;

  • 代理人温青玲

  • 地址 518055 广东省深圳市南山区桃源街道平山大园工业区南区2栋1-6楼

  • 入库时间 2023-12-18 07:21:42

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-12-02

    授权

    授权

  • 2013-10-16

    著录事项变更 IPC(主分类):G06F11/00 变更前: 变更后: 申请日:20110516

    著录事项变更

  • 2013-01-16

    实质审查的生效 IPC(主分类):G06F11/00 申请日:20110516

    实质审查的生效

  • 2012-11-21

    公开

    公开

说明书

技术领域

本发明属于计算机技术领域,尤其涉及一种中断不响应的检测方法及系统。 

背景技术

目前,并没有关于MIPS架构CPU下中断或者异常无法响应的分析与解决方案。 

最接近的现有技术方案是定位软件代码中导致异常的原因,其思想主要是根据当前产生的异常信息回溯出发生异常函数的调用栈,然后跟踪此函数调用路径分析异常发生的原因。然而发生异常的函数可能被不同的函数调用。 

回溯函数的调用栈的方案如下: 

步骤一:在异常处理程序里面通过读取CP0的EPC寄存器获取导致异常发生的指令地址,记为E_PC。 

步骤二:由E_PC向下遍历当前发生异常的函数的二进制代码直到该导致异常的函数入口地址,匹配构建栈的指令和存放返回地址的指令。匹配到存放返回地址的指令,如“sw ra,XX(sp)”,则可以根据sp寄存器的值加上XX的值获取到此异常函数的返回地址。再匹配到构建函数栈的指令,如“addiu sp,sp,-YY”,则可以根据sp寄存器的值加上YY的值获取到调用此异常函数的函数的栈指针。 

步骤三:继续递归执行步骤二,则可以回溯出整个函数调用关系。 

在回溯出函数调用栈以后,最底部的就是导致异常的函数,然后根据回溯的函数路径逐步分析找到导致异常的原因。 

上述方案的缺陷如下: 

1、上述方案能够实施成功有个必须的先决条件,那就是发生异常后能够进 入异常处理程序。如果无法进入异常处理程序,那么就无法获取到EPC的值,更无从谈起回溯函数的调用栈。 

2、上述方案只是说明了一种回溯函数调用路径的方法,在打印出调用路径以后仍需人工分析在此函数调用路径中到底哪里是导致异常发生的真正原因。可见并不能直接定位。 

3、众所周知,在MIPS架构的CPU下,中断是属于不同的异常类型中的一种。而在嵌入式产品中,尤其是通信领域,中断扮演着相当重要的角色。如,有操作系统的脉搏之称的系统时钟就是靠时钟中断实现,如网络数据包的接收也是由中断通知操作系统。万一中断无法响应,导致时钟中断递交不到操作系统中,或者硬件收到的网络数据包无法交给驱动程序处理,此时并不会进入异常处理程序,更不会进入中断的处理程序,所以靠上述回溯出函数调用路径的方法无法解决中断或者异常的底层问题。 

4、最重要的一点,从中断或者异常发生到进入中断或者异常处理程序之前,操作系统需要在这期间做很多底层的操作,如判断异常类型,判断中断类型,获取中断或者异常服务程序的函数地址,等等。这些操作都是上述方案无法回溯到的。 

发明内容

本发明的目的在于提供一种中断不响应的检测方法及系统,旨在解决现有技术中存在的如果中断或异常无法进入异常处理程序,则无法定位哪里是导致异常发生的真正原因,即使可以进入异常处理程序,也需要人工分析导致异常发生的真正原因的问题。 

本发明是这样实现的,一种中断不响应的检测方法,所述方法包括以下步骤: 

读取异常入口地址中的数据; 

通过系统符号表得到excNormVec函数的入口地址; 

读取所述入口地址的数据直到函数的末尾; 

比较所述读取异常入口地址中的数据与读取所述excNormVec入口地址的数据直到函数的末尾的数据是否相同; 

如果相同,则分析出异常分发函数能够正常工作; 

如果不相同,则分析出没有将异常分发函数正确放入在异常入口点,输出错误信息,报告出错点。 

本发明的另一目的在于提供一种中断不响应的检测系统,所述系统包括: 

第一读取模块,用于读取E_VEC(异常入口)地址中的数据; 

第一获取模块,用于通过系统符号表得到excNormVec函数的入口地址; 

第二读取模块,用于读取所述入口地址的数据直到函数的末尾; 

比较模块,用于比较所述读取异常入口地址中的数据与读取所述excNormVec入口地址的数据直到函数的末尾的数据是否相同; 

分析模块,用于如果比较模块比较出相同,则分析出异常分发函数能够正常工作;如果不相同,则分析出没有将异常分发函数正确放入在异常入口点; 

输出模块,用于输出错误信息,报告出错点。 

在本发明中,通过本发明能够极大的提高开发效率和诊断能力,解决了现有技术中存在的如果中断或异常无法进入异常处理程序,则无法定位哪里是导致异常发生的真正原因,即使可以进入异常处理程序,也需要人工分析导致异常发生的真正原因的问题。 

附图说明

图1是本发明一实施例提供的中断不响应的检测方法的实现流程示意图。 

图2是本发明实施例提供的调用intConnect(70,sysClkInt,0)后excBsrTbl[256]向量表的结构示意图。 

图3是本发明实施例提供的中断不响应的检测系统的结构示意图。 

具体实施方式

为了使本发明的目的、技术方案及有益效果更加清楚明白,以下结合附图 及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。 

请参阅图1,为本发明实施例提供的中断不响应的检测方法的实现流程,其包括以下步骤: 

在步骤S101中,读取E_VEC(异常入口)地址中的数据; 

在步骤S102中,通过系统符号表得到excNormVec函数的入口地址; 

在步骤S103中,读取所述入口地址的数据直到函数的末尾; 

在步骤S104中,比较所述读取异常入口地址中的数据与读取所述excNormVec入口地址的数据直到函数的末尾的数据是否相同; 

在步骤S105中,如果相同,则分析出异常分发函数能够正常工作; 

在步骤S106中,如果不相同,则分析出没有将异常分发函数正确放入在异常入口点,输出错误信息,报告出错点。 

在本发明实施例中,在步骤S101之前,还包括步骤:系统初始化入口;将异常分发函数放入在异常入口点。 

其中,异常入口点在本实施例中所使用MIPS平台下为0x80000080地址处,当异常或者中断发生时,CPU设置了CAUSE寄存器中发生的异常类型后就到此地址处取指令执行。 

此处异常分发函数,所做的工作就是根据CAUSE寄存器指示的异常类型跳转到不同的异常处理函数中。 

作为本发明一优选实施例,所述方法还包括以下步骤: 

在步骤S201中,获取系统中中断向量表excBsrTbl[]的起始地址; 

在步骤S202中,读取excBsrTbl+offset中的数据,记为ISRWrapAddr; 

在步骤S203中,读取以ISRWrapAddr为起始地址的预设个数字节的数据;如20字节的数据; 

在步骤S204中,解析读出的预设个数字节数据,得到ISR函数的地址; 

在步骤S205中,通过系统符号表得到所注册的ISR函数的地址; 

在步骤S206中,比较解析得到的ISR函数的地址与通过系统符号表得到所注册的ISR函数的地址是否相同; 

在步骤S207中,如果相同,则分析出注册的ISR能够正常工作; 

在步骤S208中,如果不相同,则分析出没有将ISR注册到中断向量表中的正确位置,输出错误信息,报告出错点。 

在本发明实施例中,在步骤S201之前,还包括以下步骤:创建ISR包裹函数;将ISR包裹函数放置中断向量表相应位置。 

其中,ISR包裹函数是以下面的代码片段为模板: 

0x0:3c08xxxx lui t0,xxxx/*xxxx为ISR高16位地址*/ 

0x4:3c04yyyy lui a0,yyyy/*yyyy为ISR高16位参数*/ 

0x8:3508zzzz ori t0,t0,zzzz/*zzzz为ISR低16位地址*/ 

0xc:01000008 jr t0/*跳转到ISR执行*/ 

0x10:3484pppp ori a0,a0,pppp/*pppp为ISR低16位参数*/ 

其中最左边第1列是ISR包裹函数的相对地址,第2列是对应的十六进制机器码,第3列是机器码对应的人们可读懂的汇编代码。xxxxzzzz构成了ISR的地址,yyyypppp构成了ISR的参数。 

创建ISR包裹函数时,就会将ISR的地址和参数分别填入上面的各个字段中,然后会将此ISR包裹函数的地址存放于excBsrTbl[256]向量表中。具体存放于表中的哪个位置,是由intConnect函数传进来的vector参数决定。如调用intConnect(70,sysClkInt,0)后excBsrTbl[256]向量表的结构如图2所示: 

例如,在中断发生时,异常分发函数会调用excIntStub函数执行,然后此函数就会去CAUSE寄存器或者CPU中断向量寄存器中查看发生了什么类型的中断,然后根据中断类型得到ISR的包裹函数在excBsrTbl[256]向量表中的偏移,则可以进入ISR中,进行相应的中断处理。 

其中,为了能够正确的处理中断,需要将异常分发函数正确放至异常入口点,且需要将ISR注册到中断向量表中的正确位置,如果这二个条件不符合,则会导致中断无法响应的问题。另外,影响中断能否响应的关键地方还包括:关于MIPS的寄存器以及CPU本身关于中断的寄存器是否设置正确,如果设置不正确,同样导致中断无法响应。 

作为本发明另一优选实施例,所述方法还包括以下步骤: 

在步骤S301中,获取CP0中STATUS寄存器的内容; 

在步骤S302中,将所述内容与0x1相与取出IE位; 

在步骤S303中,判断IE是否等于0; 

在步骤S304中,若IE等于0,则输出信息,提示用户打开IE位; 

在步骤S305中,若IE不等于0,检测中断屏蔽寄存器; 

在步骤S306中,判断是否打开了相应中断; 

在步骤S307中,如果没有打开相应中断,则输出信息,提示用户打开相应中断屏蔽位; 

在步骤S308中,如果打开相应中断,则检测结束。 

由上可知,在MIPS架构CPU下,CP0的寄存器有两个跟中断相关,第一个就是CP0的STATUS状态寄存器,该寄存器有一个全局中断使能位IE,还有八个中断屏蔽位IM。第二个跟中断相关的寄存器就是CAUSE寄存器,CAUSE寄存器中有八个IP位指示发生了什么类型的中断。因为CAUSE寄存器的IP位是由硬件置位,程序员并不需要写入。 

要使中断能够进入CPU并进入中断服务程序处理,必须打开全局中断使能位IE和打开相应的中断屏蔽位IM。另外,如果主CPU使用的向量化中断,那么直接检查主CPU中的中断屏蔽寄存器即可,而不需要检查STATUS的IM位。 

由本发明实施例提供的方法能够准确的定位中断无法响应的原因。本发明实施例提供的方法能应用在:例如在时钟中断的例子中,最后检测的结果是因为中断屏蔽寄存器中的时钟中断位没有打开,所以时钟中断没有递交到操作系统中。 

在另外一个网络驱动的例子中,发现数据包无法进入网卡驱动程序中,经过本程序检测,发现是由于注册的过程中出了问题,没有注册到中断向量表的正确位置。 

本发明实施例提供的方法能够极大的提高开发效率和诊断能力。 

请参阅图3,为本发明实施例提供的中断不响应的检测系统的结构,为了便于说明,仅示出了与本发明实施例相关的部分。 

所述中断不响应的检测系统包括:第一读取模块100、第一获取模块101、第二读取模块102、比较模块103、分析模块104、以及输出模块105。 

所述第一读取模块100,用于读取E_VEC(异常入口)地址中的数据; 

第一获取模块101,用于通过系统符号表得到excNormVec函数的入口地 址; 

第二读取模块102,用于读取所述入口地址的数据直到函数的末尾; 

比较模块103,用于比较所述读取异常入口地址中的数据与读取所述excNormVec入口地址的数据直到函数的末尾的数据是否相同; 

分析模块104,用于如果比较模块103比较出相同,则分析出异常分发函数能够正常工作;如果不相同,则分析出没有将异常分发函数正确放入在异常入口点; 

输出模块105,用于输出错误信息,报告出错点。 

在本发明实施例中,所述系统还包括:初始化模块、以及放入模块。 

初始化模块,用于初始化入口; 

放入模块,用于将异常分发函数放入在异常入口点。 

作为本发明一优选实施例,所述系统还包括:第二获取模块、第三读取模块、第四读取模块、解析模块、ISR函数的地址获取模块、地址比较模块、第二分析模块、以及第二输出模块。 

第二获取模块,用于获取系统中中断向量表excBsrTbl[]的起始地址; 

第三读取模块,用于读取excBsrTbl+offset中的数据,记为ISRWrapAddr; 

第四读取模块,用于读取以ISRWrapAddr为起始地址的预设个数字节的数据;如20字节的数据; 

解析模块,用于解析读出的预设个数字节数据,得到ISR函数的地址; 

ISR函数的地址获取模块,通过系统符号表得到所注册的ISR函数的地址; 

地址比较模块,用于比较解析得到的ISR函数的地址与通过系统符号表得到所注册的ISR函数的地址是否相同; 

第二分析模块,用于如果地址比较模块比较出相同,则分析出注册的ISR能够正常工作;如果不相同,则分析出没有将ISR注册到中断向量表中的正确位置; 

第二输出模块,用于输出错误信息,报告出错点。 

在本发明实施例中,所述系统还包括:创建模块、以及放置模块。 

创建模块,用于创建ISR包裹函数; 

放置模块,用于将ISR包裹函数放置中断向量表相应位置。 

作为本发明另一优选实施例,所述系统还包括:内容获取模块、相与模块、判断模块、提示模块、检测模块、第二判断模块、第二提示模块。 

内容获取模块,用于获取CP0中STATUS寄存器的内容; 

相与模块,用于将所述内容与0x1相与取出IE位; 

判断模块,用于判断IE是否等于0; 

提示模块,用于若IE等于0,则输出信息,提示用户打开IE位; 

检测模块,用于若IE不等于0,检测中断屏蔽寄存器; 

第二判断模块,用于判断是否打开了相应中断; 

第二提示模块,用于如果没有打开相应中断,则输出信息,提示用户打开相应中断屏蔽位;如果打开相应中断,则检测结束。 

综上所述,通过本发明实施例能够极大的提高开发效率和诊断能力;解决了现有技术中存在的如果中断或异常无法进入异常处理程序,则无法定位哪里是导致异常发生的真正原因,即使可以进入异常处理程序,也需要人工分析导致异常发生的真正原因的问题。 

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以在存储于一计算机可读取存储介质中,所述的存储介质,如ROM/RAM、磁盘、光盘等。 

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。 

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号