原倉周 王華鋒 申雪萍
摘要:本文在分析進程凍結(jié)與恢復(fù)所涉及的相關(guān)知識點基礎(chǔ)上,給出了基于WRK(Windows Research Kernel)實現(xiàn)Windows進程凍結(jié)與恢復(fù)的技術(shù)方案。通過將相關(guān)知識點按照相關(guān)性和難度分類,設(shè)計并實施了一種基于研究性學(xué)習(xí)法的教學(xué)方式,使學(xué)生變被動學(xué)習(xí)為主動學(xué)習(xí),提高了綜合分析能力和動手能力,取得了滿意的教學(xué)效果。
關(guān)鍵詞:WRK;進程;實驗教學(xué)
中圖分類號:G642 文獻標(biāo)識碼:B
1引言
在現(xiàn)代操作系統(tǒng)中,完整的進程概念不僅表示一個運行程序,實際上包括了處理器、內(nèi)存、文件、外設(shè)等程序運行時可能涉及的各種“資源”,當(dāng)然也隱含了運行中的程序如何與內(nèi)核“打交道”的相互調(diào)用問題。因此,圍繞進程的概念展開實驗內(nèi)容的安排有助于學(xué)生系統(tǒng)了解“進程”在各實用操作系統(tǒng)中的具體實現(xiàn)方式,從抽象到具體,經(jīng)過理解消化后,再轉(zhuǎn)化為學(xué)生自己理解的“抽象”,最終達到系統(tǒng)化掌握各知識點的培養(yǎng)目標(biāo)。
將一個系統(tǒng)中的進程凍結(jié)到外存,或通過網(wǎng)絡(luò)傳輸?shù)絼e的機器,然后在必要的時候再恢復(fù)其運行,需要涉及到除進程調(diào)度之外的幾乎所有操作系統(tǒng)核心知識點,因此不僅適用于對“操作系統(tǒng)”課程的實驗教學(xué),而且可應(yīng)用于進程中間狀態(tài)保存、進程在分布式環(huán)境中遷移以平衡負載等實際應(yīng)用,所以具有很好的教學(xué)和應(yīng)用研究價值。
將業(yè)界廣泛應(yīng)用的實用操作系統(tǒng)Solaris、Linux和Windows內(nèi)核應(yīng)用于“操作系統(tǒng)”課程實驗已經(jīng)得到了國內(nèi)諸多知名高校的認同。
由于Windows NT在最初設(shè)計時采用的就是適用于多CPU、大內(nèi)存的1對1線程模型,因此,盡管Linux和Solaris都在新版本中逐步向這一模型靠近,但在模型實現(xiàn)方面都沒有Windows清晰。
微軟推出的用于教學(xué)和科研目的的WRK(Windows Research Kernel),提供了大部分內(nèi)核源代碼,相應(yīng)配備的Windbg工具,以及配套教學(xué)資料,也為學(xué)習(xí)和研究Windows內(nèi)核提供了強有力的支持。
本文基于WRK及其相關(guān)的教學(xué)材料,通過將進程凍結(jié)和恢復(fù)時需要解決的問題按內(nèi)容和難度分類,設(shè)計了相關(guān)的實驗?zāi)K和學(xué)習(xí)步驟,使學(xué)生通過研究性學(xué)習(xí)法完成力所能及的實驗內(nèi)容,變被動學(xué)習(xí)為主動學(xué)習(xí),提高了綜合分析能力和動手能力,取得了滿意的教學(xué)效果。
2技術(shù)方案的設(shè)計
要將一個已有的進程凍結(jié),可以從用戶態(tài)應(yīng)用程序中調(diào)用系統(tǒng)提供的API完成,也可通過在內(nèi)核中添加自己的系統(tǒng)調(diào)用完成相應(yīng)功能。前者依賴于系統(tǒng)的提供的API,功能相對受限,實驗難度相對容易控制,文獻[9]介紹了一種此類實現(xiàn)方法。我們選擇了后一種方案,相對來說實現(xiàn)比較靈活,但對學(xué)生來說實驗工作量相對較大。
2.1進程凍結(jié)涉及的內(nèi)容
進程凍結(jié)時需要處理的內(nèi)容可分為兩大類:一類是進程/線程自身特有的程序和數(shù)據(jù),不涉及別的進程,因此只要按一定的格式保存到外存,然后釋放內(nèi)存資源即可。另一類是共享資源,包括內(nèi)核同步工具、共享數(shù)據(jù)等。對于這類數(shù)據(jù),需要根據(jù)其具體作用分析如何使進程/線程與其“脫鉤”。“脫鉤”有兩個步驟,一是恢復(fù)時共享數(shù)據(jù)/對象的狀態(tài),是直接保存到時恢復(fù),還是到時根據(jù)具體情況創(chuàng)建一個新的對象然后設(shè)置成一定的狀態(tài);二是共享數(shù)據(jù)/對象的用戶數(shù)減1,用戶數(shù)為零時釋放資源。
第一類私有數(shù)據(jù)主要用于表示進程和線程及其運行上下文,包括EPROCESS、KPROCESS、PEB、ETHREAD、KTHREAD、TEB、VAD、頁表等數(shù)據(jù)結(jié)構(gòu),另外,還包括進程各線程已經(jīng)運行產(chǎn)生的相關(guān)中間數(shù)據(jù),如堆、棧、數(shù)據(jù)段、運行環(huán)境等。如果啟用了交換功能,還要考慮進程在交換空間的數(shù)據(jù)。
第二類共享數(shù)據(jù)主要包括進程所用到的各種共享內(nèi)核對象,如session、mutex、socket等,也包括共享數(shù)據(jù),DLL映射等信息。這類信息都可通過第一類內(nèi)核對象中的指針找到。
2.2保存格式與恢復(fù)運行
設(shè)計保存格式的主要目的是能夠在恢復(fù)時將當(dāng)初保存的數(shù)據(jù)“識別”出來。有兩種辦法。
第一種是沒有特別的格式表示,恢復(fù)程序按照保存數(shù)據(jù)結(jié)構(gòu)的順序依次讀出即可。這種方式的缺點的要求保存與恢復(fù)一一對應(yīng),只能一個寫入程序?qū)σ粋€讀出程序。在學(xué)生一個人做嘗試實驗時可這樣完成。
對于需要由多個同學(xué)協(xié)作完成的實驗,顯然不能采用以上方式。為此,我們設(shè)計了借鑒文件系統(tǒng)的實現(xiàn)方式,設(shè)計了一種“通用”的記錄格式。如圖1所示。
其中單元總長度是整型,占4個字節(jié),表示一個數(shù)據(jù)單元的總的長度;類型名表示本數(shù)據(jù)單元所存儲數(shù)據(jù)的類型,字符串,占10個字節(jié),它通常是結(jié)構(gòu)名稱,如EPROCESS、datapage(數(shù)據(jù)頁)等。數(shù)據(jù)表示單元中要保存的數(shù)據(jù),實際長度可變;數(shù)據(jù)長度也是整型,占4個字節(jié),表示單元內(nèi)數(shù)據(jù)的長度,與單元總長度構(gòu)成一個校驗關(guān)系,也起到隔離單元的作用。
對于結(jié)構(gòu)和內(nèi)核對象的恢復(fù),只要在識別出結(jié)構(gòu)和對象名稱后,申請一對應(yīng)結(jié)構(gòu),然后調(diào)用相應(yīng)結(jié)構(gòu)的restore方法即可實現(xiàn)恢復(fù)。
為了方便特定數(shù)據(jù)結(jié)構(gòu)的恢復(fù),針對每個類型的結(jié)構(gòu)編寫統(tǒng)一的save和restore方法。
在單個結(jié)構(gòu)之上,還按照進程創(chuàng)建函數(shù)CreateProcess中創(chuàng)建各結(jié)構(gòu)和對象的先后順序,定義了一套相關(guān)數(shù)據(jù)結(jié)構(gòu)創(chuàng)建的順序規(guī)則,這樣在保存和恢復(fù)時就確定了各單元數(shù)據(jù)中結(jié)構(gòu)和對象的對應(yīng)關(guān)系。
在這種情況下,對于由鏈表鏈接的多個元素,也無需特別說明,只要查看鏈表元素前后元素的類型,即可確定是鏈表節(jié)點,還是下一個元素。
3實驗設(shè)計
因本實驗內(nèi)容涉及知識面廣,且相互聯(lián)系比較緊湊,因此我們將其定位為“操作系統(tǒng)課程設(shè)計”的一個選擇。在6周左右的時間內(nèi),利用約40個小時左右的時間,完成相關(guān)系列實驗。實驗內(nèi)容按照從易到難的順序組織,開始時的指導(dǎo)材料比較齊備,使學(xué)生易于上手,產(chǎn)生學(xué)習(xí)興趣后主要依靠分析和研究能力實現(xiàn)。具體實驗內(nèi)容規(guī)劃如下。
(1) 為了使學(xué)生具體相應(yīng)Windows內(nèi)核基礎(chǔ),選擇設(shè)計了一些較為簡練的材料,提供給學(xué)生閱讀。文獻[10]的1、2、3、6、7章是主要閱讀內(nèi)容。
(2) 利用CRK、TRK提供的相關(guān)材料,指導(dǎo)學(xué)生完成相關(guān)實驗環(huán)境的搭建,練習(xí)使用Windbg,學(xué)會編寫基本的系統(tǒng)調(diào)用。
(3) 分析CreateProcess,學(xué)習(xí)進程創(chuàng)建基本過程,了解EPROCESS、KPROCESS、PEB、ETHREAD、KTHREAD、TEB、VAD、頁表等數(shù)據(jù)結(jié)構(gòu)。
(4) 嘗試一個最基本的進程的相關(guān)私有數(shù)據(jù)結(jié)構(gòu)的保存。為了克服最初的困難,恢復(fù)時可利用CreateProcess創(chuàng)建相關(guān)結(jié)構(gòu)后,再嘗試以保存的數(shù)據(jù)將相關(guān)結(jié)構(gòu)和數(shù)據(jù)替換后看能否繼續(xù)正確運行。
(5) 拋開CreateProcess,看恢復(fù)后能否繼續(xù)運行。
(6) 在具備了以上基本技能后,可依次展開以下實驗:
① 實現(xiàn)使用了堆的進程的保存和恢復(fù)。
② 實現(xiàn)使用了文件的進程的保存和恢復(fù)。
③ 實現(xiàn)使用了信號量的進程的保存和恢復(fù)。
④ 實現(xiàn)使用了共享數(shù)據(jù)的進程的保存和恢復(fù)。
⑤ 實現(xiàn)多線程進程的保存和恢復(fù)。
4實施方法與效果
考慮到實驗的知識面廣度和難度,以及Windows內(nèi)核分析資料相對比較缺乏的實際情況,為便于討論和研究,采用了團隊的實驗形式。
每個團隊3~5人,除基礎(chǔ)實驗環(huán)境要求每個人都必要熟悉外,關(guān)于最簡單進程的保存和存儲采用了分塊的形式。比如,4人的小組可一人負責(zé)進程中間數(shù)據(jù)的保存與恢復(fù),一人負責(zé)分析DLL機制并實現(xiàn)其描述方法,一人負責(zé)PEB相關(guān)內(nèi)核對象的分析與實現(xiàn),一人負責(zé)TEB中相關(guān)內(nèi)核對象的分析與實現(xiàn)。
在學(xué)習(xí)方法方面,對于入門級的內(nèi)容,借用CRK、TRK以及自己整理的相關(guān)文檔,提供詳細的指導(dǎo)材料,而對于入門之后的內(nèi)容,則主要采用研究性學(xué)習(xí)法,只提供實驗的目標(biāo)及簡單的分析思路,具體解決方案則需要學(xué)生通過理解理論課上的內(nèi)容加上對WRK相關(guān)源代碼的分析來自己尋找答案。對于學(xué)習(xí)中的問題和困難,每周固定2~3個小時可與任課教師或助教進行討論。
在項目進行過程中,允許學(xué)生根據(jù)自身的條件選擇其他實驗,以避免由于難度等問題產(chǎn)生的抵觸情緒。減員多的小組可考慮并組。
實施結(jié)果表明,本實驗的內(nèi)容和實施方式在調(diào)動學(xué)習(xí)興趣,提高學(xué)習(xí)主動性方面效果明顯。一些在其他課程學(xué)習(xí)中表現(xiàn)一般的同學(xué),在本實驗學(xué)習(xí)中表現(xiàn)優(yōu)秀。對于選擇了本實驗并堅持完成了的同學(xué),在期末筆試中成績幾乎全部為優(yōu)秀。
實施過程中,也有些同學(xué)反映分析工作量太大,精力不夠從而要求調(diào)換為其他實驗內(nèi)容。針對這種情況,需要考慮如何通過提供書面或課堂的指導(dǎo),適當(dāng)降低分析研究的工作量,以使實驗適應(yīng)盡量多學(xué)生的能力。
5結(jié)束語
WRK的出現(xiàn),使得我們有機會將Windows NT的典型1對1線程模型以實驗的方式應(yīng)用到對進程概念的理解上來。本文基于這一思想在WRK上設(shè)計并實施了一套進程的保存和恢復(fù)實驗。
該實驗采用研究性學(xué)習(xí)的方式克服實用操作系統(tǒng)知識點繁雜的困難,采用分層的方式解決實驗難度較大的問題。實際實施過程表明本實驗達到了滿意的效果。
參考文獻:
[1] 邱毓蘭,劉智滿,王卓立,等. Linux操作系統(tǒng)環(huán)境中的進程遷移算法研究[J]. 武漢大學(xué)學(xué)報:自然科學(xué)版,1999,45(03): 276-278.
[2] 肖紅,邱毓蘭,彭德純. 分布式計算系統(tǒng)中進程遷移的方法[J]. 軟件學(xué)報,1994,5(2):29-36.
[3] 陳向群. 探索操作系統(tǒng)實踐教學(xué)[J].計算機教育,2008(17):45-47.
[4] 羅宇,張穎蓓,葉常春. 本科操作系統(tǒng)課程設(shè)置及教學(xué)體會[J]. 計算機教育,2006(1):39-40.
[5] 宋廣華,李善平,鄭扣根. 邊學(xué)邊干:操作系統(tǒng)課程教學(xué)改革的探索與實踐[J]. 計算機教育,2006(7):27-29.
[6] 婁久,李秀坤,李治軍. 操作系統(tǒng)實驗課教學(xué)內(nèi)容與模式探討[J]. 計算機教育,2007(2):45-47.
[7] Abraham Silberschatz,Peter Baer Galvin,Greg Gagne. 操作系統(tǒng)概念(影印版)[M]. 6版. 北京:高等教育出版社,2005: 133-145.
[8] 彭敏,何炎祥. 基于WRK的Windows操作系統(tǒng)原理實驗教學(xué)探索[J]. 計算機教育,2008(20):38-40.
[9] Hengming Zou. Windows Curriculum at SJTU[C]. Asia Pacific Windows Core Workshop. Beijing,China. March,2009.
[10] Mark Russinovich,David Solomon. Microsoft Windows Internals [M]. Microsoft Press. 2005.
[11] 王春梅,陳慶燕. 研究性學(xué)習(xí)法在操作系統(tǒng)實驗教學(xué)中的應(yīng)用[J]. 福建電腦,2008(06):207,191.