一种处理家庭网关系统内核崩溃的方法及系统的制作方法【
技术领域:
】[0001]本发明涉及Linux内核异常处理
技术领域:
,具体来讲是一种处理家庭网关系统内核崩溃的方法及系统。【
背景技术:
】[0002]Linux系统是一种基于POSIX(PortableOperatingSystemInterfaceofUnix,可移植操作系统Unix)和Unix的多用户、多任务、多线程和多CPU的操作系统。如今,已经有许多硬件设备安装了完整版本或裁减版本的Linux系统,例如家庭网关,手机,平板电脑,计算机,大型服务器等。[0003]基于Linux的家庭网关作为一款三网融合的用户侧终端产品,应用越来越广泛,需求也越来越多。开发者在进行驱动开发或用户在应用产品时,时常会碰到一些内核崩溃(KernelPanic)的现象。所谓的内核崩溃,是指操作系统监测到内部的致命错误,并无法安全处理此错误时采取的动作。这个概念主要被限定在Unix以及类Unix系统中,对于MicrosoftWindows系统,等同的概念通常被称为蓝屏死机。[0004]目前,当家庭网关出现内核崩溃现象时,Linux内核会立即将一些异常打印信息(oops信息)通过串口输出到控制台或者屏幕,完成输出后,家庭网关的串口输入输出功能即会失效(因为系统已经崩溃)。此时,开发者(或用户)就只能通过控制台或者屏幕上的异常打印信息进行内核崩溃信息的捕获及问题调试。但是,上述处理方法在解决实际问题时,还是存在以下缺陷:[0005](I)该处理方法必须基于出现内核崩溃前就已经接上有效串口。若内核崩溃前未及时接上串口或串口故障,因为系统已经崩溃无法进行任何有效输入输出,所以系统根本无法将OOPS信息进行有效输出,开发者(或用户)无法在没有OOPS信息的基础上进行内核崩溃?目息的捕获,进而无法准确定位冋题所在。[0006](2)该处理方法中,oops信息仅能一次性输出到控制台或者屏幕上,关掉电源后无法进行再次查看,开发者(或用户)只能通过手抄或者拍照的方式来记录,操作比较困难;与此同时,由于屏幕只能显示一页Oops信息(因为无法通过输入输出来调整显示的信息),因此当Oops信息过多时,根本无法显示完整的内容,缺少完整的oops信息也就无法进一步进行处理。[0007]综上所述,设计一种不依赖串口来处理内核崩溃的方法,是目前基于Linux的家庭网关亟待解决的技术问题。【
发明内容】[0008]本发明的目的是为了克服上述【
背景技术:
】的不足,提供一种处理家庭网关系统内核崩溃的方法及系统,能在不依赖串口的情况下,完整地捕获内核崩溃信息,处理过程高效、便捷,且复用性高。[0009]为达到以上目的,本发明提供一种处理家庭网关系统内核崩溃的方法,包括以下步骤:[0010]A、在系统内核崩溃后出现异常的CPU寄存器内,查找并记录与当前系统对应的所有堆栈的寄存器指针变量,转到步骤B;[0011]B、读取每个寄存器指针变量中的内核崩溃信息,内核崩溃信息的读取顺序依次为异常地址信息、最后返回的地址信息、CPU寄存器状态值和CPU寄存器调用过的内核函数的信息;将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区,转到步骤C;[0012]C、将全局缓冲区中所有的内核崩溃信息写入到Flash存储器的指定文件夹,转到步骤D;[0013]D、根据系统的内核崩溃状态打印异常提示信息至系统终端;用户根据异常提示信息及Flash存储器内的内核崩溃信息进行调试,结束。[0014]在上述技术方案的基础上,步骤A之前包括以下步骤:初始化一个用于禁止本地中断、禁止内核抢占的自旋锁;步骤C与D之间包括以下步骤:将自旋锁进行释放。[0015]在上述技术方案的基础上,步骤C具体包括以下步骤:在Flash存储器中指定需要写入文件夹的名称和路径;根据内核崩溃信息的起始地址、字节数大小,将全局缓冲区中所有的内核崩溃信息写入到指定文件夹中。[0016]在上述技术方案的基础上,步骤D所述根据系统的内核崩溃状态打印异常提示信息至系统终端,具体包括以下步骤:读取CPU的状态,判断当前CPU是否处于中断条件,若是,打印中断异常提示信息至系统终端;否则,休眠3?8秒,打印非中断异常提示信息至系统终端。[0017]在上述技术方案的基础上,步骤B中,读取CPU寄存器调用过的内核函数的信息的具体步骤包括:利用寄存器指针变量查询当前CPU任务的内存地址;以该内存地址为索引,在存放所有内核函数的内核符号表中进行查找,获取调用过的内核函数的名字、内核函数的大小,调用到内核函数中的配置地址。[0018]在上述技术方案的基础上,步骤A具体包括以下步骤:在当前系统正在运行的堆栈中记录寄存器指针变量;根据所述堆栈中存储的上一级调用函数的栈指针回溯至上一级堆栈,记录上一级堆栈内的寄存器指针变量;依次回溯,直至记录所有堆栈的寄存器指针变量,转到步骤B。[0019]在上述技术方案的基础上,步骤B中所述将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区的具体步骤为:将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区的最后。[0020]本发明还提供一种实现上述方法的处理家庭网关系统内核崩溃的系统,包括寄存器指针变量记录模块、内核崩溃信息捕获模块、内核崩溃信息写入模块和提示信息打印模块;[0021]所述寄存器指针变量记录模块用于:在系统内核崩溃后出现异常的CPU寄存器内,查找并记录与当前系统对应的所有堆栈的寄存器指针变量;向内核崩溃信息捕获模块发送捕获信号;[0022]所述内核崩溃信息捕获模块用于:收到捕获信号后,读取每个寄存器指针变量中的内核崩溃信息,内核崩溃信息的读取顺序依次为异常地址信息、最后返回的地址信息、CPU寄存器状态值和CPU寄存器调用过的内核函数的信息;将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区;向内核崩溃信息写入模块发送写入信号;[0023]所述内核崩溃信息写入模块用于:收到写入信号后,将全局缓冲区中所有的内核崩溃信息写入到Flash存储器的指定文件夹;向提示信息打印模块发送打印信号;[0024]所述提示信息打印模块用于:收到打印信号后,根据系统的内核崩溃状态打印异常提示信息至系统终端。[0025]在上述技术方案的基础上,所述提示信息打印模块包括处理模块和打印模块;[0026]所述处理模块用于:读取CPU的状态,判断当前CPU是否处于中断条件下,若是,发送中断异常打印信号;否则,发送非中断异常打印信号;[0027]所述打印模块用于:收到中断异常打印信号后,打印中断异常提示信息至系统终端;收到非中断异常打印信号后,休眠3?8秒,打印非中断异常提示信息至系统终端。[0028]在上述技术方案的基础上,该系统还包括自旋锁控制模块,所述自旋锁控制模块用于:在寄存器指针变量记录模块开始记录前,初始化一个用于禁止本地中断、禁止内核抢占的自旋锁;在内核崩溃信息写入后、异常提示信息打印前,释放自旋锁。[0029]本发明的有益效果在于:[0030](I)本发明中,在家庭网关系统出现内核崩溃时,是将所捕获到的完整的内核崩溃信息写入到Flash存储器的指定文件夹中,而不是按照传统的方式将信息通过串口输出到控制台或者屏幕。与现有技术中只能依赖串口进行内核崩溃信息的输出相比,本发明能够在不使用串口的情况下对内核崩溃信息进行完整的保存,并能在关掉电源后(或重启后)通过Flash存储器的指定文件夹进行反复查看,复用性高,不仅方便开发者(或用户)快速解决内核崩溃问题,而且能够降低家庭网关设备的制造成本及维护成本。[0031](2)本发明对内核崩溃信息进行捕获时,会在出现异常的CPU寄存器内,通过回溯的方式记录下所有堆栈的寄存器指针变量,利用寄存器指针变量中的异常地址信息(epc信息)、最后返回的地址信息(ra信息)、CPU寄存器状态值以及CPU寄存器调用过的内核函数的信息,从而捕获到所有的内核崩溃信息,整个处理过程高效、便捷。[0032](3)本发明中,在进行内核崩溃信息的捕获之前,会初始化一个用于禁止本地中断、禁止内核抢占的自旋锁,该自旋锁使得所要获取的内核崩溃信息是在一个系统资源稳定状态下获取的,从而保证了所获取的内核崩溃信息的准确性、可靠性。[0033](4)本发明中,在完成捕获、保存内核崩溃信息后,会对CPU的状态进行判断,从而区分内核崩溃是发生在CPU中断条件下还是非中断条件下,并通过打印相应的提示信息给开发者(或用户)以提示,能有助于开发者(或用户)对问题进行更好的分析与判断。[0034](5)本发明的适用性广,适用于大多数安装了完整版本或裁减版本的Linux系统的硬件设备。【附图说明】[0035]图1是本发明实施例中处理家庭网关系统内核崩溃的方法的流程图。【具体实施方式】[0036]下面结合附图及具体实施例对本发明作进一步的详细描述。[0037]本实施例的实施环境为基于Linux操作系统,内核版本为Linux2.6.18且CPU为MIPS架构的家庭网关设备。[0038]参见图1所示,本发明实施例提供一种处理家庭网关系统内核崩溃的方法,包括以下步骤:[0039]S1:初始化一个用于禁止本地中断、禁止内核抢占的自旋锁,使将要获取的内核崩溃信息均是准确、可靠的信息,转到步骤S2。[0040]S2:在系统内核崩溃后出现异常的CPU寄存器内,查找并记录与当前系统对应的所有堆栈的寄存器指针变量,转到步骤S3。[0041]步骤S2具体包括以下步骤:在当前系统正在运行的堆栈中记录寄存器指针变量;根据所述堆栈中存储的上一级调用函数的栈指针回溯至上一级堆栈,记录上一级堆栈内的寄存器指针变量;依次回溯,直至记录所有堆栈的寄存器当前第1页1 2 
指针变量,转到步骤S3。
[0042]S3:读取每个寄存器指针变量中的内核崩溃信息,内核崩溃信息的读取顺序依次为异常地址信息、最后返回的地址信息、CPU寄存器状态值和CPU寄存器调用过的内核函数的信息;将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区,转到步骤S4。
[0043]步骤S3中,读取CPU寄存器调用过的内核函数的信息的具体步骤包括:利用寄存器指针变量查询当前CPU任务的内存地址;以该内存地址为索引,在存放所有内核函数的内核符号表(kallsys.map)中进行查找,获取调用过的内核函数的名字、内核函数的大小,调用到内核函数中的配置地址。
[0044]步骤S3中,将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区时,是以append形式进行保存的,即将内核崩溃信息保存在全局缓冲区的最后。
[0045]S4:将全局缓冲区中所有的内核崩溃信息写入到Flash存储器的指定文件夹,转到步骤S5。
[0046]步骤S4具体包括以下步骤:在Flash存储器中指定需要写入文件夹的名称和路径;根据内核崩溃信息的起始地址、字节数大小,将全局缓冲区中所有的内核崩溃信息写入到指定文件夹中。
[0047]S5:将步骤SI中的自旋锁进行释放,转到步骤S6。
[0048]S6:读取CPU的状态,判断当前CPU是否处于中断条件,若是,转到步骤S7 ;否则转到步骤S8。
[0049]S7:打印中断异常提示信息至系统终端,用户根据中断异常提示信息及Flash存储器内的内核崩溃信息进行调试,结束。
[0050]该中断异常提示信息用于:提示开发者(或用户),在CPU中断条件下出现了内核崩溃。实际操作时,可打印一行“Fatal except1n in interrupt”作为该中断异常提示信息。
[0051]S8:休眠3?8秒后,打印非中断异常提示信息至系统终端,用户根据非中断异常提示信息及Flash存储器内的内核崩溃信息进行调试,结束。
[0052]非中断条件下,先通过休眠3?8秒后再进行打印操作,可以确保上述步骤S4中的信息成功已全部写入到Flash存储器中,然后再进行打印。本实施例中,休眠时间优选为5秒。
[0053]该非中断异常提示信息用于:提示开发者(或用户),在CPU未中断条件下出现了内核崩溃。实际操作时,可打印一行“Fatal exc印t1n”作为该非中断异常提示信息。
[0054]本发明实施例还提供一种实现上述方法的处理家庭网关系统内核崩溃的系统,包括寄存器指针变量记录模块、内核崩溃信息捕获模块、内核崩溃信息写入模块、提示信息打印模块以及自旋锁控制模块。
[0055]寄存器指针变量记录模块用于:在系统内核崩溃后出现异常的CPU寄存器内,查找并记录与当前系统对应的所有堆栈的寄存器指针变量;向内核崩溃信息捕获模块发送捕获?目号O
[0056]内核崩溃信息捕获模块用于:收到捕获信号后,读取每个寄存器指针变量中的内核崩溃信息,内核崩溃信息的读取顺序依次为异常地址信息(epc信息)、最后返回的地址信息(ra信息)、CPU寄存器状态值和CPU寄存器调用过的内核函数的信息;将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区;向内核崩溃信息写入模块发送写入信号。
[0057]内核崩溃信息写入模块用于:收到写入信号后,将全局缓冲区中所有的内核崩溃信息写入到Flash存储器的指定文件夹;向提示信息打印模块发送打印信号。
[0058]提示信息打印模块用于:收到打印信号后,根据系统的内核崩溃状态打印异常提示信息至系统终端。该提示信息打印模块包括处理模块和打印模块;
[0059]处理模块用于:读取CPU的状态,判断当前CPU是否处于中断条件下,若是,发送中断异常打印信号;否则,发送非中断异常打印信号;
[0060]打印模块用于:收到中断异常打印信号后,打印中断异常提示信息至系统终端;收到非中断异常打印信号后,休眠3?8秒,打印非中断异常提示信息至系统终端。
[0061]自旋锁控制模块用于:在寄存器指针变量记录模块开始记录前,初始化一个用于禁止本地中断、禁止内核抢占的自旋锁;在内核崩溃信息写入后、异常提示信息打印前,释放自旋锁。
[0062]本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
【主权项】
1.一种处理家庭网关系统内核崩溃的方法,其特征在于,包括以下步骤: A、在系统内核崩溃后出现异常的CPU寄存器内,查找并记录与当前系统对应的所有堆栈的寄存器指针变量,转到步骤B ; B、读取每个寄存器指针变量中的内核崩溃信息,内核崩溃信息的读取顺序依次为异常地址信息、最后返回的地址信息、CPU寄存器状态值和CPU寄存器调用过的内核函数的信息;将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区,转到步骤C ; C、将全局缓冲区中所有的内核崩溃信息写入到Flash存储器的指定文件夹,转到步骤D ; D、根据系统的内核崩溃状态打印异常提示信息至系统终端;用户根据异常提示信息及Flash存储器内的内核崩溃信息进行调试,结束。2.如权利要求1所述的处理家庭网关系统内核崩溃的方法,其特征在于:步骤A之前包括以下步骤:初始化一个用于禁止本地中断、禁止内核抢占的自旋锁;步骤C与D之间包括以下步骤:将自旋锁进行释放。3.如权利要求1所述的处理家庭网关系统内核崩溃的方法,其特征在于,步骤C具体包括以下步骤:在Flash存储器中指定需要写入文件夹的名称和路径;根据内核崩溃信息的起始地址、字节数大小,将全局缓冲区中所有的内核崩溃信息写入到指定文件夹中。4.如权利要求1所述的处理家庭网关系统内核崩溃的方法,其特征在于:步骤D所述根据系统的内核崩溃状态打印异常提示信息至系统终端,具体包括以下步骤:读取CPU的状态,判断当前CPU是否处于中断条件,若是,打印中断异常提示信息至系统终端;否则,休眠3?8秒,打印非中断异常提示信息至系统终端。5.如权利要求1所述的处理家庭网关系统内核崩溃的方法,其特征在于:步骤B中,读取CPU寄存器调用过的内核函数的信息的具体步骤包括:利用寄存器指针变量查询当前CPU任务的内存地址;以该内存地址为索引,在存放所有内核函数的内核符号表中进行查找,获取调用过的内核函数的名字、内核函数的大小,调用到内核函数中的配置地址。6.如权利要求1所述的处理家庭网关系统内核崩溃的方法,其特征在于:步骤A具体包括以下步骤:在当前系统正在运行的堆栈中记录寄存器指针变量;根据所述堆栈中存储的上一级调用函数的栈指针回溯至上一级堆栈,记录上一级堆栈内的寄存器指针变量;依次回溯,直至记录所有堆栈的寄存器指针变量,转到步骤B。7.如权利要求1所述的处理家庭网关系统内核崩溃的方法,其特征在于:步骤B中所述将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区的具体步骤为:将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区的最后。8.一种实现权利要求1至7中任一项所述方法的处理家庭网关系统内核崩溃的系统,其特征在于:包括寄存器指针变量记录模块、内核崩溃信息捕获模块、内核崩溃信息写入模块和提不?目息打印模块; 所述寄存器指针变量记录模块用于:在系统内核崩溃后出现异常的CPU寄存器内,查找并记录与当前系统对应的所有堆栈的寄存器指针变量;向内核崩溃信息捕获模块发送捕获?目号; 所述内核崩溃信息捕获模块用于:收到信息捕获信号后,读取每个寄存器指针变量中的内核崩溃信息,内核崩溃信息的读取顺序依次为异常地址信息、最后返回的地址信息、CPU寄存器状态值和CPU寄存器调用过的内核函数的信息;将所有寄存器指针变量中的内核崩溃信息均保存至全局缓冲区;向内核崩溃信息写入模块发送写入信号; 所述内核崩溃信息写入模块用于:收到写入信号后,将全局缓冲区中所有的内核崩溃信息写入到Flash存储器的指定文件夹;向提示信息打印模块发送打印信号; 所述提示信息打印模块用于:收到打印信号后,根据系统的内核崩溃状态打印异常提示信息至系统终端。9.如权利要求8所述的处理家庭网关系统内核崩溃的系统,其特征在于:所述提示信息打印模块包括处理模块和打印模块; 所述处理模块用于:读取CPU的状态,判断当前CPU是否处于中断条件下,若是,发送中断异常打印信号;否则,发送非中断异常打印信号; 所述打印模块用于:收到中断异常打印信号后,打印中断异常提示信息至系统终端;收到非中断异常打印信号后,休眠3?8秒,打印非中断异常提示信息至系统终端。10.如权利要求8所述的处理家庭网关系统内核崩溃的系统,其特征在于:该系统还包括自旋锁控制模块,所述自旋锁控制模块用于:在寄存器指针变量记录模块开始记录前,初始化一个用于禁止本地中断、禁止内核抢占的自旋锁;在内核崩溃信息写入后、异常提示信息打印前,释放自旋锁。
【专利摘要】本发明公开了一种处理家庭网关系统内核崩溃的方法及系统,涉及Linux内核异常处理技术领域。该方法包括以下步骤:在系统内核崩溃后出现异常的CPU寄存器内,查找并记录与当前系统对应的所有堆栈的寄存器指针变量;读取每个寄存器指针变量中的内核崩溃信息,并将其保存至全局缓冲区;将全局缓冲区中所有的内核崩溃信息写入到Flash存储器的指定文件夹;根据系统的内核崩溃状态打印异常提示信息至系统终端,用户根据异常提示信息及Flash存储器内的内核崩溃信息进行调试。本发明能在不依赖串口的情况下,完整地捕获内核崩溃信息,处理过程高效、便捷,且复用性高。
【IPC分类】H04L12/66, G06F11/07
【公开号】CN104899111
【申请号】CN201510311687
【发明人】赵伟, 周转运, 王志军
【申请人】烽火通信科技股份有限公司
【公开日】2015年9月9日
【申请日】2015年6月9日