專利名稱:?jiǎn)⒂脿顟B(tài)保存的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理系統(tǒng),且更具體地,涉及一種啟用狀態(tài)保存 和調(diào)試操作的方法和系統(tǒng)。
背景技術(shù):
典型地,操作系統(tǒng)(OS)將虛擬內(nèi)存分為內(nèi)核空間和用戶空間。典型地,內(nèi)核空間為運(yùn)行內(nèi)核、內(nèi)核擴(kuò)展和設(shè)備驅(qū)動(dòng)程序而保留,而 用戶空間則是為用戶模式應(yīng)用而保留。為了跟蹤并控制多個(gè)進(jìn)程的執(zhí)行,OS利用調(diào)用堆棧(也稱為執(zhí)行堆棧)存儲(chǔ)關(guān)于計(jì)算機(jī)程序的活動(dòng)子例程的信息。在活動(dòng)子例程的執(zhí)行已經(jīng)完成之后,調(diào)用堆棧通過 記住每個(gè)活動(dòng)子例程應(yīng)該返回控制的點(diǎn)來(lái)監(jiān)控多個(gè)進(jìn)程的執(zhí)行??梢岳脜f(xié)同例程促使代碼移植到在OS的內(nèi)核空間操作的 一組微代碼中,從而移植的代碼無(wú)需重構(gòu),以在事件驅(qū)動(dòng)(或者掃描環(huán)) 環(huán)境中異步運(yùn)行。當(dāng)需要來(lái)自事件驅(qū)動(dòng)環(huán)境中代碼的異步回叫時(shí),在 不同的上下文(或者堆棧)上執(zhí)行移植代碼的幾個(gè)協(xié)同例程包裝掛起 相應(yīng)的操作。在回叫時(shí),協(xié)同例程包裝恢復(fù)相應(yīng)的移植代碼的上下文, 且移植的代碼繼續(xù)進(jìn)行,就好像已經(jīng)立即執(zhí)行了中斷函數(shù)調(diào)用。為了便于代碼移植,OS往往需要重構(gòu)代碼以在新環(huán)境中運(yùn)行(例如,通過提供轉(zhuǎn)換以啟用非固有異步環(huán)境中的操作)。 發(fā)明內(nèi)容本發(fā)明公開了一種針對(duì)事件驅(qū)動(dòng)環(huán)境中協(xié)同例程啟用狀態(tài)保存 和調(diào)試操作的方法、系統(tǒng)和計(jì)算機(jī)程序產(chǎn)品。堆棧管理實(shí)用程序在緩沖區(qū)(buffer)中為包括狀態(tài)域(state field)的上下文結(jié)構(gòu)和堆棧指 針分配空間。上下文管理實(shí)用程序初始化第一協(xié)同例程的第一上下文結(jié)構(gòu),并響應(yīng)于第二協(xié)同例程的執(zhí)行請(qǐng)求保存所述第一上下文結(jié)構(gòu)的 狀態(tài)。所述上下文管理實(shí)用程序?qū)⑴c所述第二協(xié)同例程相關(guān)的第二上 下文結(jié)構(gòu)設(shè)置為當(dāng)前上下文。當(dāng)完成所述當(dāng)前上下文的執(zhí)行時(shí),所述 上下文管理實(shí)用程序?qū)⑺龅谝粎f(xié)同例程的第一上下文結(jié)構(gòu)恢復(fù)為 當(dāng)前上下文。如果沒有將所述狀態(tài)域設(shè)置為有效值,狀態(tài)保存函數(shù)"狀 態(tài)保存"所有要在調(diào)試中使用的已分配協(xié)同例程堆棧和上下文結(jié)構(gòu), 然后將整個(gè)系統(tǒng)恢復(fù)為前一有效狀態(tài)并重新啟動(dòng)操作。本發(fā)明上述及另外的目的、特征和優(yōu)點(diǎn)將在下面詳細(xì)的書面說明 中變得顯而易見。
當(dāng)結(jié)合附圖閱讀本發(fā)明時(shí),參考以下說明性實(shí)施例的詳細(xì)描述可 以最好地理解本發(fā)明自身以及優(yōu)選的使用方式,進(jìn)而理解其目的和優(yōu)點(diǎn),其中圖1示出根據(jù)本發(fā)明的實(shí)施例數(shù)據(jù)處理系統(tǒng)的高級(jí)框圖;圖2示出根據(jù)本發(fā)明的實(shí)施例示范性上下文數(shù)據(jù)結(jié)構(gòu)的高級(jí)框圖;圖3為根據(jù)本發(fā)明的實(shí)施例針對(duì)事件驅(qū)動(dòng)環(huán)境中協(xié)同例程啟用狀態(tài)保存和其他調(diào)試操作的過程的高級(jí)邏輯流程圖;圖4為根據(jù)本發(fā)明的實(shí)施例分配堆棧塊的過程的高級(jí)邏輯流程圖;圖5為根據(jù)本發(fā)明的實(shí)施例解除分配堆棧塊的過程的高級(jí)邏輯 流程圖;圖6為根據(jù)本發(fā)明的實(shí)施例檢索來(lái)自協(xié)同例程的上下文信息的 過程的高級(jí)邏輯流程圖;圖7為根據(jù)本發(fā)明的實(shí)施例設(shè)置協(xié)同例程的上下文信息的過程 的高級(jí)邏輯流程圖;圖8為根據(jù)本發(fā)明的實(shí)施例實(shí)現(xiàn)作為狀態(tài)保存和緊急函數(shù)的開 始部分的堆棧塊可控狀態(tài)保存的方法的高級(jí)邏輯流程圖;以及圖9為根據(jù)本發(fā)明的實(shí)施例實(shí)現(xiàn)作為狀態(tài)保存和緊急函數(shù)的開 始部分的堆棧塊可控狀態(tài)保存的可選擇的方法的高級(jí)邏輯流程圖。
具體實(shí)施方式
本發(fā)明提供了一種針對(duì)事件驅(qū)動(dòng)環(huán)境中協(xié)同例程啟用狀態(tài)保存 和調(diào)試操作的方法、系統(tǒng)和計(jì)算機(jī)程序產(chǎn)品?,F(xiàn)在參照?qǐng)D1,該圖示出根據(jù)本發(fā)明實(shí)施例通用的數(shù)據(jù)處理系統(tǒng) 的框圖。數(shù)據(jù)處理系統(tǒng)100包含隨機(jī)存取存儲(chǔ)器(RAM) 102、處理 器104和輸入/輸出(1/0)控制器108。系統(tǒng)互連118連接處理器104、 RAM 102、存儲(chǔ)器106和1/0控制器108。數(shù)據(jù)處理系統(tǒng)100還包括 諸如硬盤驅(qū)動(dòng)器或者其他直接存取存儲(chǔ)設(shè)備的非易失存儲(chǔ)器106。 I/O 控制器108通過有線或者無(wú)線連接,諸如網(wǎng)絡(luò)線纜112為網(wǎng)絡(luò)110提 供連通性。I/O控制器108還通過I/O通信連接116 (例如線纜或者無(wú) 線連接)耦接于用戶I/O設(shè)備114 (例如,鍵盤、顯示設(shè)備、鼠標(biāo)或 者打印機(jī))。根據(jù)該說明性的實(shí)施例,數(shù)據(jù)處理系統(tǒng)100將堆棧塊132、 一個(gè) 或多個(gè)應(yīng)用128以及操作系統(tǒng)(OS)存儲(chǔ)在RAM 102中。堆棧塊132 包括協(xié)同例程堆棧148、針對(duì)協(xié)同例程的多個(gè)上下文數(shù)據(jù)結(jié)構(gòu)(此處 稱為"Ucontext,, ) 150、針對(duì)"正常"代碼的Ucontext 152以及堆??刂?154。如此處所用,正常代碼定義為典型地由數(shù)據(jù)處理系統(tǒng)100執(zhí)行 的代碼(例如,應(yīng)用128) 。 Ucontext函數(shù)(例如,"getcontext"、 "makecontext"、 "setcontext,,和"swapcontext,,)使得OS 130能夠操 縱上下文數(shù)據(jù)結(jié)構(gòu)。"getcontext"Ueontext函數(shù)使得OS 130能夠通過 與當(dāng)前正在執(zhí)行的進(jìn)程對(duì)應(yīng)的寄存器內(nèi)容對(duì)上下文結(jié)構(gòu)初始化。 "makecontext"Ucontext函數(shù)改變上下文,以l更該上下文利用不同的 堆棧。"setcontext,,Ucontext函數(shù)將當(dāng)前正在執(zhí)行的過程設(shè)置為給定的 上下文并使用與該給定的上下文對(duì)應(yīng)的一組寄存器執(zhí)行。同樣地, "swapcontext,,Ucontext函數(shù)使得OS 130能夠?qū)?dāng)前上下文保存在上 下文數(shù)據(jù)結(jié)構(gòu)中并將當(dāng)前正在執(zhí)行的上下文設(shè)置為另一個(gè)上下文。下面將要討論的圖3到圖9示出操縱協(xié)同例程的上下文數(shù)據(jù)結(jié)構(gòu)的過程 /方法。協(xié)同例程堆棧148存儲(chǔ)對(duì)應(yīng)于正在由處理器104異步執(zhí)行的協(xié)同 例程的信息。在堆棧塊132中,針對(duì)協(xié)同例程的Ucontext 150和針對(duì) 正常的Ucontext 152分別為協(xié)同例程和正常代碼存儲(chǔ)包括識(shí)別最近被 執(zhí)行代碼的位置和堆棧指針的上下文信息。根據(jù)下面討論的圖3-8中 所描述的過程,堆??刂?54使得OS130能夠管理堆棧塊132。系統(tǒng) 中每個(gè)活動(dòng)的協(xié)同例程都有相應(yīng)的已分配堆棧塊132,且堆棧塊132 被OS 130用來(lái)跟蹤多個(gè)協(xié)同例程。OS 130包括狀態(tài)保存和緊急函數(shù)(panic function ) 158、堆棧管 理實(shí)用程序160和上下文管理實(shí)用程序156。堆棧管理實(shí)用程序160 和上下文管理實(shí)用程序156使得OS 130與堆??刂?54相互作用并 且操縱堆棧塊132中的數(shù)據(jù)。每個(gè)Ucontext數(shù)據(jù)結(jié)構(gòu)150和152中的 狀態(tài)域使得OS 130能夠確定上下文是有效(即安排為待執(zhí)行)、當(dāng) 前由處理器104執(zhí)行或者尚未執(zhí)行。堆棧塊132的列表由OS 130釆 用嵌入式堆??刂?54進(jìn)行管理,從而使得OS 130能夠確定最近使 用的和最早使用的協(xié)同例程。根據(jù)下面討論的圖3-9所示的過程,狀 態(tài)保存和緊急函數(shù)158使得OS 130能夠操縱堆棧塊132。以下段落給出了狀態(tài)保存過程的概述。狀態(tài)保存是狀態(tài)保存和緊 急函數(shù)158的開始部分,它用于將數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)于永久存儲(chǔ)器供調(diào)試 操作中使用。如此處所用,"狀態(tài)保存"(state save)指的是保存與協(xié) 同例程相關(guān)的上下文信息。本發(fā)明所描述的實(shí)施例提供了一種為首次 故障數(shù)據(jù)捕獲(FFDC )狀態(tài)保存堆棧及相關(guān)結(jié)構(gòu)或者使OS 130的組 件能夠完成狀態(tài)保存的裝置,而無(wú)需不同的組件包括冗余的狀態(tài)保存 代碼。下面將討論圖3-9,其中每個(gè)圖都說明了本發(fā)明修改的狀態(tài)保 存過程的不同部分。堆棧管理實(shí)用程序160為包括狀態(tài)域的Ucontext 結(jié)構(gòu)和堆棧塊132中的堆棧指針分配空間。上下文管理實(shí)用程序156 初始化第一協(xié)同例程的第一上下文結(jié)構(gòu),并響應(yīng)于第二協(xié)同例程的執(zhí) 行請(qǐng)求保存該第一上下文結(jié)構(gòu)的狀態(tài)。上下文管理實(shí)用程序156將與第二協(xié)同例程相關(guān)的第二上下文結(jié)構(gòu)設(shè)置為當(dāng)前上下文。當(dāng)完成當(dāng)前上下文的執(zhí)行時(shí),上下文管理實(shí)用程序156將第一協(xié)同例程的第一上 下文結(jié)構(gòu)恢復(fù)為當(dāng)前上下文。當(dāng)不再需要協(xié)同例程時(shí),解除分配相應(yīng) 的堆棧塊132。如果沒有將狀態(tài)域設(shè)置為有效值,狀態(tài)保存和緊急函 數(shù)158執(zhí)行狀態(tài)保存以將堆棧塊132恢復(fù)為前一有效狀態(tài)并重新啟動(dòng) 操作。下面參照?qǐng)D2,該圖示出根據(jù)本發(fā)明的實(shí)施例由針對(duì)協(xié)同例程的 Ucontext 150和針對(duì)正常的Ucontext 152使用的示范性上下文數(shù)據(jù)結(jié) 構(gòu)200的高級(jí)框圖。上下文數(shù)據(jù)結(jié)構(gòu)200包括多個(gè)上下文數(shù)據(jù)字段 205。上下文數(shù)據(jù)字段205包括狀態(tài)域值210和堆棧指針值215。提供 狀態(tài)域值210和堆棧指針值215中所示的值僅僅是為了說明。根據(jù)該 說明性的實(shí)施例,狀態(tài)域值210包含"set—by—getcontext"值,該值表 示上下文數(shù)據(jù)結(jié)構(gòu)200通過getcontext Ucontext函數(shù)更新。同樣地, 堆棧指針值215表示進(jìn)程在協(xié)同例程堆棧148 (就針對(duì)協(xié)同例程的 Ucontext 150而言)中的位置或者進(jìn)程在正常堆棧(就針對(duì)正常的 Ucontext 152而言)中的位置。OS 130在RAM 102內(nèi)為多個(gè)上下文 數(shù)據(jù)結(jié)構(gòu)200中一個(gè)或多個(gè)活動(dòng)的協(xié)同例程存儲(chǔ)上下文信息。現(xiàn)在參照?qǐng)D3,該圖示出根據(jù)本發(fā)明的實(shí)施例針對(duì)事件驅(qū)動(dòng)環(huán)境 中的協(xié)同例程啟用狀態(tài)保存及其他調(diào)試操作的過程的高級(jí)邏輯流程 圖。響應(yīng)于OS 130執(zhí)行代碼,該過程從框300開始。如框305所示, 確定由代碼執(zhí)行的操作是否需要使用協(xié)同例程。如果代碼不需要協(xié)同 例程,該過程在框340終止。如果代碼需要協(xié)同例程,如框310所示, 堆棧管理實(shí)用程序160在堆棧塊132內(nèi)分配塊并從堆棧塊132中提取 堆棧指針。已分配的塊與協(xié)同例程相對(duì)應(yīng)。在一個(gè)實(shí)施例中,每個(gè)堆??刂?54包含與雙鏈表對(duì)應(yīng)的指針。如此處所用,雙鏈表(double linked-list)定義為包含上下文數(shù)據(jù)、 指向前一節(jié)點(diǎn)的指針和指向下一節(jié)點(diǎn)的指針的一系列節(jié)點(diǎn)(例如,堆棧塊)。堆棧管理實(shí)用程序160使用"AllocateStack"函數(shù)將已分配堆 棧塊132添加至雙鏈表的末端。同樣地,堆棧管理實(shí)用程序160使用12"DeallocateStack,,函數(shù)將上下文結(jié)構(gòu)從雙鏈表中移除。在狀態(tài)保存時(shí), 狀態(tài)保存和緊急函數(shù)158在雙鏈表的前端存取最近使用的堆棧緩沖 區(qū)。狀態(tài)保存和緊急函數(shù)158還在雙鏈表的末端存取最早使用的堆棧 緩沖區(qū),從而啟用狀態(tài)保存,將堆棧塊132保存至永久存儲(chǔ)器以便在 調(diào)試中使用。下面將要討論的圖8-9中示出了將堆棧塊132保存至永 久存儲(chǔ)器的過程?,F(xiàn)在返回圖3,如框310所示,應(yīng)用128從堆棧管理實(shí)用程序160 分配堆棧塊132中的塊。堆棧管理實(shí)用程序160將塊從未分配的(即 "空閑")堆棧塊的列表中移除。隨后,堆棧管理實(shí)用程序160內(nèi)的"分 配堆棧,,(Allocate Stack)函數(shù)將從未分配的堆棧塊列表中移除的塊 添加至已分配的堆棧塊的列表,且堆棧管理實(shí)用程序160將已分配的 堆棧塊的狀態(tài)域設(shè)置為"allocated"值。如框315所示,應(yīng)用128通過 設(shè)置針對(duì)協(xié)同例程的Ucontext 150中的值初始化將要執(zhí)行的協(xié)同例程 的上下文。然后,如框320所示,應(yīng)用128利用上下文管理實(shí)用程序 156中的"swapcontext,,Ucontext函數(shù)保存針對(duì)正常的Ucontext 152中 的當(dāng)前上下文,并且使用具有針對(duì)協(xié)同例程的Ucontext 150中規(guī)定的 環(huán)境的協(xié)同例程堆棧148開始執(zhí)行協(xié)同例程。隨后,如框325所示, 處理器104執(zhí)行協(xié)同例程的函數(shù)。如框330所示,上下文管理實(shí)用程 序156將協(xié)同例程的狀態(tài)域設(shè)置為"未巻繞的"(unwound),它發(fā)出 "回彈,,函數(shù)的信號(hào)以從RAM 102提取狀態(tài)保存值、恢復(fù)存儲(chǔ)在針對(duì) 正常的Ucontext 152中的前一上下文并利用該進(jìn)程的原始堆棧重新啟 動(dòng)操作。也可以利用包括"未巻繞的"狀態(tài)域值的上下文結(jié)構(gòu)來(lái)便于進(jìn) 行4吏內(nèi)存泄漏的調(diào)試。如此處所用,內(nèi)存泄漏(memory leak)指的 是當(dāng)程序不再需要使用內(nèi)存時(shí),由未能釋放(即解除分配)內(nèi)存的程 序無(wú)意中引起的內(nèi)存消耗。如框335所示,堆棧管理實(shí)用程序160在 與被執(zhí)行的協(xié)同例程對(duì)應(yīng)的堆棧塊132內(nèi)對(duì)塊進(jìn)行解除分配,且該過 程終止于框340。下面將要討論的圖5示出了解除分配堆棧塊的過程?,F(xiàn)在參照?qǐng)D4,該圖示出根據(jù)本發(fā)明的實(shí)施例分配堆棧塊的過程 的高級(jí)邏輯流程圖。優(yōu)選地,該過程由包括在堆棧管理實(shí)用程序160中的"分配堆棧"函數(shù)執(zhí)行,且響應(yīng)于應(yīng)用128調(diào)用"分配堆棧"函數(shù)(例 如,如圖3的框310所示),從框400開始。如框405所示,堆棧管 理實(shí)用程序160將塊從堆棧塊132中空閑(即未分配的)堆棧塊的列 表中移除。隨后,如框410所示,堆棧管理實(shí)用程序160將從空閑堆 棧塊中移除的塊添加至已分配的堆棧塊列表中。如框415所示,堆棧 管理實(shí)用程序160將已分配的堆棧塊的狀態(tài)域設(shè)置為"已分配的"值。 如框420所示,堆棧管理實(shí)用程序160將分配的堆棧塊返回調(diào)用程序, 且該過程終止于框425。如此處所用,調(diào)用程序(caller)指的是利用 堆棧塊執(zhí)行進(jìn)程的任何功能性進(jìn)程(例如,應(yīng)用128)?,F(xiàn)在參照?qǐng)D5,該圖示出根據(jù)本發(fā)明的實(shí)施例解除分配堆棧塊的 過程的高級(jí)邏輯流程圖。優(yōu)選地,該過程由包括在堆棧管理實(shí)用程序 160中的"取消分配堆棧"函數(shù)執(zhí)行,且響應(yīng)于應(yīng)用128調(diào)用"取消分配 堆棧,,函數(shù)(例如,如圖3的框335所示),從框500開始。如框505 所示,堆棧管理實(shí)用程序160將塊從堆棧塊132中已分配的堆棧塊列 表中移除。隨后,如框510所示,堆棧管理實(shí)用程序160將從已分配 的堆棧塊中移除的塊添加至未分配的(即,可用的)堆棧塊列表中。如框515所示,堆棧管理實(shí)用程序160將已分配的堆棧塊的狀態(tài)域設(shè) 置為"未分配的"值,且該過程終止于框520?,F(xiàn)在參照?qǐng)D6,該圖為根據(jù)本發(fā)明的實(shí)施例從協(xié)同例程檢索上下 文信息的過程的高級(jí)邏輯流程圖。響應(yīng)于OS 130調(diào)用 "getcontext,,Ucontext函數(shù)來(lái)發(fā)出請(qǐng)求以獲得關(guān)于協(xié)同例程或進(jìn)程的 當(dāng)前上下文上的信息,該過程從框600開始。如框605所示,上下文 管理實(shí)用程序156存儲(chǔ)與協(xié)同例程的上下文信息對(duì)應(yīng)的一個(gè)或多個(gè)寄 存器的當(dāng)前值。然后,如框610所示,上下文管理實(shí)用程序156將協(xié) 同例程的上下文結(jié)構(gòu)中的狀態(tài)域設(shè)置為"set—by—getcontext"值,且該 過程終止于框615。如此處所用,"set_by_getcontext"值表示 "set_by_getcontext"Ucontext函數(shù)更新了協(xié)同例程的上下文。參照?qǐng)D7,該圖示出根據(jù)本發(fā)明的實(shí)施例設(shè)置協(xié)同例程的上下文 信息的過程的高級(jí)邏輯流程圖。響應(yīng)于上下文管理實(shí)用程序156更新協(xié)同例程或者進(jìn)程的當(dāng)前上下文,該過程從框700開始。在框705確 定協(xié)同例程的上下文結(jié)構(gòu)中的狀態(tài)域是包含"set一by一getcontext"還是 "setby—swapcontext,,值。如此處所用,"setby—swapcontext,,表示利 用"swapcontext"Ucontext函數(shù)在上下文結(jié)構(gòu)中保存當(dāng)前上下文并且 將被執(zhí)行的上下文設(shè)置為不同的上下文(即,從一個(gè)協(xié)同例程到另一 個(gè)協(xié)同例程的異步移動(dòng)執(zhí)行)。如果協(xié)同例程的上下文結(jié)構(gòu)中的狀態(tài) 域不包含"set by—getcontext"或者"set—by swapcontext"值,如才匡710 所示,狀態(tài)保存和緊急函數(shù)158執(zhí)行狀態(tài)保存,并且該過程終止于框 735。如將在下面討論的圖8和9所示,狀態(tài)保存調(diào)用被修改的狀態(tài) 保存處理以保存堆棧塊132。在圖7中,如果協(xié)同例程的上下文結(jié)構(gòu)中的狀態(tài)域包含 "set by—getcontext"或者"setJby—swapcontext"值,如框715所示,上 下文管理實(shí)用程序156將當(dāng)前上下文的Ucontext結(jié)構(gòu)中的狀態(tài)域設(shè)置 為"onjpu,,值,說明當(dāng)前上下文正由處理器104執(zhí)行。圖7的邏輯通 過指向上下文結(jié)構(gòu)(即針對(duì)協(xié)同例程的Ucontext 150或者針對(duì)正常的 Ucontext 152)的指針調(diào)用。在框720處,代碼確定這些上下文結(jié)構(gòu) 是哪個(gè)堆棧塊132的一部分。如框725所示,堆棧管理實(shí)用程序160 將識(shí)別的塊移動(dòng)至已分配的堆棧塊列表的前端。如框730所示,上下 文管理實(shí)用程序156將與當(dāng)前協(xié)同例程對(duì)應(yīng)的一個(gè)或多個(gè)寄存器的值 更新為包括當(dāng)前上下文的上下文信息(例如,狀態(tài)域或者堆棧指針), 且該過程終止于框735。參照?qǐng)D8,該圖示出根據(jù)本發(fā)明的實(shí)施例實(shí)現(xiàn)可控的堆棧塊132 狀態(tài)保存的方法的高級(jí)邏輯流程圖。響應(yīng)于狀態(tài)保存和緊急函數(shù)158 啟動(dòng)狀態(tài)保存,該過程從步驟800開始。如步驟805所示,確定狀態(tài) 塊132中已分配塊的數(shù)量是否大于最近使用的上下文值和最早使用的 上下文值之和。在一個(gè)實(shí)施例中,最近使用的上下文值和最早使用的 上下文值由數(shù)據(jù)處理系統(tǒng)100的用戶規(guī)定。如果已分配塊的數(shù)量小于 或等于最近使用的上下文值和最早使用的上下文值之和,則該過程繼 續(xù)進(jìn)行至下面將要討論的步驟850。如果已分配塊的數(shù)量大于或等于最近使用的上下文值和最早使用的上下文值之和,如步驟810所示,狀態(tài)保存和緊急函數(shù)158設(shè)置 指針以標(biāo)記已分配堆棧塊列表的開始,且狀態(tài)保存和緊急函數(shù)158清 除(clear)計(jì)數(shù)變量。如步驟815所示,確定計(jì)數(shù)變量的值是否小于 最近使用的上下文值。如果計(jì)數(shù)變量的值小于最近使用的上下文值, 如步驟820所示,狀態(tài)保存和緊急函數(shù)158在由指針識(shí)別的堆棧塊132 內(nèi)保存該塊。隨后,如步驟825所示,狀態(tài)保存和緊急函數(shù)158遞增 計(jì)數(shù)變量和指針以識(shí)別狀態(tài)塊132中的下一個(gè)塊,且該過程返回至步 驟815。如果計(jì)數(shù)變量的值大于最近使用的上下文值,如步驟830所示, 狀態(tài)保存和緊急函數(shù)158設(shè)置指針以標(biāo)記已分配堆棧塊列表的結(jié)尾并 清除計(jì)數(shù)變量的值。如步驟835所示,確定計(jì)數(shù)變量的值是否小于最 早使用的上下文值。如果計(jì)數(shù)變量的值小于最早使用的上下文值,如 步驟840所示,狀態(tài)保存和緊急函數(shù)158將該塊保存在通過指針識(shí)別 的狀態(tài)塊132內(nèi)。隨后,如步驟845所示,狀態(tài)保存和緊急函數(shù)158 遞增計(jì)數(shù)變量和指針以識(shí)別堆棧塊132中的下一個(gè)塊,且該過程返回 至步驟835。如果計(jì)數(shù)變量的值大于或等于最早使用的上下文值,該 過程在步驟870將控制返回至狀態(tài)保存和緊急函數(shù)158的調(diào)用程序。步驟850,狀態(tài)保存和緊急函數(shù)158設(shè)置指針以標(biāo)記堆棧塊132 內(nèi)已分配的塊列表的開始。如步驟855所示,確定指針是否標(biāo)記出堆 棧塊132內(nèi)分配塊的列表的結(jié)尾。如果指針沒有標(biāo)記出已分配堆棧塊 列表的結(jié)尾,如步驟860所示,狀態(tài)保存和緊急函數(shù)158保存通過指 針識(shí)別的堆棧塊132內(nèi)的入口。隨后,如步驟865所示,狀態(tài)保存和 緊急函數(shù)158遞增指針以識(shí)別堆棧塊132內(nèi)的下一個(gè)塊,且該過程返 回至步驟855。如果指針標(biāo)記出已分配的堆棧塊列表的結(jié)尾,該過程 在步驟870將控制返回狀態(tài)保存和緊急函數(shù)158的調(diào)用程序?,F(xiàn)在轉(zhuǎn)到圖9,該圖為根據(jù)本發(fā)明實(shí)現(xiàn)單個(gè)堆棧塊的狀態(tài)保存的 可選方法的高級(jí)邏輯流程圖。響應(yīng)于狀態(tài)保存和緊急函數(shù)158啟動(dòng)狀 態(tài)保存,該過程從步驟卯O開始。如步驟905所示,狀態(tài)保存和緊急函數(shù)158基于指向堆棧塊132的當(dāng)前句柄計(jì)算一個(gè)或者多個(gè)協(xié)同例程 的句柄。如此處所用,句柄指的是識(shí)別RAM 102中的值的位置的變 量(即指針)。如步驟910所示,狀態(tài)保存和緊急函數(shù)158在狀態(tài)保 存緩沖區(qū)(未示出)中保存當(dāng)前上下文和堆??刂?54的當(dāng)前值。如步驟915所示,確定當(dāng)前協(xié)同例程的Ucontext結(jié)構(gòu)中的狀態(tài) 域是否包含"set by—getcontext,,或者"set—by—swapcontext"值。如果當(dāng) 前協(xié)同例程的Ucontext結(jié)構(gòu)中的狀態(tài)域不包含"set—by—getcontext"或 者"setJby—swapcontext"值,如步驟920所示,狀態(tài)保存和緊急函數(shù) 158保存協(xié)同例程堆棧148 (即整個(gè)堆棧)內(nèi)每個(gè)上下文的狀態(tài),該 過程終止于步驟935。如果當(dāng)前協(xié)同例程的Ucontext結(jié)構(gòu)中的狀態(tài)域包含 "set—by—getcontext,,或者"set—by—swapcontext,,值,如步驟925所示, 狀態(tài)保存和緊急函數(shù)158識(shí)別存儲(chǔ)在當(dāng)前協(xié)同例程(即在狀態(tài)保存啟 動(dòng)之前執(zhí)行的協(xié)同例程)的Ucontext結(jié)構(gòu)中的堆棧指針的位置。如步 驟930所示,狀態(tài)保存和緊急函數(shù)158保存位于堆棧指針位置與堆棧 結(jié)束之間的協(xié)同例程堆棧148的一部分(即僅為包含協(xié)同例程的上下 文結(jié)構(gòu)的堆棧塊132的一部分)中的每個(gè)上下文的狀態(tài),且該過程終 止于步驟935。因此,本發(fā)明針對(duì)事件驅(qū)動(dòng)環(huán)境中的FFDC為協(xié)同例程啟用狀 態(tài)保存和其他調(diào)試操作。數(shù)據(jù)處理系統(tǒng)100中提供上下文和堆棧管理服務(wù)的下層代碼能夠智能地、有效地且有選擇地針對(duì)FFDC保存堆棧 和上下文調(diào)試信息。包裝代碼通過利用不同的上下文在不同的堆棧上 執(zhí)行移植的代碼,掛起等待回叫的上下文,然后一旦該回叫被執(zhí)行, 就從堆?;謴?fù)該上下文。因此,本發(fā)明使得平臺(tái)或者OS組件能夠提 供分配堆棧空間、創(chuàng)建上下文以及在存儲(chǔ)于堆棧中的上下文之間交換 的服務(wù)。可以理解此處所使用的名稱僅僅是為了舉例,而并非意味著對(duì)本 發(fā)明加以任何限制。因而,本發(fā)明可以沒有限制地通過用于描述以上 設(shè)備/實(shí)用程序等的不同術(shù)語(yǔ)/專用名詞和相關(guān)功能性實(shí)現(xiàn)。盡管已經(jīng)在具有安裝軟件的全函數(shù)計(jì)算機(jī)系統(tǒng)的上下文中描述 了本發(fā)明的說明性實(shí)施例,本領(lǐng)域的技術(shù)人員可以理解本發(fā)明說明性 實(shí)施例的軟件方面能夠以多種形式作為程序產(chǎn)來(lái)發(fā)布,且本發(fā)明的說 明性實(shí)施例可以平等地應(yīng)用,而與實(shí)際用于實(shí)現(xiàn)發(fā)布的特殊類型的信 號(hào)承載介質(zhì)無(wú)關(guān)。信號(hào)承載介質(zhì)的實(shí)例包括諸如拇指驅(qū)動(dòng)器、軟盤、硬盤驅(qū)動(dòng)器、CD ROM、 DVD等可記錄型介質(zhì)以及諸如數(shù)字和模擬 通信鏈路等傳輸型介質(zhì)。盡管已經(jīng)參照優(yōu)選的實(shí)施例示出并描述了本發(fā)明,本領(lǐng)域的技術(shù) 人員可以理解,可在形式和細(xì)節(jié)上做出各種修改而不背離本發(fā)明的精 神和范圍。
權(quán)利要求
1.一種方法,包括初始化第一協(xié)同例程的第一上下文結(jié)構(gòu);當(dāng)進(jìn)程調(diào)用第二協(xié)同例程的執(zhí)行時(shí)保存所述第一上下文結(jié)構(gòu)的狀態(tài);以及將與所述第二協(xié)同例程相關(guān)的第二上下文結(jié)構(gòu)設(shè)置為當(dāng)前上下文;以及當(dāng)所述當(dāng)前上下文的執(zhí)行完成時(shí),將所述第一協(xié)同例程的所述第一上下文結(jié)構(gòu)恢復(fù)為下一個(gè)當(dāng)前上下文。
2. 如權(quán)利要求l所述的方法,進(jìn)一步包括在緩沖區(qū)中分配上下文結(jié)構(gòu)和堆棧指針,其中所述上下文結(jié)構(gòu)包 括狀態(tài)域;以及執(zhí)行狀態(tài)保存操作,以響應(yīng)于所述狀態(tài)域不被設(shè)置為有效值恢復(fù) 所述緩沖區(qū)。
3. 如權(quán)利要求2所述的方法,其中 初始化所述第一協(xié)同例程的第一上下文結(jié)構(gòu)進(jìn)一步包括從可用堆棧塊的列表移除所述緩沖區(qū)中的堆棧塊; 將所述堆棧塊添加至已分配堆棧塊的列表; 將所述第一上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為"已分配的" 值;以及將所述堆棧塊提供給與所述第一上下文結(jié)構(gòu)對(duì)應(yīng)的調(diào)用程序;且 將所述第一上下文結(jié)構(gòu)恢復(fù)為下一個(gè)當(dāng)前上下文進(jìn)一步包括 從已分配堆棧塊的列表移除所述緩沖區(qū)中的堆棧塊; 將所述堆棧塊添加至可用堆棧塊的列表;以及 將所述第二上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為"未分配的"值。
4. 如權(quán)利要求2所述的方法,其中保存所述第一上下文結(jié)構(gòu)的 所述狀態(tài)進(jìn)一步包括將與第 一上下文結(jié)構(gòu)對(duì)應(yīng)的當(dāng)前值從寄存器保存到永久存儲(chǔ)位置;以及將所述第一上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為 "setby—getcontext,,值。
5. 如權(quán)利要求1所述的方法,其中將與所述第二協(xié)同例程相關(guān) 的所述第二上下文結(jié)構(gòu)設(shè)置為當(dāng)前上下文進(jìn)一步包括響應(yīng)于所述狀態(tài)域不具有"set一by—getcontext"值并且所述狀態(tài) 域不具有"set—by—swapcontext"值,執(zhí)行狀態(tài)保存操作以將所述緩沖 區(qū)恢復(fù)為最近有效狀態(tài),其中完成了首次故障數(shù)據(jù)捕獲(FFDC);響應(yīng)于所述狀態(tài)域包含所述"set—by—getcontext"值,將所述第二 上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為表示所述第二上下文結(jié)構(gòu)為下一個(gè) 當(dāng)前上下文的"on—cpu"值;響應(yīng)于所述狀態(tài)域包含所述"setJ)y—swapcontext"值,將所述第 二上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為表示所述第二上下文結(jié)構(gòu)為下一 個(gè)當(dāng)前上下文的所述"on—cpu"值;響應(yīng)于所述第二上下文結(jié)構(gòu)為下一個(gè)當(dāng)前上下文,將與所述第二 上下文結(jié)構(gòu)對(duì)應(yīng)的堆棧塊移動(dòng)至所述緩沖區(qū)內(nèi)已分配堆棧塊的列表 的前端;以及通過來(lái)自所述第二上下文結(jié)構(gòu)的值更新寄存器。
6. 如權(quán)利要求2所述的方法,其中執(zhí)行所述狀態(tài)保存操作以恢 復(fù)所述緩沖區(qū)進(jìn)一步包括當(dāng)所述緩沖區(qū)內(nèi)已分配的堆棧塊的數(shù)量大于最近使用的堆棧塊 的預(yù)定數(shù)量與最早使用的堆棧塊的預(yù)定數(shù)量之和時(shí)設(shè)置指向所述緩沖區(qū)中已分配堆棧塊列表的開始的指針; 初始化計(jì)數(shù)變量; 當(dāng)所述計(jì)數(shù)變量小于所述最近使用的堆棧塊數(shù)量時(shí)在永久存儲(chǔ)位置中保存由所述指針識(shí)別的所述已分配堆棧 塊之一;遞增所述指針和所述計(jì)數(shù)變量;以及當(dāng)所述計(jì)數(shù)變量不小于所述最近使用的堆棧塊的數(shù)量時(shí)設(shè)置所述指針指向所述緩沖區(qū)中所述已分配堆棧塊的列表的結(jié)尾;清除所述計(jì)數(shù)變量;以及當(dāng)所述計(jì)數(shù)變量小于所述最早使用的堆棧塊的數(shù)量時(shí)在永久存儲(chǔ)位置中保存由所述指針識(shí)別的所述已分配堆棧塊之一;遞增所述指針和所述計(jì)數(shù)變量。
7. 如權(quán)利要求2所述的方法,其中執(zhí)行所述狀態(tài)保存操作以恢 復(fù)所述緩沖區(qū)進(jìn)一步包括當(dāng)所述緩沖區(qū)內(nèi)已分配的堆棧塊的數(shù)量不大于最近使用的堆棧 塊的預(yù)定數(shù)量與最早使用的堆棧塊的預(yù)定數(shù)量之和時(shí)設(shè)置指針指向所述緩沖區(qū)中已分配堆棧塊的列表的開始; 當(dāng)所述指針為不與所述已分配堆棧塊列表的結(jié)尾對(duì)應(yīng)時(shí)在永久存儲(chǔ)位置中保存與所述指針對(duì)應(yīng)的所述已分配堆棧 塊之一;以及遞增所述指針。
8. —種計(jì)算機(jī)系統(tǒng),包括 處理器;耦接于所述處理器的內(nèi)存; 所述內(nèi)存中的緩沖區(qū);在處理器上執(zhí)行的實(shí)用程序且所述實(shí)用程序包含用于執(zhí)行下述 操作的代碼初始化第一協(xié)同例程的第一上下文結(jié)構(gòu); 當(dāng)進(jìn)程調(diào)用執(zhí)行第二協(xié)同例程時(shí),保存所述第一上下文結(jié) 構(gòu)的狀態(tài);當(dāng)進(jìn)程調(diào)用執(zhí)行第二協(xié)同例程時(shí),將與所述第二協(xié)同例程 相關(guān)的第二上下文結(jié)構(gòu)設(shè)置為當(dāng)前上下文;以及 當(dāng)完成所述當(dāng)前上下文的執(zhí)行時(shí),將所述第一協(xié)同例程的第一上下文結(jié)構(gòu)恢復(fù)為下一個(gè)當(dāng)前上下文。
9. 如權(quán)利要求8所述的計(jì)算機(jī)系統(tǒng),其中所述實(shí)用程序進(jìn)一步 包括用于執(zhí)行下述操作的代碼在緩沖區(qū)中分配上下文結(jié)構(gòu)和堆棧指針,其中所述上下文結(jié)構(gòu)包 括狀態(tài)域;以及響應(yīng)于所述狀態(tài)域未被設(shè)置為有效值,執(zhí)行狀態(tài)保存操作以恢復(fù) 所述緩沖區(qū)。
10. 如權(quán)利要求9所述的計(jì)算機(jī)系統(tǒng),其中 用于初始化所述第一協(xié)同例程的所述第一上下文結(jié)構(gòu)的所述代碼進(jìn)一步包括用于執(zhí)行下述操作的代碼從可用堆棧塊的列表移除所述緩沖區(qū)內(nèi)的堆棧塊; 將所述堆棧塊添加至已分配堆棧塊的列表; 將所述第一上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為"已分配的" 值;以及將所述堆棧塊提供給與所述第一上下文結(jié)構(gòu)對(duì)應(yīng)的調(diào)用程序;并且用于將所述第一上下文結(jié)構(gòu)恢復(fù)為下一個(gè)當(dāng)前上下文的所述代碼進(jìn)一步包括用于執(zhí)行下述操作的代碼從已分配堆棧塊的列表移除所述緩沖區(qū)內(nèi)的堆棧塊; 將所述堆棧塊添加至可用堆棧塊的列表;以及 將所述第二上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為"未分配的"值。
11. 如權(quán)利要求9所述的計(jì)算機(jī)系統(tǒng),其中用于保存所述第一上 下文結(jié)構(gòu)的所述狀態(tài)的所述代碼進(jìn)一步包括用于執(zhí)行下述操作的代 碼將與第一上下文結(jié)構(gòu)對(duì)應(yīng)的所述當(dāng)前值從寄存器保存到永久存 儲(chǔ)位置;以及將所述第一上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為 "setby—getcontext,,值。
12. 如權(quán)利要求8所述的計(jì)算機(jī)系統(tǒng),其中用于將與所述第二協(xié) 同例程相關(guān)的所述第二上下文結(jié)構(gòu)設(shè)置為所述當(dāng)前上下文的所述代 碼進(jìn)一步包括用于執(zhí)行下述操作的代碼響應(yīng)于所述狀態(tài)域不具有"set—by—getcontext"值并且所述狀態(tài) 域不具有"set_by—swapcontext,,值,執(zhí)行狀態(tài)保存操作以將所述緩沖 區(qū)恢復(fù)為最近有效狀態(tài),其中完成了首次故障數(shù)據(jù)捕獲(FFDC);響應(yīng)于所述狀態(tài)域包含所述"set一by一getcontext"值,將所述第二 上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為表示所述第二上下文結(jié)構(gòu)為下一個(gè) 當(dāng)前上下文的"on—cpu"值;響應(yīng)于所述狀態(tài)域包含所述"set一by一swapcontext"值,將所述第 二上下文結(jié)構(gòu)的所述狀態(tài)域設(shè)置為表示所述第二上下文結(jié)構(gòu)為下一 個(gè)當(dāng)前上下文的所述"onjpu"值;響應(yīng)于所述第二上下文結(jié)構(gòu)為下一個(gè)當(dāng)前上下文,將與所述第二 上下文結(jié)構(gòu)對(duì)應(yīng)的堆棧塊移動(dòng)至所述緩沖區(qū)內(nèi)已分配堆棧塊的列表 的前端;以及通過來(lái)自所述第二上下文結(jié)構(gòu)的值更新寄存器。
13. 如權(quán)利要求8所述的計(jì)算機(jī)系統(tǒng),其中用于執(zhí)行所述狀態(tài)保 存操作以恢復(fù)所述緩沖區(qū)的所述代碼進(jìn)一步包括用于執(zhí)行下述操作 的代碼當(dāng)所述緩沖區(qū)內(nèi)已分配的堆棧塊的數(shù)量大于最近使用的堆棧塊 的預(yù)定數(shù)量與最早使用的堆棧塊的預(yù)定數(shù)量之和時(shí)設(shè)置指向所述緩沖區(qū)中已分配堆棧塊列表的開始的指針; 初始化計(jì)數(shù)變量; 當(dāng)所述計(jì)數(shù)變量小于所述最近使用的堆棧塊數(shù)量時(shí)在永久存儲(chǔ)位置中保存由所述指針識(shí)別的所述已分配堆 棧塊之一;遞增所述指針和所述計(jì)數(shù)變量;以及 當(dāng)所述計(jì)數(shù)變量不小于所述最近使用的堆棧塊的數(shù)量時(shí)設(shè)置所述指針指向所述緩沖區(qū)中所述已分配堆棧塊的列表的結(jié)尾;清除所述計(jì)數(shù)變量;以及 當(dāng)所述計(jì)數(shù)變量小于所述最早使用的堆棧塊的數(shù)量時(shí)在永久存儲(chǔ)位置中保存由所述指針識(shí)別的所述已分配堆棧 塊之一;遞增所述指針和所述計(jì)數(shù)變量。
14.如權(quán)利要求9所述的計(jì)算機(jī)系統(tǒng),其中用于執(zhí)行所述狀態(tài)保 存操作以恢復(fù)所述緩沖區(qū)的所述代碼進(jìn)一步包括用于執(zhí)行下述操作 的代碼當(dāng)所述緩沖區(qū)內(nèi)已分配的堆棧塊的數(shù)量不大于最近使用的堆棧 塊的預(yù)定數(shù)量與最早使用的堆棧塊的預(yù)定數(shù)量之和時(shí)設(shè)置指針指向所述緩沖區(qū)中已分配堆棧塊的列表的開始; 當(dāng)所述指針為不與所述已分配堆棧塊列表的結(jié)尾對(duì)應(yīng)時(shí)在永久存儲(chǔ)位置中保存與所述指針對(duì)應(yīng)的所述已分配堆棧 塊之一;以及遞增所述指針。
全文摘要
一種針對(duì)事件驅(qū)動(dòng)環(huán)境中的首次故障數(shù)據(jù)捕獲(FFDC)為協(xié)同例程啟用狀態(tài)保存和調(diào)試操作的方法。堆棧管理實(shí)用程序在緩沖區(qū)中為包括狀態(tài)域和堆棧指針的上下文結(jié)構(gòu)分配空間。上下文管理實(shí)用程序初始化第一協(xié)同例程的第一上下文結(jié)構(gòu),并響應(yīng)于第二協(xié)同例程保存第一上下文結(jié)構(gòu)的狀態(tài)。上下文管理實(shí)用程序?qū)⒌诙舷挛慕Y(jié)構(gòu)設(shè)置為當(dāng)前上下文。當(dāng)完成當(dāng)前上下文的執(zhí)行時(shí),上下文管理實(shí)用程序?qū)⒌谝粎f(xié)同例程的第一上下文結(jié)構(gòu)恢復(fù)為當(dāng)前上下文。如果狀態(tài)域未被設(shè)置為有效值,狀態(tài)保存函數(shù)“狀態(tài)保存”所有已分配的協(xié)同例程堆棧和上下文結(jié)構(gòu)、將整個(gè)系統(tǒng)恢復(fù)為前一有效狀態(tài)并且重新啟動(dòng)操作。
文檔編號(hào)G06F9/50GK101261593SQ20081008134
公開日2008年9月10日 申請(qǐng)日期2008年2月25日 優(yōu)先權(quán)日2007年3月7日
發(fā)明者威廉·G.·西爾曼, 桑格拉姆·S.·高曼, 沙查·菲恩比立特, 道格拉斯·W.·德威 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司