原倉(cāng)周 王華鋒 申雪萍
摘要:本文在分析進(jìn)程凍結(jié)與恢復(fù)所涉及的相關(guān)知識(shí)點(diǎn)基礎(chǔ)上,給出了基于WRK(Windows Research Kernel)實(shí)現(xiàn)Windows進(jìn)程凍結(jié)與恢復(fù)的技術(shù)方案。通過(guò)將相關(guān)知識(shí)點(diǎn)按照相關(guān)性和難度分類,設(shè)計(jì)并實(shí)施了一種基于研究性學(xué)習(xí)法的教學(xué)方式,使學(xué)生變被動(dòng)學(xué)習(xí)為主動(dòng)學(xué)習(xí),提高了綜合分析能力和動(dòng)手能力,取得了滿意的教學(xué)效果。
關(guān)鍵詞:WRK;進(jìn)程;實(shí)驗(yàn)教學(xué)
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:B
1引言
在現(xiàn)代操作系統(tǒng)中,完整的進(jìn)程概念不僅表示一個(gè)運(yùn)行程序,實(shí)際上包括了處理器、內(nèi)存、文件、外設(shè)等程序運(yùn)行時(shí)可能涉及的各種“資源”,當(dāng)然也隱含了運(yùn)行中的程序如何與內(nèi)核“打交道”的相互調(diào)用問(wèn)題。因此,圍繞進(jìn)程的概念展開(kāi)實(shí)驗(yàn)內(nèi)容的安排有助于學(xué)生系統(tǒng)了解“進(jìn)程”在各實(shí)用操作系統(tǒng)中的具體實(shí)現(xiàn)方式,從抽象到具體,經(jīng)過(guò)理解消化后,再轉(zhuǎn)化為學(xué)生自己理解的“抽象”,最終達(dá)到系統(tǒng)化掌握各知識(shí)點(diǎn)的培養(yǎng)目標(biāo)。
將一個(gè)系統(tǒng)中的進(jìn)程凍結(jié)到外存,或通過(guò)網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器,然后在必要的時(shí)候再恢復(fù)其運(yùn)行,需要涉及到除進(jìn)程調(diào)度之外的幾乎所有操作系統(tǒng)核心知識(shí)點(diǎn),因此不僅適用于對(duì)“操作系統(tǒng)”課程的實(shí)驗(yàn)教學(xué),而且可應(yīng)用于進(jìn)程中間狀態(tài)保存、進(jìn)程在分布式環(huán)境中遷移以平衡負(fù)載等實(shí)際應(yīng)用,所以具有很好的教學(xué)和應(yīng)用研究?jī)r(jià)值。
將業(yè)界廣泛應(yīng)用的實(shí)用操作系統(tǒng)Solaris、Linux和Windows內(nèi)核應(yīng)用于“操作系統(tǒng)”課程實(shí)驗(yàn)已經(jīng)得到了國(guó)內(nèi)諸多知名高校的認(rèn)同。
由于Windows NT在最初設(shè)計(jì)時(shí)采用的就是適用于多CPU、大內(nèi)存的1對(duì)1線程模型,因此,盡管Linux和Solaris都在新版本中逐步向這一模型靠近,但在模型實(shí)現(xiàn)方面都沒(méi)有Windows清晰。
微軟推出的用于教學(xué)和科研目的的WRK(Windows Research Kernel),提供了大部分內(nèi)核源代碼,相應(yīng)配備的Windbg工具,以及配套教學(xué)資料,也為學(xué)習(xí)和研究Windows內(nèi)核提供了強(qiáng)有力的支持。
本文基于WRK及其相關(guān)的教學(xué)材料,通過(guò)將進(jìn)程凍結(jié)和恢復(fù)時(shí)需要解決的問(wèn)題按內(nèi)容和難度分類,設(shè)計(jì)了相關(guān)的實(shí)驗(yàn)?zāi)K和學(xué)習(xí)步驟,使學(xué)生通過(guò)研究性學(xué)習(xí)法完成力所能及的實(shí)驗(yàn)內(nèi)容,變被動(dòng)學(xué)習(xí)為主動(dòng)學(xué)習(xí),提高了綜合分析能力和動(dòng)手能力,取得了滿意的教學(xué)效果。
2技術(shù)方案的設(shè)計(jì)
要將一個(gè)已有的進(jìn)程凍結(jié),可以從用戶態(tài)應(yīng)用程序中調(diào)用系統(tǒng)提供的API完成,也可通過(guò)在內(nèi)核中添加自己的系統(tǒng)調(diào)用完成相應(yīng)功能。前者依賴于系統(tǒng)的提供的API,功能相對(duì)受限,實(shí)驗(yàn)難度相對(duì)容易控制,文獻(xiàn)[9]介紹了一種此類實(shí)現(xiàn)方法。我們選擇了后一種方案,相對(duì)來(lái)說(shuō)實(shí)現(xiàn)比較靈活,但對(duì)學(xué)生來(lái)說(shuō)實(shí)驗(yàn)工作量相對(duì)較大。
2.1進(jìn)程凍結(jié)涉及的內(nèi)容
進(jìn)程凍結(jié)時(shí)需要處理的內(nèi)容可分為兩大類:一類是進(jìn)程/線程自身特有的程序和數(shù)據(jù),不涉及別的進(jìn)程,因此只要按一定的格式保存到外存,然后釋放內(nèi)存資源即可。另一類是共享資源,包括內(nèi)核同步工具、共享數(shù)據(jù)等。對(duì)于這類數(shù)據(jù),需要根據(jù)其具體作用分析如何使進(jìn)程/線程與其“脫鉤”。“脫鉤”有兩個(gè)步驟,一是恢復(fù)時(shí)共享數(shù)據(jù)/對(duì)象的狀態(tài),是直接保存到時(shí)恢復(fù),還是到時(shí)根據(jù)具體情況創(chuàng)建一個(gè)新的對(duì)象然后設(shè)置成一定的狀態(tài);二是共享數(shù)據(jù)/對(duì)象的用戶數(shù)減1,用戶數(shù)為零時(shí)釋放資源。
第一類私有數(shù)據(jù)主要用于表示進(jìn)程和線程及其運(yùn)行上下文,包括EPROCESS、KPROCESS、PEB、ETHREAD、KTHREAD、TEB、VAD、頁(yè)表等數(shù)據(jù)結(jié)構(gòu),另外,還包括進(jìn)程各線程已經(jīng)運(yùn)行產(chǎn)生的相關(guān)中間數(shù)據(jù),如堆、棧、數(shù)據(jù)段、運(yùn)行環(huán)境等。如果啟用了交換功能,還要考慮進(jìn)程在交換空間的數(shù)據(jù)。
第二類共享數(shù)據(jù)主要包括進(jìn)程所用到的各種共享內(nèi)核對(duì)象,如session、mutex、socket等,也包括共享數(shù)據(jù),DLL映射等信息。這類信息都可通過(guò)第一類內(nèi)核對(duì)象中的指針找到。
2.2保存格式與恢復(fù)運(yùn)行
設(shè)計(jì)保存格式的主要目的是能夠在恢復(fù)時(shí)將當(dāng)初保存的數(shù)據(jù)“識(shí)別”出來(lái)。有兩種辦法。
第一種是沒(méi)有特別的格式表示,恢復(fù)程序按照保存數(shù)據(jù)結(jié)構(gòu)的順序依次讀出即可。這種方式的缺點(diǎn)的要求保存與恢復(fù)一一對(duì)應(yīng),只能一個(gè)寫(xiě)入程序?qū)σ粋€(gè)讀出程序。在學(xué)生一個(gè)人做嘗試實(shí)驗(yàn)時(shí)可這樣完成。
對(duì)于需要由多個(gè)同學(xué)協(xié)作完成的實(shí)驗(yàn),顯然不能采用以上方式。為此,我們?cè)O(shè)計(jì)了借鑒文件系統(tǒng)的實(shí)現(xiàn)方式,設(shè)計(jì)了一種“通用”的記錄格式。如圖1所示。

其中單元總長(zhǎng)度是整型,占4個(gè)字節(jié),表示一個(gè)數(shù)據(jù)單元的總的長(zhǎng)度;類型名表示本數(shù)據(jù)單元所存儲(chǔ)數(shù)據(jù)的類型,字符串,占10個(gè)字節(jié),它通常是結(jié)構(gòu)名稱,如EPROCESS、datapage(數(shù)據(jù)頁(yè))等。數(shù)據(jù)表示單元中要保存的數(shù)據(jù),實(shí)際長(zhǎng)度可變;數(shù)據(jù)長(zhǎng)度也是整型,占4個(gè)字節(jié),表示單元內(nèi)數(shù)據(jù)的長(zhǎng)度,與單元總長(zhǎng)度構(gòu)成一個(gè)校驗(yàn)關(guān)系,也起到隔離單元的作用。
對(duì)于結(jié)構(gòu)和內(nèi)核對(duì)象的恢復(fù),只要在識(shí)別出結(jié)構(gòu)和對(duì)象名稱后,申請(qǐng)一對(duì)應(yīng)結(jié)構(gòu),然后調(diào)用相應(yīng)結(jié)構(gòu)的restore方法即可實(shí)現(xiàn)恢復(fù)。
為了方便特定數(shù)據(jù)結(jié)構(gòu)的恢復(fù),針對(duì)每個(gè)類型的結(jié)構(gòu)編寫(xiě)統(tǒng)一的save和restore方法。
在單個(gè)結(jié)構(gòu)之上,還按照進(jìn)程創(chuàng)建函數(shù)CreateProcess中創(chuàng)建各結(jié)構(gòu)和對(duì)象的先后順序,定義了一套相關(guān)數(shù)據(jù)結(jié)構(gòu)創(chuàng)建的順序規(guī)則,這樣在保存和恢復(fù)時(shí)就確定了各單元數(shù)據(jù)中結(jié)構(gòu)和對(duì)象的對(duì)應(yīng)關(guān)系。
在這種情況下,對(duì)于由鏈表鏈接的多個(gè)元素,也無(wú)需特別說(shuō)明,只要查看鏈表元素前后元素的類型,即可確定是鏈表節(jié)點(diǎn),還是下一個(gè)元素。
3實(shí)驗(yàn)設(shè)計(jì)
因本實(shí)驗(yàn)內(nèi)容涉及知識(shí)面廣,且相互聯(lián)系比較緊湊,因此我們將其定位為“操作系統(tǒng)課程設(shè)計(jì)”的一個(gè)選擇。在6周左右的時(shí)間內(nèi),利用約40個(gè)小時(shí)左右的時(shí)間,完成相關(guān)系列實(shí)驗(yàn)。實(shí)驗(yàn)內(nèi)容按照從易到難的順序組織,開(kāi)始時(shí)的指導(dǎo)材料比較齊備,使學(xué)生易于上手,產(chǎn)生學(xué)習(xí)興趣后主要依靠分析和研究能力實(shí)現(xiàn)。具體實(shí)驗(yàn)內(nèi)容規(guī)劃如下。
(1) 為了使學(xué)生具體相應(yīng)Windows內(nèi)核基礎(chǔ),選擇設(shè)計(jì)了一些較為簡(jiǎn)練的材料,提供給學(xué)生閱讀。文獻(xiàn)[10]的1、2、3、6、7章是主要閱讀內(nèi)容。
(2) 利用CRK、TRK提供的相關(guān)材料,指導(dǎo)學(xué)生完成相關(guān)實(shí)驗(yàn)環(huán)境的搭建,練習(xí)使用Windbg,學(xué)會(huì)編寫(xiě)基本的系統(tǒng)調(diào)用。
(3) 分析CreateProcess,學(xué)習(xí)進(jìn)程創(chuàng)建基本過(guò)程,了解EPROCESS、KPROCESS、PEB、ETHREAD、KTHREAD、TEB、VAD、頁(yè)表等數(shù)據(jù)結(jié)構(gòu)。
(4) 嘗試一個(gè)最基本的進(jìn)程的相關(guān)私有數(shù)據(jù)結(jié)構(gòu)的保存。為了克服最初的困難,恢復(fù)時(shí)可利用CreateProcess創(chuàng)建相關(guān)結(jié)構(gòu)后,再嘗試以保存的數(shù)據(jù)將相關(guān)結(jié)構(gòu)和數(shù)據(jù)替換后看能否繼續(xù)正確運(yùn)行。
(5) 拋開(kāi)CreateProcess,看恢復(fù)后能否繼續(xù)運(yùn)行。
(6) 在具備了以上基本技能后,可依次展開(kāi)以下實(shí)驗(yàn):
① 實(shí)現(xiàn)使用了堆的進(jìn)程的保存和恢復(fù)。
② 實(shí)現(xiàn)使用了文件的進(jìn)程的保存和恢復(fù)。
③ 實(shí)現(xiàn)使用了信號(hào)量的進(jìn)程的保存和恢復(fù)。
④ 實(shí)現(xiàn)使用了共享數(shù)據(jù)的進(jìn)程的保存和恢復(fù)。
⑤ 實(shí)現(xiàn)多線程進(jìn)程的保存和恢復(fù)。
4實(shí)施方法與效果
考慮到實(shí)驗(yàn)的知識(shí)面廣度和難度,以及Windows內(nèi)核分析資料相對(duì)比較缺乏的實(shí)際情況,為便于討論和研究,采用了團(tuán)隊(duì)的實(shí)驗(yàn)形式。
每個(gè)團(tuán)隊(duì)3~5人,除基礎(chǔ)實(shí)驗(yàn)環(huán)境要求每個(gè)人都必要熟悉外,關(guān)于最簡(jiǎn)單進(jìn)程的保存和存儲(chǔ)采用了分塊的形式。比如,4人的小組可一人負(fù)責(zé)進(jìn)程中間數(shù)據(jù)的保存與恢復(fù),一人負(fù)責(zé)分析DLL機(jī)制并實(shí)現(xiàn)其描述方法,一人負(fù)責(zé)PEB相關(guān)內(nèi)核對(duì)象的分析與實(shí)現(xiàn),一人負(fù)責(zé)TEB中相關(guān)內(nèi)核對(duì)象的分析與實(shí)現(xiàn)。
在學(xué)習(xí)方法方面,對(duì)于入門級(jí)的內(nèi)容,借用CRK、TRK以及自己整理的相關(guān)文檔,提供詳細(xì)的指導(dǎo)材料,而對(duì)于入門之后的內(nèi)容,則主要采用研究性學(xué)習(xí)法,只提供實(shí)驗(yàn)的目標(biāo)及簡(jiǎn)單的分析思路,具體解決方案則需要學(xué)生通過(guò)理解理論課上的內(nèi)容加上對(duì)WRK相關(guān)源代碼的分析來(lái)自己尋找答案。對(duì)于學(xué)習(xí)中的問(wèn)題和困難,每周固定2~3個(gè)小時(shí)可與任課教師或助教進(jìn)行討論。
在項(xiàng)目進(jìn)行過(guò)程中,允許學(xué)生根據(jù)自身的條件選擇其他實(shí)驗(yàn),以避免由于難度等問(wèn)題產(chǎn)生的抵觸情緒。減員多的小組可考慮并組。
實(shí)施結(jié)果表明,本實(shí)驗(yàn)的內(nèi)容和實(shí)施方式在調(diào)動(dòng)學(xué)習(xí)興趣,提高學(xué)習(xí)主動(dòng)性方面效果明顯。一些在其他課程學(xué)習(xí)中表現(xiàn)一般的同學(xué),在本實(shí)驗(yàn)學(xué)習(xí)中表現(xiàn)優(yōu)秀。對(duì)于選擇了本實(shí)驗(yàn)并堅(jiān)持完成了的同學(xué),在期末筆試中成績(jī)幾乎全部為優(yōu)秀。
實(shí)施過(guò)程中,也有些同學(xué)反映分析工作量太大,精力不夠從而要求調(diào)換為其他實(shí)驗(yàn)內(nèi)容。針對(duì)這種情況,需要考慮如何通過(guò)提供書(shū)面或課堂的指導(dǎo),適當(dāng)降低分析研究的工作量,以使實(shí)驗(yàn)適應(yīng)盡量多學(xué)生的能力。
5結(jié)束語(yǔ)
WRK的出現(xiàn),使得我們有機(jī)會(huì)將Windows NT的典型1對(duì)1線程模型以實(shí)驗(yàn)的方式應(yīng)用到對(duì)進(jìn)程概念的理解上來(lái)。本文基于這一思想在WRK上設(shè)計(jì)并實(shí)施了一套進(jìn)程的保存和恢復(fù)實(shí)驗(yàn)。
該實(shí)驗(yàn)采用研究性學(xué)習(xí)的方式克服實(shí)用操作系統(tǒng)知識(shí)點(diǎn)繁雜的困難,采用分層的方式解決實(shí)驗(yàn)難度較大的問(wèn)題。實(shí)際實(shí)施過(guò)程表明本實(shí)驗(yàn)達(dá)到了滿意的效果。
參考文獻(xiàn):
[1] 邱毓蘭,劉智滿,王卓立,等. Linux操作系統(tǒng)環(huán)境中的進(jìn)程遷移算法研究[J]. 武漢大學(xué)學(xué)報(bào):自然科學(xué)版,1999,45(03): 276-278.
[2] 肖紅,邱毓蘭,彭德純. 分布式計(jì)算系統(tǒng)中進(jìn)程遷移的方法[J]. 軟件學(xué)報(bào),1994,5(2):29-36.
[3] 陳向群. 探索操作系統(tǒng)實(shí)踐教學(xué)[J].計(jì)算機(jī)教育,2008(17):45-47.
[4] 羅宇,張穎蓓,葉常春. 本科操作系統(tǒng)課程設(shè)置及教學(xué)體會(huì)[J]. 計(jì)算機(jī)教育,2006(1):39-40.
[5] 宋廣華,李善平,鄭扣根. 邊學(xué)邊干:操作系統(tǒng)課程教學(xué)改革的探索與實(shí)踐[J]. 計(jì)算機(jī)教育,2006(7):27-29.
[6] 婁久,李秀坤,李治軍. 操作系統(tǒng)實(shí)驗(yàn)課教學(xué)內(nèi)容與模式探討[J]. 計(jì)算機(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)原理實(shí)驗(yàn)教學(xué)探索[J]. 計(jì)算機(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)實(shí)驗(yàn)教學(xué)中的應(yīng)用[J]. 福建電腦,2008(06):207,191.