启用状态保存的方法和系统技术方案

技术编号:2825482 阅读:194 留言:0更新日期:2012-04-11 18:40
一种针对事件驱动环境中的首次故障数据捕获(FFDC)为协同例程启用状态保存和调试操作的方法。堆栈管理实用程序在缓冲区中为包括状态域和堆栈指针的上下文结构分配空间。上下文管理实用程序初始化第一协同例程的第一上下文结构,并响应于第二协同例程保存第一上下文结构的状态。上下文管理实用程序将第二上下文结构设置为当前上下文。当完成当前上下文的执行时,上下文管理实用程序将第一协同例程的第一上下文结构恢复为当前上下文。如果状态域未被设置为有效值,状态保存函数“状态保存”所有已分配的协同例程堆栈和上下文结构、将整个系统恢复为前一有效状态并且重新启动操作。

【技术实现步骤摘要】

本专利技术涉及数据处理系统,且更具体地,涉及一种启用状态保存和调试操作的方法和系统。
技术介绍
典型地,操作系统(OS)将虚拟内存分为内核空间和用户空间。典型地,内核空间为运行内核、内核扩展和设备驱动程序而保留,而用户空间则是为用户模式应用而保留。为了跟踪并控制多个进程的执行,OS利用调用堆栈(也称为执行堆栈)存储关于计算机程序的活动子例程的信息。在活动子例程的执行已经完成之后,调用堆栈通过记住每个活动子例程应该返回控制的点来监控多个进程的执行。可以利用协同例程促使代码移植到在OS的内核空间操作的一组微代码中,从而移植的代码无需重构,以在事件驱动(或者扫描环)环境中异步运行。当需要来自事件驱动环境中代码的异步回叫时,在不同的上下文(或者堆栈)上执行移植代码的几个协同例程包装挂起相应的操作。在回叫时,协同例程包装恢复相应的移植代码的上下文,且移植的代码继续进行,就好像已经立即执行了中断函数调用。为了便于代码移植,OS往往需要重构代码以在新环境中运行(例如,通过提供转换以启用非固有异步环境中的操作)。
技术实现思路
本专利技术公开了一种针对事件驱动环境中协同例程启用状态保存和调试操作的方法、系统和计算机程序产品。堆栈管理实用程序在缓冲区(buffer)中为包括状态域(state field)的上下文结构和堆栈指针分配空间。上下文管理实用程序初始化第一协同例程的第一上下文-->结构,并响应于第二协同例程的执行请求保存所述第一上下文结构的状态。所述上下文管理实用程序将与所述第二协同例程相关的第二上下文结构设置为当前上下文。当完成所述当前上下文的执行时,所述上下文管理实用程序将所述第一协同例程的第一上下文结构恢复为当前上下文。如果没有将所述状态域设置为有效值,状态保存函数“状态保存”所有要在调试中使用的已分配协同例程堆栈和上下文结构,然后将整个系统恢复为前一有效状态并重新启动操作。本专利技术上述及另外的目的、特征和优点将在下面详细的书面说明中变得显而易见。附图说明当结合附图阅读本专利技术时,参考以下说明性实施例的详细描述可以最好地理解本专利技术自身以及优选的使用方式,进而理解其目的和优点,其中:图1示出根据本专利技术的实施例数据处理系统的高级框图;图2示出根据本专利技术的实施例示范性上下文数据结构的高级框图;图3为根据本专利技术的实施例针对事件驱动环境中协同例程启用状态保存和其他调试操作的过程的高级逻辑流程图;图4为根据本专利技术的实施例分配堆栈块的过程的高级逻辑流程图;图5为根据本专利技术的实施例解除分配堆栈块的过程的高级逻辑流程图;图6为根据本专利技术的实施例检索来自协同例程的上下文信息的过程的高级逻辑流程图;图7为根据本专利技术的实施例设置协同例程的上下文信息的过程的高级逻辑流程图;图8为根据本专利技术的实施例实现作为状态保存和紧急函数的开始部分的堆栈块可控状态保存的方法的高级逻辑流程图;以及-->图9为根据本专利技术的实施例实现作为状态保存和紧急函数的开始部分的堆栈块可控状态保存的可选择的方法的高级逻辑流程图。具体实施方式本专利技术提供了一种针对事件驱动环境中协同例程启用状态保存和调试操作的方法、系统和计算机程序产品。现在参照图1,该图示出根据本专利技术实施例通用的数据处理系统的框图。数据处理系统100包含随机存取存储器(RAM)102、处理器104和输入/输出(I/O)控制器108。系统互连118连接处理器104、RAM 102、存储器106和I/O控制器108。数据处理系统100还包括诸如硬盘驱动器或者其他直接存取存储设备的非易失存储器106。I/O控制器108通过有线或者无线连接,诸如网络线缆112为网络110提供连通性。I/O控制器108还通过I/O通信连接116(例如线缆或者无线连接)耦接于用户I/O设备114(例如,键盘、显示设备、鼠标或者打印机)。根据该说明性的实施例,数据处理系统100将堆栈块132、一个或多个应用128以及操作系统(OS)存储在RAM 102中。堆栈块132包括协同例程堆栈148、针对协同例程的多个上下文数据结构(此处称为“Ucontext”)150、针对“正常”代码的Ucontext 152以及堆栈控制154。如此处所用,正常代码定义为典型地由数据处理系统100执行的代码(例如,应用128)。Ucontext函数(例如,“getcontext”、“makecontext”、“setcontext”和“swapcontext”)使得OS 130能够操纵上下文数据结构。“getcontext”Ucontext函数使得OS 130能够通过与当前正在执行的进程对应的寄存器内容对上下文结构初始化。“makecontext”Ucontext函数改变上下文,以便该上下文利用不同的堆栈。“setcontext”Ucontext函数将当前正在执行的过程设置为给定的上下文并使用与该给定的上下文对应的一组寄存器执行。同样地,“swapcontext”Ucontext函数使得OS 130能够将当前上下文保存在上下文数据结构中并将当前正在执行的上下文设置为另一个上下文。下-->面将要讨论的图3到图9示出操纵协同例程的上下文数据结构的过程/方法。协同例程堆栈148存储对应于正在由处理器104异步执行的协同例程的信息。在堆栈块132中,针对协同例程的Ucontext 150和针对正常的Ucontext 152分别为协同例程和正常代码存储包括识别最近被执行代码的位置和堆栈指针的上下文信息。根据下面讨论的图3-8中所描述的过程,堆栈控制154使得OS 130能够管理堆栈块132。系统中每个活动的协同例程都有相应的已分配堆栈块132,且堆栈块132被OS 130用来跟踪多个协同例程。OS 130包括状态保存和紧急函数(panic function)158、堆栈管理实用程序160和上下文管理实用程序156。堆栈管理实用程序160和上下文管理实用程序156使得OS 130与堆栈控制154相互作用并且操纵堆栈块132中的数据。每个Ucontext数据结构150和152中的状态域使得OS 130能够确定上下文是有效(即安排为待执行)、当前由处理器104执行或者尚未执行。堆栈块132的列表由OS 130采用嵌入式堆栈控制154进行管理,从而使得OS 130能够确定最近使用的和最早使用的协同例程。根据下面讨论的图3-9所示的过程,状态保存和紧急函数158使得OS 130能够操纵堆栈块132。以下段落给出了状态保存过程的概述。状态保存是状态保存和紧急函数158的开始部分,它用于将数据结构存储于永久存储器供调试操作中使用。如此处所用,“状态保存”(state save)指的是保存与协同例程相关的上下文信息。本专利技术所描述的实施例提供了一种为首次故障数据捕获(FFDC)状态保存堆栈及相关结构或者使OS 130的组件能够完成状态保存的装置,而无需不同的组件包括冗余的状态保存代码。下面将讨论图3-9,其中每个图都说明了本专利技术修改的状态保存过程的不同部分。堆栈管理实用程序160为包括状态域的Ucontext结构和堆栈块132中的堆栈指针分配空间。上下文管理实用程序156初始化第一协同例程的第一上下文结构,并响应于第二协同例程的执行请求保存该第一上下文结构的状态。上本文档来自技高网...

【技术保护点】
一种方法,包括    初始化第一协同例程的第一上下文结构;    当进程调用第二协同例程的执行时:    保存所述第一上下文结构的状态;以及    将与所述第二协同例程相关的第二上下文结构设置为当前上下文;以及    当所述当前上下文的执行完成时,将所述第一协同例程的所述第一上下文结构恢复为下一个当前上下文。

【技术特征摘要】
US 2007-3-7 11/682,9561.一种方法,包括初始化第一协同例程的第一上下文结构;当进程调用第二协同例程的执行时:保存所述第一上下文结构的状态;以及将与所述第二协同例程相关的第二上下文结构设置为当前上下文;以及当所述当前上下文的执行完成时,将所述第一协同例程的所述第一上下文结构恢复为下一个当前上下文。2.如权利要求1所述的方法,进一步包括:在缓冲区中分配上下文结构和堆栈指针,其中所述上下文结构包括状态域;以及执行状态保存操作,以响应于所述状态域不被设置为有效值恢复所述缓冲区。3.如权利要求2所述的方法,其中:初始化所述第一协同例程的第一上下文结构进一步包括:从可用堆栈块的列表移除所述缓冲区中的堆栈块;将所述堆栈块添加至已分配堆栈块的列表;将所述第一上下文结构的所述状态域设置为“已分配的”值;以及将所述堆栈块提供给与所述第一上下文结构对应的调用程序;且将所述第一上下文结构恢复为下一个当前上下文进一步包括:从已分配堆栈块的列表移除所述缓冲区中的堆栈块;将所述堆栈块添加至可用堆栈块的列表;以及将所述第二上下文结构的所述状态域设置为“未分配的”值。4.如权利要求2所述的方法,其中保存所述第一上下文结构的所述状态进一步包括:将与第一上下文结构对应的当前值从寄存器保存到永久存储位置;以及将所述第一上下文结构的所述状态域设置为“set_by_getcontext”值。5.如权利要求1所述的方法,其中将与所述第二协同例程相关的所述第二上下文结构设置为当前上下文进一步包括:响应于所述状态域不具有“set_by_getcontext”值并且所述状态域不具有“set_by_swapcontext”值,执行状态保存操作以将所述缓冲区恢复为最近有效状态,其中完成了首次故障数据捕获(FFDC);响应于所述状态域包含所述“set_by_getcontext”值,将所述第二上下文结构的所述状态域设置为表示所述第二上下文结构为下一个当前上下文的“on_cpu”值;响应于所述状态域包含所述“set_by_swapcontext”值,将所述第二上下文结构的所述状态域设置为表示所述第二上下文结构为下一个当前上下文的所述“on_cpu”值;响应于所述第二上下文结构为下一个当前上下文,将与所述第二上下文结构对应的堆栈块移动至所述缓冲区内已分配堆栈块的列表的前端;以及通过来自所述第二上下文结构的值更新寄存器。6.如权利要求2所述的方法,其中执行所述状态保存操作以恢复所述缓冲区进一步包括:当所述缓冲区内已分配的堆栈块的数量大于最近使用的堆栈块的预定数量与最早使用的堆栈块的预定数量之和时:设置指向所述缓冲区中已分配堆栈块列表的开始的指针;初始化计数变量;当所述计数变量小于所述最近使用的堆栈块数量时:在永久存储位置中保存由所述指针识别的所述已分配堆栈块之一;递增所述指针和所述计数变量;以及当所述计数变量不小于所述最近使用的堆栈块的数量时:设置所述指针指向所述缓冲区中所述已分配堆栈块的列表的结尾;清除所述计数变量;以及当所述计数变量小于所述最早使用的堆栈块的数量时:在永久存储位置中保存由所述指针识别的所述已分配堆栈块之一;递增所述指针和所述计数变量。7.如权利要求2所述的方法,其中执行所述状态保存操作以恢复所述缓冲区进一步包括:当所述缓冲区内已分配的堆栈块的数量不大于最近使用的堆栈块的预定数量与最早使用的堆栈块的预定数量之和时:设置指针指向所述缓冲区中已分配堆栈块的列表的开始;当所述指针为不与所述已分配堆栈块列表的结尾对应时:在永久存储位置中保存与所述指针对应的所述已分配堆栈块之一;以及递增所述指针。8.一种计算机系统,包括:处理器;耦接于所述处理器的内存;所述内存中的缓冲区;在处理器上执行的实用程序且所述实用程序包含用于执行下述操作的代码:初始化第一协同例程的第一上下文结构;当进程...

【专利技术属性】
技术研发人员:道格拉斯W德威桑格拉姆S高曼威廉G西尔曼沙查菲恩比立特
申请(专利权)人:国际商业机器公司
类型:发明
国别省市:US[美国]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1