華北電力大學 操作系統(tǒng)實驗報告_第1頁
華北電力大學 操作系統(tǒng)實驗報告_第2頁
華北電力大學 操作系統(tǒng)實驗報告_第3頁
華北電力大學 操作系統(tǒng)實驗報告_第4頁
華北電力大學 操作系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

6、小一定為 512 字節(jié)(與軟盤引導扇區(qū)的大小一致)。找到由 loader.asm 生成的 loader 程序 loader.bin 文件,記錄下此文件的大小 1566 字節(jié),在下面的實驗中會用到。找到由其它源文件生成的操作系統(tǒng)內(nèi)核文件 kernel.dll。3.2 調(diào)試 EOS 操作系統(tǒng)的啟動過程3.2.1 使用 Bochs 做為遠程目標機3.2.2 調(diào)試 BIOS 程序啟動調(diào)試后,Bochs 在 CPU 要執(zhí)行的第一條指令(即 BIOS 的第一條指令)處中斷。 此時,Display窗口沒有顯示任何內(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 是此條指令的十六進制字節(jié)碼,可以看出此條指令有 5 個字節(jié)。接下來可以按照下面的步驟,查看 CPU 在沒有執(zhí)行任何指令之前主要寄存器中的數(shù)據(jù),以及內(nèi)存中的數(shù)據(jù):1. 在 Console 窗口中輸入調(diào)試命令 sreg 后按回車,顯示當前 CPU 中各個段寄存器的值,如圖 10-2

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

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

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

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

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

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

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

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

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

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

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

19、上的位置不能改變。/ 2、在啟動調(diào)試應用程序之前必須首先刪除/禁用所有的斷點,在斷/ 點中斷 (int 3) 被命中后才能重新添加/啟用斷點,否則啟動/ 調(diào)試會失敗。/STARTUPINFO StartupInfo;PROCESS_INFORMATION ProcInfoOne5;ULONG ulExitCode;/ 子進程退出碼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");/ 使子進程和父進程使用相同的標準句柄。/StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE);StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE);StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE);/ 為一個應用程序同時創(chuàng)建兩個子進程。/int i=0;for(;i<5;i+)if (CreateProcess("A:Hello.exe&

21、quot;, NULL, 0, &StartupInfo, &ProcInfoOnei) / 創(chuàng)建子進程成功,等待子進程運行結(jié)束。/WaitForSingleObject(ProcInfoOnei.ProcessHandle, INFINITE);/WaitForSingleObject(ProcInfoTwo.ProcessHandle, INFINITE);/ 得到并輸出子進程的退出碼。/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;實驗四:線程的狀態(tài)和轉(zhuǎn)換 一、實驗目的:1、調(diào)試線程在各種狀態(tài)間的轉(zhuǎn)換過程,熟悉線程的狀態(tài)和轉(zhuǎn)換。 2、通過為線程增加掛起狀態(tài),加深對線程狀態(tài)的理解。 二、實驗內(nèi)容及步驟:1、準備實驗:新建一個EOS Kernel項目。 2、調(diào)試線程狀態(tài)的轉(zhuǎn)換過程:對第一步的項目啟動調(diào)試,待EOS啟動完畢,在EOS控制臺中輸入命

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

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論