專利名稱::在系統(tǒng)崩潰時提取日志和追蹤緩沖器的方法和系統(tǒng)的制作方法
技術領域:
:本發(fā)明涉及在操作系統(tǒng)發(fā)生故障之后提取數(shù)據(jù),并更具體地涉及在操作系統(tǒng)發(fā)生故障之后從日志和追蹤緩沖器中提取數(shù)據(jù)。
背景技術:
:日志記錄和追蹤工具收集與在計算系統(tǒng)上運行的程序相關的關鍵信息(即,日志和追蹤數(shù)據(jù))。所收集的信息首先被寫入存儲器緩沖器,并隨后被記錄在永久性存儲媒體(例如硬盤)上的文件中。不同于日志和追蹤工具的實用工具被用來分析所收集和記錄的日志和追蹤數(shù)據(jù)。當發(fā)生系統(tǒng)崩潰時,日志和追蹤數(shù)據(jù)對于問題確定是重要的,但該數(shù)據(jù)在發(fā)生系統(tǒng)崩潰之前可能未被完整地寫出到永久性存儲裝置。典型地,日志和追蹤數(shù)據(jù)的最重要的部分是距離崩潰時間最近時所收集的數(shù)據(jù),但是這些數(shù)據(jù)也是最可能從永久性存儲文件中丟失的部分。傳統(tǒng)的技術嘗試在系統(tǒng)崩潰時解決對存儲于緩沖器中的日志或追蹤數(shù)據(jù)進行檢索,所述技術包括內(nèi)核等級調(diào)試器、崩潰轉(zhuǎn)儲工具以及LinuxKernelMessagesDump工具(kmsgdump)。內(nèi)核等級調(diào)試器是有限制的,因為它們需要重新創(chuàng)建系統(tǒng)問題,并且無法自動記錄緩沖器內(nèi)容。崩潰轉(zhuǎn)儲工具(例如LinuxKernelCrashDump(LKCD)和用于Linux的內(nèi)存儲器核轉(zhuǎn)儲系統(tǒng))受到下述限制,所述限制包括時間消耗,以及當僅有相對較小部分的存儲器包括了所想要的緩沖器時對整個系統(tǒng)存儲器或大部分的存儲器進行的效率很低的轉(zhuǎn)儲。另外,不需要的開發(fā)和維護成本與必須被構建在崩潰轉(zhuǎn)儲工具或從轉(zhuǎn)儲數(shù)據(jù)中提取想要的緩沖器的單獨的實用工具之中的智能有關。因為此智能必須對于每個日志或追蹤工具進行定制,所以包括了額外的開發(fā)成本。kmsgdump工具在崩潰時從系統(tǒng)提取消息,并將其傳送到軟盤,但是必須對于每個設備開發(fā)和維護定制起來昂貴并且依賴于硬件的代碼。因此,需要一種用于在系統(tǒng)崩潰時從緩沖器中提取日志和追蹤數(shù)據(jù)的改進技術。
發(fā)明內(nèi)容在第一實施例中,本發(fā)明提供了一種用于在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的方法,其中在所述故障之前在所述緩沖器中存儲所述數(shù)據(jù),所述方法包括在所述故障之前注冊應用,所述注冊包括標識數(shù)據(jù)所駐留的緩沖器,由所述應用在所述緩沖器中存儲所述數(shù)據(jù),所述應用在所述操作系統(tǒng)中執(zhí)行;保留所述緩沖器,所述保留將駐留于所述緩沖器中的所述數(shù)據(jù)維護為從所述操作系統(tǒng)響應于所述故障而啟動重新引導直到完成所述重新引導均未改變,所述重新引導是快速重新引導;在所述重新引導期間生成內(nèi)存儲器文件,所述內(nèi)存儲器文件指向駐留于所述緩沖器中的所述數(shù)據(jù),并且所述內(nèi)存儲器文件被存儲在所述易失性存儲器中而不是永久性存儲媒體中;以及經(jīng)由對所述內(nèi)存儲器文件操作的指令來提取所述數(shù)據(jù),所述指令在所述重新引導的所述完成之后由所述應用執(zhí)行。在第二實施例中,本發(fā)明提供了一種用于在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的系統(tǒng),其中在所述故障之前在所述緩沖器中存儲所述數(shù)據(jù),所述系統(tǒng)包括用于在所述故障之前注冊應用的裝置,所述注冊包括用于標識數(shù)據(jù)所駐留的緩沖器的裝置,由所述應用在所述緩沖器中存儲所述數(shù)據(jù),所述應用在所述操作系統(tǒng)中執(zhí)行;用于保留所述緩沖器的裝置,所述保留將駐留于所述緩沖器中的所述數(shù)據(jù)維護為從所述操作系統(tǒng)響應于所述故障而啟動重新引導直到完成所述重新引導均未改變,所述重新引導是快速重新引導;用于在所述重新引導期間生成內(nèi)存儲器文件的裝置,所述內(nèi)存儲器文件指向駐留于所述緩沖器中的所述數(shù)據(jù),并且所述內(nèi)存儲器文件被存儲在所述易失性存儲器中而不是永久性存儲媒體中;以及用于經(jīng)由對所述內(nèi)存儲器文件操作的指令來提取所述數(shù)據(jù)的裝置,所述指令在所述重新引導的所述完成之后由所述應用執(zhí)行。在第三實施例中,本發(fā)明提供了至少一個機器可讀的程序存儲設備,其有形地包括可被機器執(zhí)行的至少一個指令程序,用以執(zhí)行一種在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的方法,所述方法包括在所述故障之前注冊應用,所述注冊包括標識數(shù)據(jù)所駐留的緩沖器,由所述應用在所述緩沖器中存儲所述數(shù)據(jù),所述應用在所述操作系統(tǒng)中執(zhí)行;保留所述緩沖器,所述保留將駐留于所述緩沖器中的所述數(shù)據(jù)維護為從所述操作系統(tǒng)響應于所述故障而啟動重新引導直到完成所述重新引導均未改變,所述重新引導是快速重新引導;在所述重新引導期間生成內(nèi)存儲器文件,所述內(nèi)存儲器文件指向駐留于所述緩沖器中的所述數(shù)據(jù),并且所述內(nèi)存儲器文件被存儲在所述易失性存儲器中而不是永久性存儲媒體中;以及經(jīng)由對所述內(nèi)存儲器文件操作的指令來提取所述數(shù)據(jù),所述指令在所述重新引導的所述完成之后由所述應用執(zhí)行。在第四實施例中,本發(fā)明提供了一種用于部署計算基礎設施的方法,包括將計算機可讀代碼集成到計算系統(tǒng)中,其中所述代碼與所述計算系統(tǒng)相結(jié)合能夠執(zhí)行在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的過程,其中在所述故障之前在所述緩沖器中存儲所述數(shù)據(jù),所述過程包括在所述故障之前注冊應用,所述注冊包括標識數(shù)據(jù)所駐留的緩沖器,由所述應用在所述緩沖器中存儲所述數(shù)據(jù),所述應用在所述操作系統(tǒng)中執(zhí)行;保留所述緩沖器,所述保留將駐留于所述緩沖器中的所述數(shù)據(jù)維護為從所述操作系統(tǒng)響應于所述故障而啟動重新引導直到完成所述重新引導均未改變,所述重新引導是快速重新引導;在所述重新引導期間生成內(nèi)存儲器文件,所述內(nèi)存儲器文件指向駐留于所述緩沖器中的所述數(shù)據(jù),并且所述內(nèi)存儲器文件被存儲在所述易失性存儲器中而不是永久性存儲媒體中;以及經(jīng)由對所述內(nèi)存儲器文件操作的指令來提取所述數(shù)據(jù),所述指令在所述重新引導的所述完成之后由所述應用執(zhí)行。有利地,本發(fā)明通過提供用于在系統(tǒng)崩潰之后獲得日志和追蹤緩沖器的內(nèi)容的可靠的方法和系統(tǒng),增強了操作系統(tǒng)的可服務性,其中所述內(nèi)容已在崩潰之前被保存。緩沖器內(nèi)容被提取而不會由于崩潰導致丟失任何日志和追蹤信息。在系統(tǒng)重新引導之后,本發(fā)明提供了允許寫出緩沖器內(nèi)容的易于使用的接口。本發(fā)明提供了新穎的基礎設施,其可以被任何應用、工具或?qū)嵱霉ぞ哂脕碓谙到y(tǒng)崩潰時保留其緩沖器數(shù)據(jù)。即,這里所公開的新穎的基礎設施是可被多種應用、工具和實用工具共享的公共基礎設施,從而避免了對多種提取機制(每種機制具有被定制用于特定應用、工具或?qū)嵱霉ぞ叩木幋a)的需要。此外,由于本發(fā)明在內(nèi)核層中實現(xiàn),所以易于防止黑客對所公開方法的濫用。圖1是根據(jù)本發(fā)明實施例的用于在操作系統(tǒng)發(fā)生故障后提取緩沖器數(shù)據(jù)的系統(tǒng)的框圖。圖2是描述根據(jù)本發(fā)明實施例的提取圖1的系統(tǒng)的緩沖器的數(shù)據(jù)的過程的流程圖。圖3A描述根據(jù)本發(fā)明實施例的圖2的元數(shù)據(jù)存儲圖1的緩沖器的存儲器區(qū)域。圖3B描述根據(jù)本發(fā)明實施例的圖2的存儲保留模塊保留圖3A的存儲器區(qū)域。圖3C描述根據(jù)本發(fā)明實施例的圖2的緩沖器提取模塊從圖3A的存儲器區(qū)域提取緩沖器。圖4描述根據(jù)本發(fā)明實施例的用于實現(xiàn)提取圖1的系統(tǒng)的緩沖器的數(shù)據(jù)的計算機系統(tǒng)。具體實施例方式本發(fā)明的方法和系統(tǒng)公開了一種單一的、公用的、高效的機制,該機制可以由操作系統(tǒng)提供給操作系統(tǒng)資源的用戶(例如應用和設備驅(qū)動程序),并且可以在系統(tǒng)崩潰時提取日志或追蹤緩沖器數(shù)據(jù)。當計算系統(tǒng)正運行在系統(tǒng)崩潰之前就運行的操作系統(tǒng)的第一實例之時存儲所述日志或追蹤緩沖器數(shù)據(jù),并且當操作系統(tǒng)的第二實例正在運行時進行數(shù)據(jù)提取。由響應于系統(tǒng)崩潰而執(zhí)行的快速重新引導來生成所述第二實例。定義以下定義適用于這里所公開的本發(fā)明操作系統(tǒng)通過充當軟件程序和系統(tǒng)硬件之間的接口而管理計算系統(tǒng)并使得軟件程序在計算系統(tǒng)上的運行更便利的軟件。操作系統(tǒng)的功能包括管理硬件(例如隨機存取存儲器(RAM)、硬盤、打印機、軟盤驅(qū)動器、CD-ROM驅(qū)動器、聲卡和視頻卡以及其它設備)、向用戶提供圖形界面、確保系統(tǒng)的安全性、以及提供網(wǎng)絡基礎設施。內(nèi)核任何操作系統(tǒng)的核心部件。內(nèi)核充當硬件和其它系統(tǒng)部件(軟件程序、設備驅(qū)動程序等)之間的接口。內(nèi)核在“特權”級別運行,并可以執(zhí)行對硬件的大多數(shù)的允許操作。設備驅(qū)動程序管理計算系統(tǒng)中的特定硬件設備的軟件。設備驅(qū)動程序在與內(nèi)核相同的特權級別運行。設備驅(qū)動程序的示例包括鍵盤驅(qū)動程序和網(wǎng)卡驅(qū)動程序。系統(tǒng)崩潰操作系統(tǒng)(并且由此導致其它軟件)發(fā)生故障或者檢測到其無法繼續(xù)的狀態(tài)。系統(tǒng)崩潰的原因包括訪問無效存儲器區(qū)域、數(shù)據(jù)訛誤或死鎖。日志記錄工具應用或設備驅(qū)動程序在系統(tǒng)工作期間捕獲服務成員的必要信息的機制。信息或“日志”(也稱作日志數(shù)據(jù))首先被寫入作為(例如隨機存取存儲器中的)存儲器區(qū)域的一個或多個緩沖器,并隨后(例如以一個或多個文件的形式)被傳送到存儲媒體或設備,諸如硬盤或軟盤。編寫與日志記錄工具不同的實用工具或工具來分析日志數(shù)據(jù)。日志記錄工具的示例是Linux操作系統(tǒng)內(nèi)核中的syslog機制。追蹤工具追蹤軟件的特定部分中的代碼流的機制。與通過日志記錄工具收集日志數(shù)據(jù)類似,追蹤工具首先將其收集的數(shù)據(jù)(也稱作追蹤數(shù)據(jù))寫入緩沖器,并隨后將所述數(shù)據(jù)傳送到存儲媒體/設備上的文件。追蹤工具的示例是Linux操作系統(tǒng)內(nèi)核的dprobes追蹤工具。引導將計算機系統(tǒng)引至可用狀態(tài)的過程。引導包括下述步驟,諸如驗證附接于系統(tǒng)的設備、運行操作系統(tǒng)、初始化各種設備等等。重新引導退出或關閉當前的操作系統(tǒng)上下文并重新進行“引導”定義中描述的引導過程的過程。在重新引導期間,能夠切換到不同的內(nèi)核、不同的設備驅(qū)動程序或甚至完全不同的操作系統(tǒng)??焖僦匦乱龑У奶卣鳟斉c操作系統(tǒng)一起工作時,系統(tǒng)重新引導的時間是主要瓶頸。例如,在生產(chǎn)系統(tǒng)中,系統(tǒng)可用性是重要需求,并且軟件開發(fā)者在其工作期間需要多次重新引導系統(tǒng),二者都需要一種快速重新引導系統(tǒng)并使系統(tǒng)返回工作狀況的方法。通過“快速重新引導”特征來提供這種方法。如果未執(zhí)行快速重新引導,則系統(tǒng)重新引導的典型階段如下(1)當前系統(tǒng)被關閉。文件系統(tǒng)被卸載,文件被寫回存儲媒體,并且應用被終止;(2)將控制移交給系統(tǒng)固件或者基本輸入/輸出系統(tǒng)(BIOS),以執(zhí)行基本操作,諸如檢查系統(tǒng)上存在的設備、復位設備、清除系統(tǒng)存儲器等等;(3)固件或BIOS將控制移交給引導加載程序。該引導加載程序加載操作系統(tǒng)內(nèi)核,并將控制移交給該內(nèi)核;以及(4)操作系統(tǒng)內(nèi)核啟用系統(tǒng)中的處理器、初始化設備、安裝文件系統(tǒng)、加載應用并將系統(tǒng)引至可用狀況(例如,操作系統(tǒng)準備好與用戶聯(lián)系)。如上所述,當操作系統(tǒng)在沒有快速重新引導的情況下進行重新引導時,固件或者基本輸入/輸出系統(tǒng)(BIOS)擦除系統(tǒng)存儲器內(nèi)容(即,在重新引導被完全擦除之前存在的內(nèi)核中的存儲器內(nèi)容)。與之相反,當系統(tǒng)執(zhí)行快速重新引導時,上述的階段(2)和(3)被跳過。因此,快速重新引導避免了系統(tǒng)存儲器清除過程,并且之前的內(nèi)核中的存儲器內(nèi)容(即,在快速重新引導之前存在的內(nèi)核)在快速重新引導之后仍保持可用。用于Linux內(nèi)核的快速重新引導特征的一個示例是kexec,在http://www-106.ibm.com/developerworks/linux/library/l-kexec.html以及可在http://www.osdl.org/docs/reducing_system_reboot_time_with_kexec.pdf找到的Pfiffer、Andy的“ReducingSystemRebootTimeWithkexec”(OpenSourceDevelopmentLabs,Inc.)中均對其進行了描述。本發(fā)明使用了快速重新引導特征及其從一個內(nèi)核保留到下一個內(nèi)核的存儲器內(nèi)容的副效益,以在系統(tǒng)崩潰之后提取(即獲取)緩沖器數(shù)據(jù)。在下文中,除非另外說明,否則術語“重新引導”指代使用快速重新引導特征的重新引導。系統(tǒng)概述圖1是根據(jù)本發(fā)明實施例的用于在操作系統(tǒng)發(fā)生故障后提取緩沖器數(shù)據(jù)的系統(tǒng)的框圖。在系統(tǒng)100中,日志記錄工具或追蹤工具經(jīng)由接口106從緩沖器104提取數(shù)據(jù)。所述日志記錄工具或追蹤工具駐留于例如操作系統(tǒng)內(nèi)核(未示出)之中。將被提取的數(shù)據(jù)在系統(tǒng)崩潰之前被收集和保存,并在重新引導期間可用。如這里所使用的,下文的“重新引導期間”(即,“系統(tǒng)崩潰期間”)被定義為在從就在系統(tǒng)崩潰之前存在的操作系統(tǒng)的第一實例(即,第一上下文)到響應于所述崩潰而執(zhí)行的重新引導所生成的操作系統(tǒng)的第二實例(即,第二上下文)的轉(zhuǎn)換之后。接口106由本發(fā)明提供,并包括多種模塊,所述模塊包括構建在操作系統(tǒng)內(nèi)核之中的基礎設施。所述基礎設施允許日志記錄和追蹤工具快速地和容易地訪問它們各自的緩沖器,所述緩沖器的內(nèi)容在系統(tǒng)崩潰之前被保存并被保留,從而這些內(nèi)容可以在重新引導之后訪問。以下相對于圖2描述了包括所述基礎設施的模塊。緩沖器提取過程圖2是描述根據(jù)本發(fā)明實施例的提取圖1的系統(tǒng)的緩沖器的數(shù)據(jù)的過程的流程圖。提取緩沖器的數(shù)據(jù)或提取緩沖器的內(nèi)容在此也被簡稱為提取緩沖器或緩沖器提取。在步驟200開始緩沖器提取過程。注冊模塊202將自身注冊到緩沖器追蹤模塊204。在可替換實施例中,多個注冊模塊注冊到緩沖器追蹤模塊204。注冊模塊是在操作系統(tǒng)中執(zhí)行的軟件應用,并且包括例如被設計用于問題確定任務的應用、工具和實用工具,諸如日志記錄工具和追蹤工具。下文中,術語“應用”、“實用工具”和“工具”被互換地使用,并被特別地指代在系統(tǒng)崩潰之前在易失性存儲器的區(qū)域中存儲數(shù)據(jù)的軟件,其中所述數(shù)據(jù)將在崩潰之后被提取出來。由注冊模塊202進行的注冊包括向緩沖器追蹤模塊204請求標識出存儲數(shù)據(jù)的易失性存儲器中的存儲器區(qū)域(即緩沖器),所述數(shù)據(jù)需要在重新引導期間可用(例如日志記錄工具所需的緩沖器數(shù)據(jù))。在注冊模塊202所標識的存儲器區(qū)域中存儲所述數(shù)據(jù)。即,所標識的存儲器區(qū)域在系統(tǒng)崩潰之前存儲數(shù)據(jù),并且本發(fā)明使得該數(shù)據(jù)可以在響應于崩潰而執(zhí)行的對操作系統(tǒng)的重新引導之后進行訪問。前述的由注冊模塊202執(zhí)行的標識在此也被簡稱為標識出將在重新引導期間保留的存儲器區(qū)域。例如,一應用在其操作期間創(chuàng)建和使用數(shù)據(jù)結(jié)構1到10。由于該應用為這些數(shù)據(jù)結(jié)構分配存儲器,因此該應用了解所分配的存儲器總量以及與每一數(shù)據(jù)結(jié)構相關聯(lián)的存儲器地址。當此應用請求向緩沖器追蹤模塊204注冊時,該應用將數(shù)據(jù)結(jié)構1標識為其存儲器區(qū)域需要在重新引導期間保留的數(shù)據(jù)結(jié)構。注冊請求通過包括分配給數(shù)據(jù)結(jié)構1的存儲器總量以及數(shù)據(jù)結(jié)構1的起始存儲器地址而標識該存儲器區(qū)域。通過注冊模塊202進行的注冊被緩沖器追蹤模塊204所接受。對于每次注冊,緩沖器追蹤模塊204記錄請求過注冊的注冊模塊以及注冊中所標識的存儲器區(qū)域,并將所標識的存儲器區(qū)域信息存儲在元數(shù)據(jù)206(即,一個或多個數(shù)據(jù)結(jié)構)中。如這里所使用的,存儲器區(qū)域信息被定義為存儲器區(qū)域所需要的存儲器總量以及存儲器區(qū)域的基本存儲器地址,諸如該區(qū)域的起始地址。元數(shù)據(jù)206由緩沖器追蹤模塊204所維護,并使其在重新引導期間可用,如下所述。元數(shù)據(jù)206包括注冊名稱、注冊模塊202所需的存儲器區(qū)域的大小、注冊模塊202所需的存儲器區(qū)域的列表。注冊名稱標識了進行注冊請求的注冊模塊202,并在重新引導之后被用來將請求中包括的所存儲的存儲器區(qū)域信息關聯(lián)于進行請求的注冊模塊。存儲器區(qū)域的列表例如是把指示出將要保留的存儲器區(qū)域的起始地址以及存儲器區(qū)域的大小的列表的每個節(jié)點鏈接起來的列表。元數(shù)據(jù)206的存儲位置是存儲器中的固定位置或者下述存儲器地址,其在第一內(nèi)核中存在,并被傳遞到響應于系統(tǒng)崩潰而執(zhí)行的快速重新引導期間被引導的第二內(nèi)核,如下所述。本領域技術人員將了解,已存在用于將地址傳遞給第二內(nèi)核的技術。緩沖器追蹤模塊204還允許對元數(shù)據(jù)206中的存儲器區(qū)域信息的動態(tài)(即實時)更新,以反映注冊模塊202對存儲器使用的改變。對存儲器使用的這些改變是對存儲器區(qū)域信息的改變,并且例如包括用于將在重新引導期間保留的數(shù)據(jù)的存儲器使用的增加、或者清除用于該數(shù)據(jù)的存儲器。在生成元數(shù)據(jù)206中的數(shù)據(jù)結(jié)構之后的某時,發(fā)生系統(tǒng)崩潰。在崩潰之后,使用快速重新引導特征來啟動步驟208中的重新引導。圖2中在虛線之間描述的部分包括在快速重新引導期間發(fā)生動作的模塊和發(fā)生的步驟。再一次地,快速重新引導跳過了典型的由固件或BIOS對系統(tǒng)存儲器的清除。在重新引導期間,存儲器保留模塊210工作,并訪問元數(shù)據(jù)206中的存儲器區(qū)域。在將元數(shù)據(jù)存儲器地址傳遞到第二內(nèi)核的前述情形中,存儲器保留模塊210接收所傳遞的元數(shù)據(jù)地址。在重新引導期間,但在內(nèi)核開始將存儲器分配給其它部件(例如,設備驅(qū)動程序和應用)使用之前,存儲器保留模塊210指示內(nèi)核的存儲器管理模塊(未示出)來保留在元數(shù)據(jù)206中指示的存儲器區(qū)域。該保留確保了將在重新引導期間保留的存儲器區(qū)域不會被分配給操作系統(tǒng)資源的任何其它用戶所使用。如這里所使用的,操作系統(tǒng)資源的用戶包括應用和設備驅(qū)動程序。該保留還確保了駐留于所指示的存儲器區(qū)域中的數(shù)據(jù)從重新引導開始直到重新引導完成均被維護為未改變狀態(tài)。在由元數(shù)據(jù)206指示的存儲器區(qū)域被存儲器保留模塊210保留之后,在重新引導期間緩沖器提取模塊212進行工作。對于緩沖器追蹤模塊204接收的每次注冊,由緩沖器提取模塊212創(chuàng)建偽文件。如這里所使用的,偽文件(也稱為內(nèi)存儲器文件)被定義為僅在易失性存儲器(例如RAM)中作為已命名單元而存儲的數(shù)據(jù)位的序列,其不在非易失性存儲媒體(即,永久性存儲媒體)中進行任何備份存儲。偽文件的名稱標識或指向在易失性存儲器中存儲的數(shù)據(jù)。偽文件類似于典型的計算機文件,除了計算機文件在非易失性存儲媒體(例如,硬盤或軟盤)上存儲,而偽文件僅在易失性存儲器上存儲。由緩沖器提取模塊212創(chuàng)建的偽文件指向數(shù)據(jù),所述數(shù)據(jù)也是元數(shù)據(jù)206指示的存儲器區(qū)域的內(nèi)容。即,偽文件的數(shù)據(jù)是注冊模塊202請求在重新引導期間保留的存儲器區(qū)域(即緩沖器)的實際內(nèi)容。由于日志記錄工具無法直接訪問元數(shù)據(jù)206,所以偽文件充當了允許日志記錄工具訪問其內(nèi)容在重新引導期間被保留的緩沖器的接口。例如,在Linux內(nèi)核中,可以使用“proc”文件系統(tǒng)來創(chuàng)建偽文件。在此情形中,偽文件或內(nèi)存儲器文件不在任何后備媒體(硬盤、軟盤等)上存儲。由proc創(chuàng)建的偽文件可以由其在/proc文件系統(tǒng)中的名稱所訪問。例如,proc創(chuàng)建的名為xyz的偽文件通過/proc/xyz來引用。使用標準的獨立于平臺的文件格式(諸如ExecutableandLinkingFormat(ELF))來創(chuàng)建本發(fā)明中的偽文件。使用標準的獨立于平臺的文件格式是有利的,因為它允許標準命令被用于對偽文件進行操作,從而避免對用于訪問所保留的緩沖器的數(shù)據(jù)的定制編碼或依賴于硬件的技術的需要。在步驟214,在重新引導完成之后,使用對偽文件進行操作的指令而將由緩沖器提取模塊212創(chuàng)建的偽文件寫出(即,在重新引導期間保留的日志或追蹤緩沖器的內(nèi)容被提取)。在重新引導完成后由注冊模塊202執(zhí)行寫出偽文件的指令。在一實施例中,指令通過引用偽文件名稱而寫出緩沖器數(shù)據(jù),所述偽文件名稱精確地指向緩沖器數(shù)據(jù)而不會標識易失性存儲器的任何其它內(nèi)容。偽文件數(shù)據(jù)例如由系統(tǒng)管理員所寫出。在前述的/proc/xyz偽文件的情形中,任何標準的文件拷貝命令(諸如Linux的cp命令)都可以被用于寫出文件。因此,通過用標準命令借助名稱來訪問偽文件,可以提取日志和追蹤緩沖器中的數(shù)據(jù)。一旦數(shù)據(jù)被提取出來,就在步驟216將了解緩沖器內(nèi)容的軟件工具用于分析所提取的日志或追蹤數(shù)據(jù)。在步驟214已將緩沖器內(nèi)容提取出來之后,所保留的存儲器區(qū)域可選地可被存儲器清除模塊218所清除。清除所保留的存儲器區(qū)域的一個示例包括刪除對應于緩沖器的偽文件。一旦存儲器被清除,它就可以被再次用于正常的內(nèi)核存儲器分配。在寫出和分析偽文件數(shù)據(jù)之后以及在清除與所保留的存儲器區(qū)域相關聯(lián)的存儲器的可選步驟之后,在步驟220緩沖器提取過程結(jié)束。如上述的緩沖器提取過程所指示的,注冊模塊202、緩沖器追蹤模塊204、存儲器保留模塊210和緩沖器提取模塊212共同提供可以將數(shù)據(jù)存儲在易失性存儲器的緩沖器中的任何應用所使用的單一接口,其中數(shù)據(jù)將在系統(tǒng)發(fā)生故障之后從該緩沖器中提取。該單一接口可被任何應用一起共享。此外,該接口向任何應用提供以下裝置,用于(1)注冊應用,(2)保留存儲將被提取數(shù)據(jù)的存儲器區(qū)域,從而在系統(tǒng)重新引導期間不會向操作系統(tǒng)資源的用戶分配這些存儲器區(qū)域,以及(3)在重新引導期間生成指向?qū)⒈惶崛?shù)據(jù)的偽文件。響應于應用的注冊,由接口自動提供所述保留和生成的特征。因此,該接口提供了一種易于使用的機制,用于通過使用對偽文件操作的指令,在系統(tǒng)出現(xiàn)故障時提取數(shù)據(jù),如上所述。附錄呈現(xiàn)了用于實現(xiàn)圖2的緩沖器提取過程的代碼。以下呈現(xiàn)了緩沖器提取過程的示例。盡管這里呈現(xiàn)的示例解決了對應用所使用的緩沖器數(shù)據(jù)的保留,但是本發(fā)明還可由設備驅(qū)動程序利用,以在快速重新引導期間保留設備階段信息,以便使從前一階段恢復操作更方便。緩沖器提取的示例圖3A-3C描述了圖2的緩沖器提取過程的實現(xiàn)的示例。圖3A描述在圖2的緩沖器提取過程中關注于緩沖器追蹤模塊204在系統(tǒng)崩潰和快速重新引導之前的操作的第一部分300。名為logxyz工具302的日志記錄工具將自身注冊到緩沖器追蹤模塊204。由logxyz使用的日志記錄緩沖器被存儲在系統(tǒng)存儲器308的三個不同存儲器區(qū)域310、312、314。關于存儲器區(qū)域310、312、314的大小和起始地址的信息由緩沖器追蹤模塊204從logxyz工具302所收集,并被存儲在用于logxyz的元數(shù)據(jù)306中。圖3B描述在圖2的緩沖器提取過程中關注于存儲器保留模塊210的操作的第二部分320。由于系統(tǒng)掛起導致系統(tǒng)崩潰,隨后啟動快速重新引導。在重新引導階段期間,存儲器保留模塊210訪問用于logxyz的元數(shù)據(jù)306。通過使用從對用于logxyz的元數(shù)據(jù)306的訪問中收集的存儲器區(qū)域信息,存儲器保留模塊210保留駐留于系統(tǒng)存儲器308中的存儲器區(qū)域310、312、314。所保留的存儲器區(qū)域是由元數(shù)據(jù)指示的區(qū)域。圖3C描述在圖2的緩沖器提取過程中關注于緩沖器提取模塊212的操作的第三部分340。在重新引導階段期間,緩沖器提取模塊212使用所存儲的用于logxyz的元數(shù)據(jù)306(參見圖3B)來創(chuàng)建名為logxyz-buffer的偽文件,其數(shù)據(jù)是駐留于系統(tǒng)存儲器308中的存儲器區(qū)域310、312、314的內(nèi)容。偽文件在/proc文件系統(tǒng)中創(chuàng)建,并作為/proc/logxyz-buffer344而引用。通過執(zhí)行簡單文件復制操作而提取logxyz工具302(參見圖3A)的日志緩沖器的數(shù)據(jù)。在Linux系統(tǒng)中,命令cp/proc/logxyz-buffer/home/test/log.buf將緩沖器內(nèi)容拷貝到/home/test目錄中的名為log.buf的文件中。被設計與logxyz工具一起使用的日志分析器實用工具分析文件log.buf的內(nèi)容。盡管以上呈現(xiàn)的實施例僅使用一種日志工具,但是本發(fā)明預期了將系統(tǒng)100(參見圖1)擴大為同時執(zhí)行上述操作的若干工具或?qū)嵱霉ぞ摺S糜诰彌_器數(shù)據(jù)提取的計算機系統(tǒng)圖4描述根據(jù)本發(fā)明實施例的用于實現(xiàn)在圖1的系統(tǒng)中在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的計算機系統(tǒng)。計算機系統(tǒng)400適當?shù)匕ㄌ幚砥?02、主存儲器404、存儲器控制器408和至少一個輸入/輸出(I/O)接口410,所有這些部件經(jīng)由系統(tǒng)總線412互連。主存儲器404包括操作系統(tǒng)406和計算機程序414。主存儲器404是易失性存儲器(例如RAM),并包括一種包括了圖2的流程圖中描述的緩沖器提取邏輯的算法。在一實施例中,計算機程序414包括圖2的邏輯的算法。作為圖4中的計算機程序414的可替換位置,計算機程序414還可被包括在操作系統(tǒng)406中。作為一個示例,處理器402是基于x86體系結(jié)構的Intel處理器,而操作系統(tǒng)406是Linux操作系統(tǒng)。處理器402執(zhí)行計算機系統(tǒng)400的計算和控制功能,并且包括適當?shù)闹醒胩幚韱卧L幚砥?02可包括單個集成電路(諸如微處理器),或可包括任何適當數(shù)量的集成電路設備和/或電路板,其協(xié)同工作來完成處理器的功能。處理器402適當?shù)貓?zhí)行一個或多個計算機程序,包括計算機程序414。在一實施例中,處理器402執(zhí)行實現(xiàn)圖2的流程圖中描述的邏輯的算法。I/O接口410可包括用于從外部源(諸如外部設備416)交換信息的任何系統(tǒng)。外部設備416可包括傳統(tǒng)的外部設備,包括顯示監(jiān)視器、鍵盤、鼠標、打印機、繪圖機、傳真機等。計算機系統(tǒng)400可使用適合的通信信道(未示出)經(jīng)由通信接口連接于一個或多個其它計算機,所述通信信道諸如調(diào)制解調(diào)器通信路徑、計算機網(wǎng)絡等。計算機網(wǎng)絡(未示出)可包括局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)、內(nèi)聯(lián)網(wǎng)、和/或因特網(wǎng)。I/O接口410還允許計算機系統(tǒng)400存儲并從輔助的存儲設備418檢索信息(例如程序指令或數(shù)據(jù)),所述存儲設備418諸如非易失性存儲設備(例如,接收CD-ROM盤(未示出)的CD-ROM驅(qū)動器)。計算機系統(tǒng)400可以存儲并從其它的輔助存儲設備(未示出)檢索信息,所述存儲設備418可包括直接存取存儲設備(DASD)(例如硬盤或軟盤)、磁光盤驅(qū)動器、磁帶驅(qū)動器或無線通信設備。存儲器控制器408通過使用與處理器402不同的處理器(未示出),而負責將所請求的信息從主存儲器404和/或通過I/O接口410移動到處理器402。盡管出于解釋目的將存儲器控制器408示出為單獨實體,但是本領域技術人員應理解,在實踐中,由存儲器控制器408提供的功能的某些部分實際可駐留于與處理器402、主存儲器404和/或I/O接口410相關聯(lián)的電路中。應該理解,主存儲器404將不必非要包含所示出的所有機制的所有部分。例如,計算機程序414和操作系統(tǒng)406的某些部分可被加載到指令高速緩存(未示出)中,用于處理器402來執(zhí)行,而其它文件可被存儲在磁或光盤存儲設備(諸如存儲設備418)上。此外,盡管所示出的計算機程序414駐留于與操作系統(tǒng)406相同的存儲位置中,但是應該理解,主存儲器404可包括完全不同的存儲位置。I/O接口410的終端接口允許系統(tǒng)管理員和計算機程序員與計算機系統(tǒng)400通信。盡管圖4中描述的計算機系統(tǒng)400僅包含單個主處理器402和單個系統(tǒng)總線412,但是應該理解,本發(fā)明可同等地應用于具有多個處理器和多個系統(tǒng)總線的計算機系統(tǒng)。類似地,盡管系統(tǒng)總線412是典型的硬連線的、多點總線,但是在與計算機有關的環(huán)境中支持雙向通信的任何連接裝置都是可用的。根據(jù)本發(fā)明的計算機系統(tǒng)400例如是個人計算機。不過,本領域技術人員將理解,本發(fā)明的方法和裝置可同等地應用于任何計算機系統(tǒng),不管該計算機系統(tǒng)是復雜的多用戶計算裝置還是單個用戶的設備,諸如工作站。注意,可在本發(fā)明范圍內(nèi)對圖4所述的計算機系統(tǒng)400做出多種修改、添加或刪除,諸如添加高速緩沖存儲器或其它外圍設備。所呈現(xiàn)的圖4僅例示了計算機系統(tǒng)400的某些突出特征。重要地是要注意,盡管本發(fā)明已經(jīng)(并將繼續(xù))在完全運行的計算機系統(tǒng)的上下文中進行描述,不過,本領域技術人員將理解,本發(fā)明的機制能夠作為程序產(chǎn)品以多種形式分布,并且本發(fā)明可同等地被應用,而不管實際用來執(zhí)行所述分布的信號承載媒體的具體類型。信號承載媒體的示例包括可記錄類型的媒體(諸如軟盤和CD-ROM)以及傳輸類型的媒體(諸如,包括無線通信鏈路的數(shù)字和模擬通信鏈路)。因此,本發(fā)明公開了一種用于部署或集成計算基礎設施的方法,包括將計算機可讀代碼集成到計算機系統(tǒng)400中,其中所述代碼與計算機系統(tǒng)400相結(jié)合能夠執(zhí)行用于在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的過程。本發(fā)明可以被包括在例如制品(例如一個或多個計算機程序產(chǎn)品)中,所述制品例如具有計算機可用媒體。該媒體中包括例如用于提供本發(fā)明的能力并使其更便利的計算機可讀程序代碼工具。所述制品可被包括為計算機系統(tǒng)的一部分,或者單獨出售。此外,可以提供用來執(zhí)行本發(fā)明的能力的機器可讀的至少一個程序存儲設備,其有形地包括機器可執(zhí)行的至少一個代碼程序。通過示例提供了這里描述的流程圖。在不脫離本發(fā)明精神的情況下,存在對于這里所述的這些圖或步驟(或操作)的變體。例如,在某些情形中,可以用不同順序執(zhí)行步驟,或者可以添加、刪除或修改步驟。所有這些變體都被認為是權利要求所闡述的本發(fā)明的一部分。盡管這里已經(jīng)出于例示性目的描述了本發(fā)明的實施例,但是對于本領域技術人員來說許多修改和改變將變得明顯。因而,權利要求旨在包含落在本發(fā)明真正的精神和范圍內(nèi)的所有這些修改和改變。附錄Memsave.patch代碼以下代碼(memsave.patch)實現(xiàn)了本發(fā)明的易于使用的新穎的基礎設施,其充當了將由任意日志或追蹤工具使用的公用接口。此代碼允許Linux內(nèi)核的任意部件將自身注冊到模塊,以請求在重新引導期間保留指定的存儲器區(qū)域。一旦發(fā)生重新引導,該區(qū)域的內(nèi)容就可被寫出為普通文件。此代碼提供的示范說明具有為保留存儲器的兩個不同區(qū)域而進行的兩次注冊。一旦進行快速重新引導,這兩個區(qū)域就被提取為文件。---linux-patch-hari/arch/i386/Kconfig|6++linux-patch-hari/arch/i386/kernel/Makefile|2linux-patch-hari/arch/i386/kernel/mdummy.c|46+++++++++++++++++linux-patch-hari/arch/i386/kernel/memsave.c|45+++++++++++++++++linux-patch-hari/arch/i386/kernel/setup.c|6++linux-patch-hari/fs/proc/Makefile|1linux-patch-hari/fs/proc/proc_memsave.c|73++++++++++++++++++++++++++++linux-patch-hari/fs/proc/proc_misc.c|23++++++++linux-patch-hari/fs/proc/root.c|4+linux-patch-hari/include/asm-i386/memsave.h|58++++++++++++++++++++++linux-patch-hari/include/linux/proc_fs.h|5+11fileschanged,269insertions(+)diff-puNarch/i386/Kconfig~memsavearch/i386/Kconfig---linux-patch/arch/i386/Kconfig~memsave2004-08-2911:19:10.000000000+0530+++linux-patch-hari/arch/i386/Kconfig2004-08-2911:20:55.000000000+0530@@-864,6+864,12@@configREGPARMgenerateincorrectoutputwithcertainkernelconstructswhen-mregparm=3isused.+configMEMSAVE+bool“preservememoryacrossreboots”+dependsonKEXEC+help+Allowmemorytobepreservedacrossreboots+endmenudiff-puNarch/i386/kernel/setup.c~memsavearch/i386/kernel/setup.c---linux-patch/arch/i386/kernel/setup.c~memsave2004-08-2911:22:24.000000000+0530+++linux-patch-hari/arch/i386/kernel/setup.c2004-08-3022:32:02.000000000+0530@@-48,6+48,7@@#include<asm/io_apic.h>#include<asm/ist.h>#include<asm/io.h>+#include<asm/memsave.h>#include“setup_arch_pre.h”#include<bios_ebda.h>@@-1097,6+1098,9@@staticunsignedlong_initsetup_memory}}#endif++reserve_bootmem(MEMSAVE_BASE,MEMSAVE_SIZE);+returnmax_low_pfn;}#else@@-1358,6+1362,8@@void_initsetup_arch(char**cmdline_p)#endifpaging_init();+reserve_memsave_bootmem();+#ifdefCONFIGEARLYPRINTK{char*s=strstr(*cmdline_p,“earlyprintk=”);diff-puN/dev/nullinclude/asm-i386/memsave.h---/dev/null2003-01-3015:54:37.000000000+0530+++linux-patch-hari/include/asm-i386/memsave.h2004-08-3022:26:51.000000000+0530@@-0,0+1,58@@+/*+*Archspecificfunctionsforthememorypreservingrebootinfrastructure+*API+*+*Createdby:HariprasadNellitheertha+*+*Copyright(C)IBMCorporation,2004.Allrightsreserved.+*/++#include<linux/bootmem.h>++#defineMEMSAVE_BASE0x2000000+#defineMEMSAVE_SIZE0x0001000/*1pageshouldbesufficient*/+#defineMEMSAVE_ENTRY_SIG0xaeaecece+#defineMEMSAVE_END_SIG0xdeadbeef++/*Thememsavestructure*/++structmemsave{+unsignedlongsig;/*Indicatesendoflist*/+charname[10];/*Nameoftheinterface*/+unsignedlongstart;/*Startofmemoryregion,physicaladdress*/+unsignedlongsize;/*Sizeoftheregion*/+};++exteruintmemsave_add_entry(structmemsave*);++#ifdefCONFIG_MEMSAVE+staticinlinevoidreserve_memsave_regions(void)+{++structmemsave*bufp;+intn,i=MEMSAVE_SIZE/sizeof(structmemsave);++bufp=(structmemsave*)_va(MEMSAVE_BASE);++for(n=0;n<i;n++){+if(bufp->sig?。組EMSAVE_ENTRY_SIG)+return;+/*Reservethememoryclaimedbythisentry*/+reserve_bootmem(bufp->start,bufp->size);+(char*)bufp+=sizeof(structmemsave);+}+}++staticinlinevoidreserve_memsave_bootmem(void)+{+unsignedlong*sig;++sig=(unsignedlong*)_va(MEMSAVE_BASE);+if(*sig!=MEMSAVE_ENTRY_SIG)/*Listisempty*/+*sig=MEMSAVE_END_SIG;/*Initializethelist*/+else/*Thereareentries.Reservetheregions*/+reserve_memsave_regions();+}+#else+staticinlinevoidreserve_memsave_bootmem(void);+#endifdiff-puN/dev/nullarch/i386/kernel/memsave.c---/dev/null2003-01-3015:54:37.000000000+0530+++linux-patch-hari/arch/i386/kernel/memsave.c2004-08-3100:20:00.000000000+0530@@-0,0+1,45@@+/*+*TheAPIsforthememorysavingrebootinfrastructure.+*+*CreatedbyHariprasadNellitheertha+*+*Copyright(C)IBMCorporation,2004.Allrightsreserved.+*/++#include<asm/errno.h>+#include<asm/memsave.h>++/*+*Thisroutineaddsanewmemsaveentrytothelist.Ifnoentry+*exists,anewoneisinitialized.+*/+intmemsave_add_entry(structmemsave*msave)+{+structmemsave*bufp;+intn,i=MEMSAVE_SIZE/sizeof(structmemsave);++bufp=(structmemsave*)_va(MEMSAVE_BASE);++/*Loopthroughthestructuretillwefindanemptyslot*/+while((i--)&&(bufp->sig?。組EMSAVE_END_SIG))+(char*)bufp+=sizeof(structmemsave);++if(!i)/*Nomoreentriesaccepted*/+return-EFAULT;++/*Wefoundanavailableslot.Registertheentry.+*Wedonotvalidatetheentry.Justcopyit+*/+memcpy(bufp,msave,sizeof(structmemsave));+bufp->sig=MEMSAVE_ENTRY_SIG;++/*Markthenextentryasavailable*/+if(i>1){+(char*)bufp+=sizeof(structmemsave);+bufp->sig=MEMSAVE_END_SIG;+}++return0;+}diff-puNarch/i386/kernel/Makefile~memsavearch/i386/kernel/Makefile---linux-patch/arch/i386/kernel/Makefile~memsave2004-08-2913:50:53.000000000+0530+++linux-patch-hari/arch/i386/kernel/Makefile2004-08-3020:27:27.000000000+0530@@-32,6+32,8@@obj-$(CONFIG_ACPI_SRAT)+=srat.oobj-$(CONFIG_HPET_TIMER)+=time_hpet.oobj-$(CONFIG_EFI)+=efi.oefi_stub.oobj-$(CONFIG_EARLY_PRINTK)+=early_printk.o+obj-$(CONFIG-MEMSAVE)+=memsave.o+obj-$(CONFIG-MEMSAVE)+=mdummy.oEXTRA_AFLAGS=-traditionaldiff-puNfs/proc/proc_misc.c~memsavefs/proc/proc_misc.c---linux-patch/fs/proc/proc_misc.c~memsave2004-08-2920:44:57.000000000+0530+++linux-patch-hari/fs/proc/proc_misc.c2004-08-3022:26:21.000000000+0530@@-49,6+49,7@@#include<asm/io.h>#include<asm/tlb.h>#include<asm/div64.h>+#include<asm/memsave.h>#defineLOAD_INT(x)((x)>>FSHIT)#defineLOAD_FRAC(x)LOAD_INT(((x)&(FIXED_1-1))*100)@@-689,6+690,28@@void_initproc_misc_init(void)(size_t)high_memory-PAGE_OFFSET+PAGE_SIZE;}#endif+#ifdefCONFIGMEMSAVE+/*Scanthroughtheentriesandcreatefilesforregistered+*entries+*/+{+structmemsave*bufp;+intn,i=MEMSAVE_SIZE/sizeof(structmemsave);++bufp=(structmemsave*)_va(MEMSAVE_BASE);++for(n=0;n<i;n++){+if(bufp->sig?。組EMSAVE_ENTRY_SIG)+break;+entry=create_proc_entry(bufp->name,s_IRUSR,NULL);+if(entry){+entry->proc_fops=&proc_memsave_operations;+entry->size=bufp->size;+}+(char*)bufp+=sizeof(structmemsave);+}+}+#endifif(prof_on){entry=create_proc_entry(“profile”,S_IWUSR|S_IRUGO,NULL);if(entry){diff-puNinclude/linux/proc_fs.h~memsaveinclude/linux/proc_fs.h---/linux-patch/include/linux/proc_fs.h~memsave2004-08-2920:59:30.000000000+0530+++linux-patch-hari/include/linux/proc_fs.h2004-08-3023:41:17.000000000+0530@@-114,6+114,11@@externstructdentry*proc_lookup(structexternstructfile_operationsproc_kcore_operations;externstructfile_operationsproc_kmsg_operations;externstructfile_operationsppc_htab_operations;+#ifdefCONFIG_MEMSAVE+externstructfile_operationsproc_memsave_operations;+externvoidmemsave_dummy_entry(void);+externvoidmemsave_dummy_entry_2(void);+#endif/**proC_tty.cdiff-puNfs/proc/Makefile~memsavefs/proc/Makefile---linux-patch/fs/proc/Makefile~memsave2004-08-2921:03:28.000000000+0530+++linux-patch-hari/fs/proc/Makefile2004-08-2921:04:10.000000000+0530@@-12,3+12,4@@proc-y+=inode.oroot.obase.ogeproc-$(CONFIG_PROC_KCORE)+=kcore.oproc-$(CONFIG_PROC_DEVICETREE)+=proc_devtree.o+proc-$(CONFIG_MEMSAVE)+=proc_memsave.odiff-puN/dev/nullfs/proc_memsave.c---/dev/null2003-01-3015:54:37.000000000+0530+++linux-patch-hari/fs/proc/proc_memsave.c2004-08-3100:20:19.00000000+0530@@-0,0+1,73@@+/*+*fs/proc/proc_memsave.cContainstheroutinesthatabstractthesaved+*memoryregionsasfiles.+*+*CreatedbyHariprasadNellitheertha+*+*Copyright(C)IBMCorporation,2004.Allrightsreserved+*+*/++#include<linux/mm.h>+#include<linux/proc_fs.h>+#include<linux/capability.h>+#include<linux/user.h>+#include<linux/user.h>+#include<asm/memsave.h>+#include<asm/uaccess.h>+#include<asm/io.h>++staticintopen_memsave(structinode*inode,structfile*filp)+{+returncapable(CAP_SYS_RAWIO)?0:-EPERM;+}++staticssize_tread_memsave(structfile*,char_user*,size_t,loff_t*);++structfile_operationsproc_memsave_operations={+.read=read_memsave,+.open=oper_memsave,+};++/*+*read_memsave()+*+*Thisroutineprovidestheinterfacetoreadthesavedmemoryregions.+*Itusesthefilepointertoidentifytheregionbasedonthename.It+*thenreadsthecorrespondingmemoryregionandreturnsitbacktothe+*user.+*+*/+staticssize_tread_memsave(+structfile*file,char_user*buffer,size_tbuflen,loff_t*fops)+{+structmemsave*msave;+intn;+void*region;++/*First,gettothecorrectentryinthelist*/+msave=(structmemsave*)_va(MEMSAVE_BASE);+for(n=0;n<(MEMSAVE_SIZE/sizeof(structmemsave));n++){+if(msave->sig?。組EMSAVE_ENTRY_SIG)+return-EFAULT;+if(!strcmp(msave->name,file->f_dentry->d_name.nema))+break;/*Foundtheentry*/+(char*)msave+=sizeof(structmemsave);+}++if(msave->sig?。組EMSAVE_ENTRY_SIG)+return-EFAULT;++if(buflen>msave->size-*fpos)+buflen=msave->size-*fops;++region=_va(msave->start);++if(copy_to_user(buffer,region+*fops,buflen)){+return-EFAULT;+}++*fops+=buflen;++returnbuflen;+}diff-puN/dev/nullarch/i386/kernel/mdummy.c---/dev/null2003-01-3015:54:37.000000000+0530+++linux-patch-hari/arch/i386/kernel/mdummy.c2004-08-3023:38:01.000000000+0530@@-0,0+1,46@@+/*+*Containscodetocreatedummyentriesformemsave.+*+*CreatedbyHariprasadNellitheertha+*+*Copyright(C)IBMCorporation,2004.Allrightsreserved.+*+*/+#include<asm/errno.h>+#include<asm/memsave.h>++structmemsavemsave_dum;+structmemsavemsave_dum_2;++/*+*Createadummyentrytosaveaparticularregion+*Save1pagestartingfrom144MB.+*/+voidmemsave_dummy_entry(void)+{++intret;++strcpy(msave_dum.name,“msave”);+msave_dum.start=0x09000000;+msave_dum.size=0x1000;++ret=memsave_add_entry(&msave_dum);++strcpy((char*)0xc9000000,“harihari”);+}++voidmemsave_dummy_entry_2(void)+{++intret;++strcpy(msave_dum_2.name,“msave2”);+msave_dum_2.start=0x0a000000;+msave_dum_2.size=0x1000;++ret=memsave_add_entry(&msave_dum_2);++strcpy((char*)0xc9000000,“dummydummy”);+}diff-puNfs/proc/root.c~memsavefs/proc/root.c---linux-patch/fs/proc/root.c~memsave2004-08-3022:30:59.000000000+0530+++linux-patch-hari/fs/proc/root.c2004-08-3023:38:23.000000000+0530@@-52,6+52,10@@void_initproc_root_init(void)return;}proc_misc_init();+#ifdefCONFIG_MEMSAVE+memsave_dummy_entry();+memsave_dummy_entry_2();+#endifproc_net=proc_mkdir(“net”,NULL);#ifdefCONFIGSYSVIPCproc_mkdir(“sysvipc”,NULL);安裝和運行代碼的指令以下指令可被用于安裝和運行以上提供的緩沖器提取代碼。1)從http://www.kernel.org/獲得Linux版本2.6.9-rcl的源代碼注意以上呈現(xiàn)的代碼已被準備用于此版本的Linux。它可以稍后被更新至任何級別。2)從http://www.xmission.com/~ebiederm/files/kexec/2.6.8.1-kexec3/http://www.xmission.com/~ebideerm/files/kexec/kexec-tools-1.96.tgz獲得kexec和kexec-tools的補丁。3)通過包中給出的指令來安裝kexec-tools的用戶空間實用工具。4)解壓縮Linux內(nèi)核源代碼tar-xzvflinux-2.6.9-rcl.tar.gz5)將kexec補丁應用于Linux源代碼patch-pl<kexec-file-name6)將memsave.patch(在以上附錄中示出)應用于代碼patch-pl<memsave.patch7)構建Linux內(nèi)核并引導至該內(nèi)核。8)該補丁將創(chuàng)建對基礎設施的兩次注冊,以在kexec引導期間保存兩個存儲器區(qū)域。這些存儲器區(qū)域?qū)⒈蛔詾椤癿save”和“msave2”。9)加載kexec內(nèi)核kexec-l<kernel-name>--append=“<command-line-options>”10)重新引導到新的kexec內(nèi)核kexec-e11)觀察到在/proc下已經(jīng)創(chuàng)建兩個文件/proc/msave和/proc/msave212)使用“cp”命令寫出這兩個文件cp/proc/msavefile1cp/proc/msave2file2為了通過此方法驗證重新引導期間被保留的正確的存儲器區(qū)域,所述代碼將虛擬標識符串添加到所保留的存儲器區(qū)域中。由msave表示的第一區(qū)域在開頭包括“harihari”串。由msave2表示的第二區(qū)域包括“dummydummy”串。在重新引導之后,一旦文件已被寫出(參見以上列出的指令的步驟12),每個虛擬標識符串就可以在其相應文件中找到,從而驗證該方法。權利要求1.一種用于在計算環(huán)境中在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的方法,其中所述緩沖器是易失性存儲器的區(qū)域,其中在所述故障之前存儲所述數(shù)據(jù),所述方法包括在所述故障之前注冊應用,所述注冊包括標識數(shù)據(jù)所駐留的緩沖器,由所述應用在所述緩沖器中存儲所述數(shù)據(jù),所述應用在所述操作系統(tǒng)中執(zhí)行;保留所述緩沖器,所述保留將駐留于所述緩沖器中的所述數(shù)據(jù)維護為從所述操作系統(tǒng)響應于所述故障而啟動重新引導直到完成所述重新引導均未改變,所述重新引導是快速重新引導;在所述重新引導期間生成內(nèi)存儲器文件,所述內(nèi)存儲器文件指向駐留于所述緩沖器中的所述數(shù)據(jù),并且所述內(nèi)存儲器文件被存儲在所述易失性存儲器中而不是永久性存儲媒體中;以及經(jīng)由對所述內(nèi)存儲器文件操作的指令來提取所述數(shù)據(jù),所述指令在所述重新引導的所述完成之后由所述應用執(zhí)行。2.根據(jù)權利要求1所述的方法,其中所述提取包括通過在所述指令中引用所述內(nèi)存儲器文件的標識符而獲得所述數(shù)據(jù),所述標識符標識所述內(nèi)存儲器文件的內(nèi)容,而不標識所述易失性存儲器的任何其它內(nèi)容。3.根據(jù)權利要求1所述的方法,還包括提供單個接口,所述單個接口提供所述注冊,響應于所述注冊而自動提供所述保留和所述生成,以及使得經(jīng)由所述注冊、所述保留和所述生成的所述提取更便利,其中在所述易失性存儲器的區(qū)域中存儲將在所述故障之后提取的內(nèi)容的任何應用能夠使用所述單個接口而在所述故障之后提取所述內(nèi)容。4.根據(jù)權利要求1所述的方法,其中所述標識緩沖器包括提供與所述緩沖器相關聯(lián)的存儲器區(qū)域信息,所述信息包括存儲所述數(shù)據(jù)所需的所述易失性存儲器的總量以及所述緩沖器起始的存儲器地址。5.根據(jù)權利要求4所述的方法,還包括將所述存儲器區(qū)域信息存儲在元數(shù)據(jù)中,所述元數(shù)據(jù)包括一個或多個數(shù)據(jù)結(jié)構。6.根據(jù)權利要求5所述的方法,還包括在所述重新引導期間并且在所述重新引導期間啟動對所述易失性存儲器的分配之前,防止所述緩沖器被分配由所述操作系統(tǒng)的一個或多個資源的用戶所使用,存儲器管理模塊使所述防止更便利,所述防止接收所述存儲器區(qū)域信息,所述存儲器管理模塊駐留于所述操作系統(tǒng)中。7.根據(jù)權利要求5所述的方法,其中所述元數(shù)據(jù)包括標識所述應用的名稱以及所述應用所需的所述易失性存儲器的總量。8.根據(jù)權利要求5所述的方法,還包括響應于所述存儲器區(qū)域信息的改變,實時地動態(tài)更新所述元數(shù)據(jù)。9.根據(jù)權利要求1所述的方法,其中所述生成包括使用用于所述內(nèi)存儲器文件的獨立于平臺的文件格式。10.一種用于在計算環(huán)境中在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的系統(tǒng),其中所述緩沖器是易失性存儲器的區(qū)域,其中在所述故障之前存儲所述數(shù)據(jù),所述系統(tǒng)包括用于在所述故障之前注冊應用的裝置,所述注冊包括用于標識數(shù)據(jù)所駐留的緩沖器的裝置,由所述應用在所述緩沖器中存儲所述數(shù)據(jù),所述應用在所述操作系統(tǒng)中執(zhí)行;用于保留所述緩沖器的裝置,所述保留將駐留于所述緩沖器中的所述數(shù)據(jù)維護為從所述操作系統(tǒng)響應于所述故障而啟動重新引導直到完成所述重新引導均未改變,所述重新引導是快速重新引導;用于在所述重新引導期間生成內(nèi)存儲器文件的裝置,所述內(nèi)存儲器文件指向駐留于所述緩沖器中的所述數(shù)據(jù),并且所述內(nèi)存儲器文件被存儲在所述易失性存儲器中而不是永久性存儲媒體中;以及用于經(jīng)由對所述內(nèi)存儲器文件操作的指令來提取所述數(shù)據(jù)的裝置,所述指令在所述重新引導的所述完成之后由所述應用執(zhí)行。11.根據(jù)權利要求10所述的系統(tǒng),其中用于提取的所述裝置包括用于通過在所述指令中引用所述內(nèi)存儲器文件的標識符而獲得所述數(shù)據(jù)的裝置,所述標識符標識所述內(nèi)存儲器文件的內(nèi)容,而不標識所述易失性存儲器的任何其它內(nèi)容。12.根據(jù)權利要求10所述的系統(tǒng),還包括單個接口裝置,所述單個接口裝置用于提供所述注冊,響應于所述注冊而自動提供所述保留和所述生成,以及使得經(jīng)由所述注冊、所述保留和所述生成的所述提取更便利,其中在所述易失性存儲器的區(qū)域中存儲將在所述故障之后提取的內(nèi)容的任何應用能夠使用所述單個接口裝置而在所述故障之后提取所述內(nèi)容。13.根據(jù)權利要求10所述的系統(tǒng),其中用于標識緩沖器的所述裝置包括用于提供與所述緩沖器相關聯(lián)的存儲器區(qū)域信息的裝置,所述信息包括存儲所述數(shù)據(jù)所需的所述易失性存儲器的總量以及所述緩沖器起始的存儲器地址。14.根據(jù)權利要求13所述的系統(tǒng),還包括用于將所述存儲器區(qū)域信息存儲在元數(shù)據(jù)中的裝置,所述元數(shù)據(jù)包括一個或多個數(shù)據(jù)結(jié)構。15.根據(jù)權利要求14所述的系統(tǒng),還包括用于在所述重新引導期間并且在所述重新引導期間啟動對所述易失性存儲器的分配之前,防止所述緩沖器被分配由所述操作系統(tǒng)的一個或多個資源的用戶所使用的裝置,存儲器管理模塊使所述防止更便利,所述防止接收所述存儲器區(qū)域信息,所述存儲器管理模塊駐留于所述操作系統(tǒng)中。16.根據(jù)權利要求14所述的系統(tǒng),其中所述元數(shù)據(jù)包括標識所述應用的名稱以及所述應用所需的所述易失性存儲器的總量。17.根據(jù)權利要求14所述的系統(tǒng),還包括用于響應于所述存儲器區(qū)域信息的改變,實時地動態(tài)更新所述元數(shù)據(jù)的裝置。18.根據(jù)權利要求10所述的系統(tǒng),其中用于生成的所述裝置包括用于使用用于所述內(nèi)存儲器文件的獨立于平臺的文件格式的裝置。19.一種用于部署計算基礎設施的方法,包括將計算機可讀代碼集成到計算系統(tǒng)中,其中所述代碼與所述計算系統(tǒng)相結(jié)合能夠執(zhí)行在計算環(huán)境中在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的過程,其中所述緩沖器是易失性存儲器的區(qū)域,其中在所述故障之前存儲所述數(shù)據(jù),所述過程包括在所述故障之前注冊應用,所述注冊包括標識數(shù)據(jù)所駐留的緩沖器,由所述應用在所述緩沖器中存儲所述數(shù)據(jù),所述應用在所述操作系統(tǒng)中執(zhí)行;保留所述緩沖器,所述保留將駐留于所述緩沖器中的所述數(shù)據(jù)維護為從所述操作系統(tǒng)響應于所述故障而啟動重新引導直到完成所述重新引導均未改變,所述重新引導是快速重新引導;在所述重新引導期間生成內(nèi)存儲器文件,所述內(nèi)存儲器文件指向駐留于所述緩沖器中的所述數(shù)據(jù),并且所述內(nèi)存儲器文件被存儲在所述易失性存儲器中而不是永久性存儲媒體中;以及經(jīng)由對所述內(nèi)存儲器文件操作的指令來提取所述數(shù)據(jù),所述指令在所述重新引導的所述完成之后由所述應用執(zhí)行。20.根據(jù)權利要求19所述的方法,其中所述提取包括通過在所述指令中引用所述內(nèi)存儲器文件的標識符而獲得所述數(shù)據(jù),所述標識符標識所述內(nèi)存儲器文件的內(nèi)容,而不標識所述易失性存儲器的任何其它內(nèi)容。21.根據(jù)權利要求19所述的方法,所述過程還包括提供單個接口,所述單個接口提供所述注冊,響應于所述注冊而自動提供所述保留和所述生成,以及使得經(jīng)由所述注冊、所述保留和所述生成的所述提取更便利,其中在所述易失性存儲器的區(qū)域中存儲將在所述故障之后提取的內(nèi)容的任何應用能夠使用所述單個接口而在所述故障之后提取所述內(nèi)容。22.根據(jù)權利要求19所述的方法,其中所述標識緩沖器包括提供與所述緩沖器相關聯(lián)的存儲器區(qū)域信息,所述信息包括存儲所述數(shù)據(jù)所需的所述易失性存儲器的總量以及所述緩沖器起始的存儲器地址。23.根據(jù)權利要求22所述的方法,所述過程還包括將所述存儲器區(qū)域信息存儲在元數(shù)據(jù)中,所述元數(shù)據(jù)包括一個或多個數(shù)據(jù)結(jié)構。24.根據(jù)權利要求23所述的方法,所述過程還包括在所述重新引導期間并且在所述重新引導期間啟動對所述易失性存儲器的分配之前,防止所述緩沖器被分配由所述操作系統(tǒng)的一個或多個資源的用戶所使用,存儲器管理模塊使所述防止更便利,所述防止接收所述存儲器區(qū)域信息,所述存儲器管理模塊駐留于所述操作系統(tǒng)中。25.根據(jù)權利要求23所述的方法,其中所述元數(shù)據(jù)包括標識所述應用的名稱以及所述應用所需的所述易失性存儲器的總量。26.根據(jù)權利要求23所述的方法,所述過程還包括響應于所述存儲器區(qū)域信息的改變,實時地動態(tài)更新所述元數(shù)據(jù)。27.根據(jù)權利要求19所述的方法,其中所述生成包括使用用于所述內(nèi)存儲器文件的獨立于平臺的文件格式。全文摘要一種用于在操作系統(tǒng)發(fā)生故障之后提取緩沖器數(shù)據(jù)的方法和系統(tǒng)。在所述故障之前注冊應用。所述注冊包括標識在所述故障之前存儲了將提取的數(shù)據(jù)的緩沖器。所述緩沖器被保留,以將駐留于所述緩沖器中的所述數(shù)據(jù)維護為從啟動直到完成所述操作系統(tǒng)的快速重新引導均未改變。所述快速重新引導響應于所述故障。在所述快速重新引導期間生成內(nèi)存儲器文件,其指向駐留于所述緩沖器中的所述數(shù)據(jù),并且被存儲在易失性存儲器中而不是永久性存儲媒體中。經(jīng)由在完成所述快速重新引導之后由應用執(zhí)行的、對所述內(nèi)存儲器文件操作的指令來提取所述數(shù)據(jù)。文檔編號G06F9/445GK1963773SQ200610143830公開日2007年5月16日申請日期2006年11月9日優(yōu)先權日2005年11月10日發(fā)明者H·V·內(nèi)里蒂特申請人:國際商業(yè)機器公司