華北電力大學(xué) 操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第1頁(yè)
華北電力大學(xué) 操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第2頁(yè)
華北電力大學(xué) 操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第3頁(yè)
華北電力大學(xué) 操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第4頁(yè)
華北電力大學(xué) 操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、綜合實(shí)驗(yàn)報(bào)告( 2013 - 2014 年度第 1 學(xué)期)名 稱: 操作系統(tǒng)綜合實(shí)驗(yàn) 題 目: 基于OS Lab的操作系統(tǒng)綜合實(shí)驗(yàn) 院 系: 計(jì)算機(jī)系 班 級(jí): 網(wǎng)絡(luò) 學(xué) 號(hào): 201 學(xué)生姓名: 指導(dǎo)教師: 王平,王曉輝 設(shè)計(jì)周數(shù): 1 成 績(jī): 日 期: 2013 年 12 月 實(shí)驗(yàn)一:實(shí)驗(yàn)環(huán)境的使用1、 實(shí)驗(yàn)?zāi)康模?、熟悉操作系統(tǒng)集成實(shí)驗(yàn)環(huán)境OS Lab的基本使用方法。 2、練習(xí)編譯、調(diào)試EOS操作系統(tǒng)內(nèi)核以及EOS應(yīng)用程序。 二、實(shí)驗(yàn)內(nèi)容:1、啟動(dòng)OS Lab2、學(xué)習(xí)OS Lab的基本使用方法 3、EOS內(nèi)核項(xiàng)目的生成和調(diào)試 4、EOS應(yīng)用程序項(xiàng)目的生成和調(diào)試 5、退出OS Lab 6

2、、保存EOS內(nèi)核項(xiàng)目 三、實(shí)驗(yàn)過(guò)程:本實(shí)驗(yàn)實(shí)驗(yàn)過(guò)程主要按照eos操作系統(tǒng)實(shí)驗(yàn)教程上所對(duì)應(yīng)的章節(jié)來(lái)進(jìn)行。實(shí)驗(yàn)結(jié)果:(一)啟動(dòng)OS Lab :(無(wú))(二)學(xué)習(xí)OS Lab的基本使用方法 :(1)、創(chuàng)建了第一個(gè)項(xiàng)目:(2)、生成了第一個(gè)項(xiàng)目(3) 、添加了func文件后經(jīng)過(guò)一系列的調(diào)試,打印出了相關(guān)內(nèi)容,按shift+F5結(jié)束調(diào)試。(4)、查看變量的值:有3種方法:1、將鼠標(biāo)移動(dòng)到源代碼編輯器中變量n的名稱上,此時(shí)會(huì)彈出一個(gè)窗口顯示出變量n當(dāng)前的值(由于此時(shí)還沒(méi)有給變量n賦值,所以是一個(gè)隨機(jī)值)。 2、在源代碼編輯器中變量n的名稱上點(diǎn)擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“快速監(jiān)視”,可以使用“快速監(jiān)視

3、”對(duì)話框查看變量n的值。然后,可以點(diǎn)擊“關(guān)閉”按鈕關(guān)閉“快速監(jiān)視”對(duì)話框。 3、在源代碼編輯器中變量n的名稱上點(diǎn)擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添加監(jiān)視”,變量n就被添加到了“監(jiān)視”窗口中。使用“監(jiān)視”窗口可以隨時(shí)查看變量的值和類型。此時(shí)按F10進(jìn)行一次單步調(diào)試,可以看到“監(jiān)視”窗口中變量n的值會(huì)變?yōu)?(1)、調(diào)用堆棧 :使用“調(diào)用堆?!贝翱诳梢栽谡{(diào)試的過(guò)程中查看當(dāng)前堆棧上的函數(shù),還可以幫助理解函數(shù)的調(diào)用層次和調(diào)用過(guò)程。EOS內(nèi)核項(xiàng)目的生成和調(diào)試 :(2)、新建EOS內(nèi)核項(xiàng)目 (3)、生成項(xiàng)目 (4)、調(diào)試項(xiàng)目 (5)、查看軟盤鏡像文件中的內(nèi)容 (6)、查看EOS SDK(Software

4、 Development Kit)文件夾 EOS應(yīng)用程序項(xiàng)目的生成和調(diào)試 新建EOS應(yīng)用程序項(xiàng)目 生成項(xiàng)目 :按F7生成項(xiàng)目調(diào)試項(xiàng)目 :按F5進(jìn)行各種調(diào)試查看軟盤鏡像文件中的內(nèi)容 :使用FloppyImageEditor工具打開(kāi)該項(xiàng)目中的Floppy.img文件,查看軟盤鏡像中的文件。L修改EOS應(yīng)用程序項(xiàng)目名稱 (三)退出(四)保存四、實(shí)驗(yàn)總結(jié):經(jīng)過(guò)試驗(yàn)1,我理解了OS Lab的基本操作方法和主要用途,這為以后的試驗(yàn)打下了基礎(chǔ)。實(shí)驗(yàn)二: 操作系統(tǒng)的啟動(dòng)一、 實(shí)驗(yàn)?zāi)康膌跟蹤調(diào)試 EOS 在 PC 機(jī)上從加電復(fù)位到成功啟動(dòng)的全過(guò)程,了解操作統(tǒng)的啟動(dòng)過(guò)程。查看 EOS 啟動(dòng)后的狀態(tài)和行為,理解操作

5、系統(tǒng)啟動(dòng)后的工作方式。二、 實(shí)驗(yàn)內(nèi)容及其實(shí)驗(yàn)步驟3.1 準(zhǔn)備實(shí)驗(yàn)1. 啟動(dòng) OS Lab。2. 新建一個(gè) EOS Kernel 項(xiàng)目。3. 在“項(xiàng)目管理器”窗口中打開(kāi) boot 文件夾中的 boot.asm 和 loader.asm 兩個(gè)匯編文件。boot.asm是軟盤引導(dǎo)扇區(qū)程序的源文件,loader.asm 是 loader 程序的源文件。簡(jiǎn)單閱讀一下這兩個(gè)文件中的 NASM 匯編代碼和注釋。4. 按 F7 生成項(xiàng)目。5. 生成完成后,使用 Windows 資源管理器打開(kāi)項(xiàng)目文件夾中的 Debug 文件夾。找到由 boot.asm 生成的軟盤引導(dǎo)扇區(qū)程序 boot.bin 文件,該文件的大

6、小一定為 512 字節(jié)(與軟盤引導(dǎo)扇區(qū)的大小一致)。找到由 loader.asm 生成的 loader 程序 loader.bin 文件,記錄下此文件的大小 1566 字節(jié),在下面的實(shí)驗(yàn)中會(huì)用到。找到由其它源文件生成的操作系統(tǒng)內(nèi)核文件 kernel.dll。3.2 調(diào)試 EOS 操作系統(tǒng)的啟動(dòng)過(guò)程3.2.1 使用 Bochs 做為遠(yuǎn)程目標(biāo)機(jī)3.2.2 調(diào)試 BIOS 程序啟動(dòng)調(diào)試后,Bochs 在 CPU 要執(zhí)行的第一條指令(即 BIOS 的第一條指令)處中斷。 此時(shí),Display窗口沒(méi)有顯示任何內(nèi)容,Console 窗口顯示要執(zhí)行的 BIOS 第一條指令的相關(guān)信息,并等待用戶輸入調(diào)試命令,

7、如圖 10-1:從 Console 窗口顯示的內(nèi)容中,我們可以獲得關(guān)于 BIOS 第一條指令的如下信息:行首的0xfffffff0表示此條指令所在的物理地址。lf000:fff0 表示此條指令所在的邏輯地址(段地址:偏移地址)。ljmp far f000:e05b 是此條指令的反匯編代碼。l行尾的 ea5be000f0 是此條指令的十六進(jìn)制字節(jié)碼,可以看出此條指令有 5 個(gè)字節(jié)。接下來(lái)可以按照下面的步驟,查看 CPU 在沒(méi)有執(zhí)行任何指令之前主要寄存器中的數(shù)據(jù),以及內(nèi)存中的數(shù)據(jù):1. 在 Console 窗口中輸入調(diào)試命令 sreg 后按回車,顯示當(dāng)前 CPU 中各個(gè)段寄存器的值,如圖 10-2

8、。其中 CS 寄存器信息行中的“s=0xf000”表示 CS 寄存器的值為 0xf000。2. 輸入調(diào)試命令 r 后按回車,顯示當(dāng)前 CPU 中各個(gè)通用寄存器的值,如圖 10-3。其中“rip:0x00000000:0000fff0”表示 IP 寄存器的值為 0xfff0。3. 輸入調(diào)試命令 xp /1024b 0x0000,查看開(kāi)始的 1024 個(gè)字節(jié)的物理內(nèi)存。在 Console 中輸出的這1K 物理內(nèi)存的值都為 0,說(shuō)明 BIOS 中斷向量表還沒(méi)有被加載到此處。4. 輸入調(diào)試命令 xp /512b 0x7c00,查看軟盤引導(dǎo)扇區(qū)應(yīng)該被加載到的內(nèi)存位置。輸出的內(nèi)存值都為 0,說(shuō)明軟盤引導(dǎo)扇

9、區(qū)還沒(méi)有被加載到此處。3.2.3 調(diào)試軟盤引導(dǎo)扇區(qū)程序3.2.4 調(diào)試加載程序3.2.5 調(diào)試內(nèi)核調(diào)試內(nèi)核的步驟如下:1. 在 OS Lab 的“項(xiàng)目管理器”窗口中打開(kāi) ke 文件夾中的 start.c 文件,此文件中只定義了一個(gè)函數(shù),就是操作系統(tǒng)內(nèi)核的入口點(diǎn)函數(shù) KiSystemStartup。2. 在 KiSystemStartup 函數(shù)中的代碼行(第 61 行)KiInitializePic();添加一個(gè)斷點(diǎn)。3. 現(xiàn)在可以在 Console 窗口中輸入調(diào)試命令 c 繼續(xù)調(diào)試,在剛剛添加的斷點(diǎn)處中斷。4. 在 start.c 源代碼文件中的 KiSystemStartup 函數(shù)名上點(diǎn)擊鼠

10、標(biāo)右鍵,在彈出的快捷菜單中選擇“添加監(jiān)視”,KiSystemStartup 函數(shù)就被添加到了“監(jiān)視”窗口中。在“監(jiān)視”窗口中可以看到此函數(shù)地址為void (PVOID) 0x800* <KiSystemStartup>與在虛擬內(nèi)存 x80001117 處保存的函數(shù)入口地址相同,說(shuō)明的確是由 Loader 程序進(jìn)入了操作系統(tǒng)內(nèi)核。5. 按 F5 繼續(xù)執(zhí)行 EOS 操作系統(tǒng)內(nèi)核,在 Display 窗口中顯示 EOS 操作系統(tǒng)已經(jīng)啟動(dòng),并且控制臺(tái)EOS 操作系統(tǒng)實(shí)驗(yàn)教程北京海西慧學(xué)科技有限公司 126程序已經(jīng)開(kāi)始運(yùn)行了。3.2.6 EOS 啟動(dòng)后的狀態(tài)和行為查看 EOS 的版本號(hào):1.

11、 在控制臺(tái)中輸入命令“ver”后按回車。2. 輸出 EOS 版本后的控制臺(tái)如圖 10-4 所示。查看 EOS 啟動(dòng)后的進(jìn)程和線程的信息:1. 在控制臺(tái)中輸入命令“pt”后按回車。2. 輸出的進(jìn)程和線程信息如圖 10-5 所示。3.2.6 EOS 啟動(dòng)后的狀態(tài)和行為三. 實(shí)驗(yàn)總結(jié) 通過(guò)本實(shí)驗(yàn)了解操作系統(tǒng)的啟動(dòng)過(guò)程,理解操作系統(tǒng)啟動(dòng)后的工作方式。實(shí)驗(yàn)三:進(jìn)程的創(chuàng)建:一、實(shí)驗(yàn)?zāi)康模?、練習(xí)使用EOS API函數(shù)CreateProcess創(chuàng)建一個(gè)進(jìn)程,掌握創(chuàng)建進(jìn)程的方法,理解進(jìn)程和程序的區(qū)別。 2、調(diào)試跟蹤C(jī)reateProcess函數(shù)的執(zhí)行過(guò)程,了解進(jìn)程的創(chuàng)建過(guò)程,理解進(jìn)程是資源分配的單位。 二、

12、實(shí)驗(yàn)內(nèi)容:1、準(zhǔn)備實(shí)驗(yàn):新建一個(gè)EOS Kernel項(xiàng)目,分別使用Debug配置和Release配置生成此項(xiàng)目。新建一個(gè)EOS應(yīng)用程序項(xiàng)目,使用在第EOS Kernel生成的SDK文件夾覆蓋EOS應(yīng)用程序項(xiàng)目文件夾中的SDK文件夾。 2、練習(xí)使用控制臺(tái)命令創(chuàng)建EOS應(yīng)用程序的進(jìn)程 3、練習(xí)通過(guò)編程的方式讓應(yīng)用程序創(chuàng)建另一個(gè)應(yīng)用程序的進(jìn)程 4、調(diào)試CreateProcess函數(shù) 5、調(diào)試PsCreateProcess函數(shù) 6、練習(xí)通過(guò)編程的方式創(chuàng)建應(yīng)用程序的多個(gè)進(jìn)程 三、實(shí)驗(yàn)過(guò)程:1、準(zhǔn)備實(shí)驗(yàn):(無(wú))2、練習(xí)使用控制臺(tái)命令創(chuàng)建EOS應(yīng)用程序的進(jìn)程:使用FloppyImageEditor工具將本實(shí)

13、驗(yàn)文件夾內(nèi)的Hello.exe文件添加到Floppy.img文件中。啟動(dòng)調(diào)試,在EOS的控制臺(tái)中輸入命令“A:Hello.exe”后回車。 得到結(jié)果:3、練習(xí)通過(guò)編程的方式讓應(yīng)用程序創(chuàng)建另一個(gè)應(yīng)用程序的進(jìn)程 :使用NewProc.c文件中的源代碼替換之前創(chuàng)建的EOS應(yīng)用程序項(xiàng)目中的EOSApp.c文件內(nèi)的源代碼。 啟動(dòng)調(diào)試,得到如下結(jié)果:可以看到父進(jìn)程(EOSApp.exe)首先開(kāi)始執(zhí)行并輸出內(nèi)容,父進(jìn)程創(chuàng)建了子進(jìn)程(Hello.exe)后,子進(jìn)程開(kāi)始執(zhí)行并輸出內(nèi)容,待子進(jìn)程結(jié)束后父進(jìn)程再繼續(xù)執(zhí)行。 4、調(diào)試CreateProcess函數(shù):按F5啟動(dòng)調(diào)試EOS應(yīng)用程序,在彈出異常對(duì)話框后點(diǎn)“是

14、”,在main函數(shù)中調(diào)用CreateProcess函數(shù)的代碼行添加一個(gè)斷點(diǎn)。5、調(diào)試PsCreateProcess函數(shù):在PsCreateProcess函數(shù)中找到調(diào)用PspCreateProcessEnvironment函數(shù)的代碼行添加一個(gè)斷點(diǎn)。 進(jìn)入此中斷,按F11進(jìn)入PspCreateProcessEnvironment函數(shù)。 在調(diào)用ObCreateObject函數(shù)的代碼行添加一個(gè)斷點(diǎn),進(jìn)入此中斷,將表達(dá)式*NewProcess添加到“監(jiān)視”窗口中,監(jiān)視其值得變化。接下來(lái)調(diào)試初始化進(jìn)程控制塊中各個(gè)成員變量的過(guò)程: 1) 首先創(chuàng)建進(jìn)程的地址空間,即4G虛擬地址空間。2)按F5繼續(xù)調(diào)試,到此斷

15、點(diǎn)處中斷。 3)按F10執(zhí)行此行代碼后中斷。 4)在“監(jiān)視”窗口中查看進(jìn)程控制塊的成員變量Pas的值已經(jīng)不再是0。說(shuō)明已經(jīng)初始化了進(jìn)程的4G虛擬地址空間。 5)使用F10一步步調(diào)試PspCreateProcessEnvironment函數(shù)中后面的代碼,在調(diào)試的過(guò)程中根據(jù)執(zhí)行的源代碼,查看“監(jiān)視”窗口中*NewProcess表達(dá)式的值,。 6)當(dāng)從PspCreateProcessEnvironment函數(shù)返回到PsCreateProcess函數(shù)后,停止按F10。此時(shí)“監(jiān)視”窗口中已經(jīng)不能再顯示表達(dá)式*NewProcess的值了,在PsCreateProcess函數(shù)中是使用ProcessObjec

16、t指針指向進(jìn)程控制塊的,所以將表達(dá)式*ProcessObject添加到“監(jiān)視”窗口中就可以繼續(xù)觀察新建進(jìn)程控制塊中的信息。 7)接下來(lái)繼續(xù)使用F10一步步調(diào)試PsCreateProcess函數(shù)中的代碼,同樣要注意觀察執(zhí)行后的代碼修改了進(jìn)程控制塊中的哪些成員變量。8)按F5繼續(xù)執(zhí)行,EOS內(nèi)核會(huì)為剛剛初始化完畢的進(jìn)程控制塊新建一個(gè)進(jìn)程。激活虛擬機(jī)窗口查看新建進(jìn)程執(zhí)行的結(jié)果。 9)在OS Lab中選擇“調(diào)試”菜單中的“停止調(diào)試”結(jié)束此次調(diào)試。 10)選擇“調(diào)試”菜單中的“刪除所有斷點(diǎn)”。 結(jié)果:代碼:/*提供該示例代碼是為了闡釋一個(gè)概念,或者進(jìn)行一個(gè)測(cè)試,并不代表著最安全的編碼實(shí)踐,因此不應(yīng)在應(yīng)用

17、程序或網(wǎng)站中使用該示例代碼。對(duì)于超出本示例代碼的預(yù)期用途以外的使用所造成的偶然或繼發(fā)性損失,北京海西慧學(xué)科技有限公司不承擔(dān)任何責(zé)任。*/#include "EOSApp.h"/ main 函數(shù)參數(shù)的意義:/ argc - argv 數(shù)組的長(zhǎng)度,大小至少為 1,argc - 1 為命令行參數(shù)的數(shù)量。/ argv - 字符串指針數(shù)組,數(shù)組長(zhǎng)度為命令行參數(shù)個(gè)數(shù) + 1。其中 argv0 固定指向當(dāng)前/ 進(jìn)程所執(zhí)行的可執(zhí)行文件的路徑字符串,argv1 及其后面的指針指向各個(gè)命令行/ 參數(shù)。/ 例如通過(guò)命令行內(nèi)容 "a:hello.exe -a -b" 啟動(dòng)進(jìn)程后

18、,hello.exe 的 main 函/ 數(shù)的參數(shù) argc 的值為 3,argv0 指向字符串 "a:hello.exe",argv1 指向/ 參數(shù)字符串 "-a",argv2 指向參數(shù)字符串 "-b"。/int main(int argc, char* argv)/ 啟動(dòng)調(diào)試 EOS 應(yīng)用程序前要特別注意下面的問(wèn)題:/ 1、如果要在調(diào)試應(yīng)用程序時(shí)能夠調(diào)試進(jìn)入內(nèi)核并顯示對(duì)應(yīng)的源碼,/ 必須使用 EOS 核心項(xiàng)目編譯生成完全版本的 SDK 文件夾,然/ 后使用此文件夾覆蓋應(yīng)用程序項(xiàng)目中的 SDK 文件夾,并且 EOS/ 核心項(xiàng)目在磁盤

19、上的位置不能改變。/ 2、在啟動(dòng)調(diào)試應(yīng)用程序之前必須首先刪除/禁用所有的斷點(diǎn),在斷/ 點(diǎn)中斷 (int 3) 被命中后才能重新添加/啟用斷點(diǎn),否則啟動(dòng)/ 調(diào)試會(huì)失敗。/STARTUPINFO StartupInfo;PROCESS_INFORMATION ProcInfoOne5;ULONG ulExitCode;/ 子進(jìn)程退出碼INT nResult = 0;/ main 函數(shù)返回值。0 表示成功,非 0 表示失敗。#ifdef _DEBUG_asm("int $3n nop");#endifprintf("Create two processes and wa

20、it for the processes exit.nn");/ 使子進(jìn)程和父進(jìn)程使用相同的標(biāo)準(zhǔn)句柄。/StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE);StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE);StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE);/ 為一個(gè)應(yīng)用程序同時(shí)創(chuàng)建兩個(gè)子進(jìn)程。/int i=0;for(;i<5;i+)if (CreateProcess("A:Hello.exe&

21、quot;, NULL, 0, &StartupInfo, &ProcInfoOnei) / 創(chuàng)建子進(jìn)程成功,等待子進(jìn)程運(yùn)行結(jié)束。/WaitForSingleObject(ProcInfoOnei.ProcessHandle, INFINITE);/WaitForSingleObject(ProcInfoTwo.ProcessHandle, INFINITE);/ 得到并輸出子進(jìn)程的退出碼。/GetExitCodeProcess(ProcInfoOnei.ProcessHandle, &ulExitCode);printf("nThe process one

22、exit with %d.n", ulExitCode);/GetExitCodeProcess(ProcInfoTwo.ProcessHandle, &ulExitCode);/printf("nThe process two exit with %d.n", ulExitCode);/ 關(guān)閉不再使用的句柄。/CloseHandle(ProcInfoOnei.ProcessHandle);CloseHandle(ProcInfoOnei.ThreadHandle);/CloseHandle(ProcInfoTwo.ProcessHandle);/Clos

23、eHandle(ProcInfoTwo.ThreadHandle); else printf("CreateProcess Failed, Error code: 0x%X.n", GetLastError();nResult = 1;return nResult;實(shí)驗(yàn)四:線程的狀態(tài)和轉(zhuǎn)換 一、實(shí)驗(yàn)?zāi)康模?、調(diào)試線程在各種狀態(tài)間的轉(zhuǎn)換過(guò)程,熟悉線程的狀態(tài)和轉(zhuǎn)換。 2、通過(guò)為線程增加掛起狀態(tài),加深對(duì)線程狀態(tài)的理解。 二、實(shí)驗(yàn)內(nèi)容及步驟:1、準(zhǔn)備實(shí)驗(yàn):新建一個(gè)EOS Kernel項(xiàng)目。 2、調(diào)試線程狀態(tài)的轉(zhuǎn)換過(guò)程:對(duì)第一步的項(xiàng)目啟動(dòng)調(diào)試,待EOS啟動(dòng)完畢,在EOS控制臺(tái)中輸入命

24、令“l(fā)oop”后按回車。得到結(jié)果: 結(jié)束調(diào)試。1. 控制臺(tái)派遣線程被喚醒,由阻塞狀態(tài)進(jìn)入就緒狀態(tài)。 2. loop線程由運(yùn)行狀態(tài)進(jìn)入就緒狀態(tài)。 3. 控制臺(tái)派遣線程由就緒狀態(tài)進(jìn)入運(yùn)行狀態(tài)。 4. 待控制臺(tái)派遣線程處理完畢由于空格鍵被按下而產(chǎn)生的鍵盤事件后,派遣線程會(huì)由運(yùn)行狀態(tài)重新進(jìn)入阻塞狀態(tài),開(kāi)始等待下一個(gè)鍵盤事件到來(lái)。 5. loop線程由就緒狀態(tài)進(jìn)入運(yùn)行狀態(tài),繼續(xù)執(zhí)行死循環(huán)。 按F5繼續(xù)執(zhí)行,在PspSelectNextThread函數(shù)中的斷點(diǎn)處中斷。按F5繼續(xù)執(zhí)行,在PspUnreadyThread函數(shù)中的斷點(diǎn)處中斷。在快速監(jiān)視對(duì)話框中查看“*Thread”表達(dá)式的值。關(guān)閉快速監(jiān)視對(duì)話框

25、后,在“調(diào)用堆?!贝翱谥屑せ頟spSelectNextThread函數(shù)對(duì)應(yīng)的堆棧項(xiàng),在“調(diào)用堆?!贝翱谥屑せ頟spUnreadyThread函數(shù)對(duì)應(yīng)的堆棧項(xiàng),然后按F10單步調(diào)試,直到返回PspSelectNextThread函數(shù)并將線程狀態(tài)修改為Running。按F5繼續(xù)執(zhí)行,在PspWait函數(shù)中的斷點(diǎn)處中斷。3、為線程增加掛起狀態(tài):刪除之前添加的所有斷點(diǎn)。 按F5啟動(dòng)調(diào)試。 待EOS啟動(dòng)完畢,在EOS控制臺(tái)中輸入命令“l(fā)oop”后按回車。此時(shí)可以看到loop線程的執(zhí)行計(jì)數(shù)在不停增長(zhǎng),說(shuō)明loop線程正在執(zhí)行。記錄下loop線程的ID。 按Ctrl+F2切換到控制臺(tái)2,輸入命令“suspe

26、nd 31”(如果loop線程的ID是31)后按回車。命令執(zhí)行成功的結(jié)果如圖12-2所示。 按Ctrl+1切換回控制臺(tái)1,可以看到由于loop線程已經(jīng)成功被掛起,其執(zhí)行計(jì)數(shù)已經(jīng)停止增長(zhǎng)了。此時(shí)占用處理器的是EOS中的空閑線程。 Resume原語(yǔ)可以將一個(gè)被Suspend原語(yǔ)掛起的線程(處于靜止就緒狀態(tài))恢復(fù)為就緒狀態(tài)。但是PsResumThread函數(shù)中的這部分代碼(第119行),完成這部分代碼。代碼:/*提供該示例代碼是為了闡釋一個(gè)概念,或者進(jìn)行一個(gè)測(cè)試,并不代表著最安全的編碼實(shí)踐,因此不應(yīng)在應(yīng)用程序或網(wǎng)站中使用該示例代碼。*/STATUSPsResumThread(IN HANDLE hT

27、hread)/*+功能描述:恢復(fù)指定的線程。參數(shù):hThread - 需要被恢復(fù)的線程的句柄。返回值:如果成功則返回 STATUS_SUCCESS。-*/STATUS Status;BOOL IntState;PTHREAD Thread;/ 根據(jù)線程句柄獲得線程對(duì)象的指針/Status = ObRefObjectByHandle(hThread, PspThreadType, (PVOID*)&Thread);if (EOS_SUCCESS(Status) IntState = KeEnableInterrupts(FALSE);/ 關(guān)中斷if (Zero = Thread->

28、State) / 將線程從掛起線程隊(duì)列中移除。/ListRemoveEntry(&Thread->StateListEntry);/ 將掛起的線程恢復(fù)為就緒狀態(tài)。/ 線程由靜止就緒狀態(tài)(Static Ready)進(jìn)入活動(dòng)就緒狀態(tài)(Active Ready)。/PspReadyThread(Thread);/ 執(zhí)行線程調(diào)度,讓剛剛恢復(fù)的線程有機(jī)會(huì)執(zhí)行(如果真的能夠調(diào)度到它的話)。/PspThreadSchedule();Status = STATUS_SUCCESS; else Status = STATUS_NOT_SUPPORTED;KeEnableInterrupts(Int

29、State);/ 開(kāi)中斷ObDerefObject(Thread);return Status;測(cè)試方法 :待讀者完成Resume原語(yǔ)后,可以先使用suspend命令掛起loop線程,然后在控制臺(tái)2中輸入命令“Resume 31”(如果loop線程的ID是31)后按回車。 思考題:思考一下,在本實(shí)驗(yàn)中,當(dāng)loop線程處于運(yùn)行狀態(tài)時(shí), EOS 中還有哪些線程,它們分別處于什么狀態(tài)??梢允褂每刂婆_(tái)命令pt查看線程的狀態(tài)。3、 實(shí)驗(yàn)總結(jié):明白了loop指令的用法以及resume原語(yǔ)的結(jié)構(gòu)。實(shí)驗(yàn)五:進(jìn)程的同步 一、實(shí)驗(yàn)?zāi)康模?、使用EOS的信號(hào)量,編程解決生產(chǎn)者消費(fèi)者問(wèn)題,理解進(jìn)程同步的意義。 2、調(diào)

30、試跟蹤EOS信號(hào)量的工作過(guò)程,理解進(jìn)程同步的原理。 3、修改EOS的信號(hào)量算法,使之支持等待超時(shí)喚醒功能(有限等待),加深理解進(jìn)程同步的原理。 二、實(shí)驗(yàn)內(nèi)容和步驟:1、準(zhǔn)備實(shí)驗(yàn):新建一個(gè)EOS Kernel項(xiàng)目。 生成EOS Kernel項(xiàng)目,從而在該項(xiàng)目文件中生成SDK文件夾。新建一個(gè)EOS應(yīng)用程序項(xiàng)目。使用在第3步生成的SDK文件夾覆蓋EOS應(yīng)用程序項(xiàng)目文件夾中的SDK文件夾。2、使用EOS的信號(hào)量解決生產(chǎn)者消費(fèi)者問(wèn)題:在本實(shí)驗(yàn)文件夾中,提供了使用EOS的信號(hào)量解決生產(chǎn)者消費(fèi)者問(wèn)題的參考源代碼文件pc.c,仔細(xì)閱讀此文件中的源代碼和注釋。使用pc.c文件中的源代碼,替換之前創(chuàng)建的EOS應(yīng)用

31、程序項(xiàng)目中EOSApp.c文件內(nèi)的源代碼。按F5啟動(dòng)調(diào)試。立即激活虛擬機(jī)窗口查看生產(chǎn)者消費(fèi)者同步執(zhí)行的過(guò)程。結(jié)果:3、調(diào)試EOS信號(hào)量的工作過(guò)程:?jiǎn)?dòng)調(diào)試,在main函數(shù)中創(chuàng)建Empty信號(hào)量的代碼行添加一個(gè)斷點(diǎn)。按F5繼續(xù)調(diào)試,到此斷點(diǎn)處中斷。按F11調(diào)試進(jìn)入CreateSemaphore函數(shù)??梢钥吹酱薃PI函數(shù)只是調(diào)用了EOS內(nèi)核中的PsCreateSemaphoreObject函數(shù)來(lái)創(chuàng)建信號(hào)量對(duì)象。按F11調(diào)試進(jìn)入semaphore.c文件中的PsCreateSemaphoreObject函數(shù)。在semaphore.c文件的頂部查找到PsInitializeSemaphore函數(shù)的定義

32、(第19行),在此函數(shù)的第一行(第39行)代碼處添加一個(gè)斷點(diǎn)。按F5繼續(xù)調(diào)試,到斷點(diǎn)處中斷。觀察PsInitializeSemaphore函數(shù)中用來(lái)初始化信號(hào)量結(jié)構(gòu)體成員的值,應(yīng)該和傳入CreateSemaphore函數(shù)的參數(shù)值是一致的。按F10單步調(diào)試PsInitializeSemaphore函數(shù)執(zhí)行的過(guò)程,查看信號(hào)量結(jié)構(gòu)體被初始化的過(guò)程。打開(kāi)“調(diào)用堆?!贝翱?,查看函數(shù)的調(diào)用層次。 生產(chǎn)者和消費(fèi)者剛開(kāi)始執(zhí)行時(shí),用來(lái)放產(chǎn)品的緩沖區(qū)都是空的,所以生產(chǎn)者在第一次調(diào)用WaitForSingleObject函數(shù)等待Empty信號(hào)量時(shí),應(yīng)該不需要阻塞就可以立即返回。由于開(kāi)始時(shí)生產(chǎn)者線程生產(chǎn)產(chǎn)品的速度較快

33、,而消費(fèi)者線程消費(fèi)產(chǎn)品的速度較慢,所以當(dāng)緩沖池中所有的緩沖區(qū)都被產(chǎn)品占用時(shí),生產(chǎn)者在生產(chǎn)新的產(chǎn)品時(shí)就會(huì)被阻塞。只有當(dāng)消費(fèi)者線程從緩沖池中消費(fèi)了一個(gè)產(chǎn)品,從而產(chǎn)生一個(gè)空緩沖區(qū)后,生產(chǎn)者線程才會(huì)被喚醒并繼續(xù)生產(chǎn)14號(hào)產(chǎn)品。4、修改EOS的信號(hào)量算法:現(xiàn)在要求同時(shí)修改PsWaitForSemaphore函數(shù)和PsReleaseSemaphore函數(shù)中的代碼,使這兩個(gè)參數(shù)能夠真正起到作用,使信號(hào)量對(duì)象支持等待超時(shí)喚醒功能和批量釋放功能。 測(cè)試方法:修改完畢后,可以按照下面的方法進(jìn)行測(cè)試: 1. 使用修改完畢的EOS Kernel項(xiàng)目生成完全版本的SDK文件夾,并覆蓋之前的生產(chǎn)者消費(fèi)者應(yīng)用程序項(xiàng)目的SD

34、K文件夾。 2. 按F5調(diào)試執(zhí)行原有的生產(chǎn)者消費(fèi)者應(yīng)用程序項(xiàng)目,結(jié)果必須仍然與圖13-2一致。如果有錯(cuò)誤,可以調(diào)試內(nèi)核代碼來(lái)查找錯(cuò)誤,然后在內(nèi)核項(xiàng)目中修改,并重復(fù)步驟1。 3. 將Producer函數(shù)中等待Empty信號(hào)量的代碼行 WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 替換為 while(WAIT_TIMEOUT = WaitForSingleObject(EmptySemaphoreHandle, 300) printf("Producer wait for empty semaphore timeoutn&quo

35、t;); 4. 將Consumer函數(shù)中等待Full信號(hào)量的代碼行 WaitForSingleObject(FullSemaphoreHandle, INFINITE); 替換為 while(WAIT_TIMEOUT = WaitForSingleObject(FullSemaphoreHandle, 300) printf("Consumer wait for full semaphore timeoutn"); 5. 啟動(dòng)調(diào)試新的生產(chǎn)者消費(fèi)者項(xiàng)目,查看在虛擬機(jī)中輸出的結(jié)果,驗(yàn)證信號(hào)量超時(shí)等待功能是否能夠正常執(zhí)行。如果有錯(cuò)誤,可以調(diào)試內(nèi)核代碼來(lái)查找錯(cuò)誤,然后在內(nèi)核項(xiàng)目中修

36、改,并重復(fù)步驟1。 6. 如果超時(shí)等待功能已經(jīng)能夠正常執(zhí)行,可以考慮將消費(fèi)者線程修改為一次消費(fèi)兩個(gè)產(chǎn)品,來(lái)測(cè)試ReleaseCount參數(shù)是否能夠正常使用。使用實(shí)驗(yàn)文件夾中NewConsumer.c文件中的Consumer函數(shù)替換原有的Consumer函數(shù)。 實(shí)驗(yàn)六:時(shí)間片輪轉(zhuǎn)調(diào)度一、實(shí)驗(yàn)?zāi)康?調(diào)試EOS的線程調(diào)度程序,熟悉基于優(yōu)先級(jí)的搶先式調(diào)度。 為EOS添加時(shí)間片輪轉(zhuǎn)調(diào)度,了解其它常用的調(diào)度算法。 二、預(yù)備知識(shí) 閱讀本書第5章中的第5.4節(jié)。重點(diǎn)理解EOS當(dāng)前使用的基于優(yōu)先級(jí)的搶先式調(diào)度,調(diào)度程序執(zhí)行的時(shí)機(jī)和流程,以及實(shí)現(xiàn)時(shí)間片輪轉(zhuǎn)調(diào)度的細(xì)節(jié)。實(shí)驗(yàn)內(nèi)容3.1 準(zhǔn)備實(shí)驗(yàn)3.2 閱讀控制臺(tái)命令“rr”相關(guān)的源代碼沒(méi)有時(shí)間片輪轉(zhuǎn)調(diào)度時(shí)“rr”命令的執(zhí)行效果3.3調(diào)試線程調(diào)度程序3.3.1 調(diào)試當(dāng)前線程不被搶先的情況3.3.2 調(diào)試當(dāng)前線程被搶先的情況3.4 為EOS添加時(shí)間片輪轉(zhuǎn)調(diào)度(行時(shí)間片輪轉(zhuǎn)調(diào)度時(shí)“rr”命令的執(zhí)行效果)實(shí)驗(yàn)七:物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理一、實(shí)驗(yàn)?zāi)康?通過(guò)查看物理存儲(chǔ)器的使用情況,并練習(xí)分配和回收物理內(nèi)存,從而掌握物理存儲(chǔ)器的管理方法。 通過(guò)查看進(jìn)程邏輯地址空間的使用情況,并練

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論