




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、課程設(shè)計(jì)(綜合實(shí)驗(yàn))報告( 2015 - 2016 年度第 1 學(xué)期)名 稱: 操作系統(tǒng)綜合實(shí)驗(yàn) 題 目: oslab綜合實(shí)驗(yàn) 院 系: 計(jì)算機(jī)系 班 級: 學(xué) 號: 學(xué)生姓名: 指導(dǎo)教師: 設(shè)計(jì)周數(shù): 分散進(jìn)行 成 績: 日期: 2015 年 10 月 29 日 實(shí)驗(yàn)1 實(shí)驗(yàn)環(huán)境的使用 一、 綜合實(shí)驗(yàn)的目的與要求l 熟悉操作系統(tǒng)集成實(shí)驗(yàn)環(huán)境OS Lab 的基本使用方法。 l 練習(xí)編譯、調(diào)試EOS 操作系統(tǒng)內(nèi)核以及EOS 應(yīng)用程序。 二、實(shí)驗(yàn)正文1.啟動 OS Lab 2.1 執(zhí)行項(xiàng)目 Windows 控制臺窗口內(nèi)容顯示2.2 調(diào)試項(xiàng)目 2.2.1 使用斷點(diǎn)中斷執(zhí)行 2.2.2 單步調(diào)試 2.
2、2.2 .3單步調(diào)試 結(jié)果顯示:練習(xí)使用“逐語句”功能和“跳出”功能 2.2.3 查看變量的值 快速監(jiān)視 添加監(jiān)視2.2.4 調(diào)用堆棧調(diào)用堆棧顯示內(nèi)容進(jìn)入Func 函數(shù)雙擊 main 函數(shù)所在的行表示此函數(shù)是當(dāng)前調(diào)用堆棧中的活動函數(shù)。 3 新建EOS 內(nèi)核項(xiàng)目4 EOS 應(yīng)用程序項(xiàng)目的生成和調(diào)試4.1 新建EOS 應(yīng)用程序項(xiàng)目 4.2 調(diào)試項(xiàng)目 添加斷點(diǎn)后單步調(diào)試結(jié)果顯示 4.3 查看軟盤鏡像文件中的內(nèi)容 4.4修改EOS 應(yīng)用程序項(xiàng)目名稱 5 退出OS Lab6 保存EOS 內(nèi)核項(xiàng)目 三、綜合實(shí)驗(yàn)總結(jié)或結(jié)論思考與練習(xí):1. 在哪些情況下應(yīng)該使用“逐過程”調(diào)試,在哪些情況下應(yīng)該使用“逐語句”調(diào)
3、試。答:逐語句為每執(zhí)行一行語句,如果碰到函數(shù)調(diào)用它就會進(jìn)入到函數(shù)里面。而逐過程碰到函數(shù)時不進(jìn)入函數(shù),把函數(shù)調(diào)用當(dāng)成一條語句去執(zhí)行。2. 生成EOS SDK 文件夾的目的和作用。明白文件夾的組織結(jié)構(gòu)和各個文件的來源和作用。查看EOS 應(yīng)用程序包含了SDK 文件夾中的哪些頭文件,是如何包含的?(1)EOS SDK為應(yīng)用程序調(diào)用系統(tǒng)API提供服務(wù),可作為用戶編程中使用的工具包集合。(2)其主要包括INC頭文件LIB文件夾、導(dǎo)入庫文件和BIN文件夾、動態(tài)鏈接庫、可執(zhí)行程序、二進(jìn)制文件。(3)包含的頭文件有:eos.h負(fù)責(zé)導(dǎo)出API函數(shù),eosdef.h聲明負(fù)責(zé)導(dǎo)出函數(shù)類型的定義,error.
4、h負(fù)責(zé)導(dǎo)出錯誤碼。 (4)EOS應(yīng)用程序在項(xiàng)目的頭文件中只是包含了eos.h文件,在eos.h文件中又包含了eosdef.h和error.h文件。實(shí)驗(yàn) 2 操作系統(tǒng)的啟動一、 綜合實(shí)驗(yàn)的目的與要求跟蹤調(diào)試 EOS 在 PC 機(jī)上從加電復(fù)位到成功啟動全過程,了解操作系統(tǒng)的啟動過程。查看 EOS 啟動后的狀態(tài)和行為,理解操作系統(tǒng)啟動后的工作方式。二、實(shí)驗(yàn)正文1. 準(zhǔn)備實(shí)驗(yàn)新建一個 EOS Kernel 項(xiàng)目。打開boot.asm 和loader.asm 兩個匯編文件。生成項(xiàng)目。找到loader.bin 文件,記錄下此文件的大小 1566 字節(jié)。2 調(diào)試 EOS 操作系統(tǒng)的啟動過程2.1 使用 Bo
5、chs 做為遠(yuǎn)程目標(biāo)機(jī)找到“遠(yuǎn)程目標(biāo)機(jī)”屬性,將此屬性值修改為“BochsDebug”2.2 調(diào)試 BIOS 程序2.2.1在 Console 窗口中輸入調(diào)試命令 sreg 后按回車,其中 CS 寄存器信息行中的“ s=0xf000”表示 CS 寄存器的值為 0xf000。2.2.2 輸入調(diào)試命令 r 后按回車,顯示當(dāng)前 CPU 中各個通用寄存器的值。其中“ rip:0x00000000:0000fff0”表示 IP 寄存器的值為 0xfff0。2.2.3輸入調(diào)試命令 xp /1024b 0x0000,查看開始的 1024 個字節(jié)的物理內(nèi)存。在 Console 中輸出的這1K 物理內(nèi)存的值都為
6、 0,說明 BIOS 中斷向量表還沒有被加載到此處。2.2.4輸入調(diào)試命令 xp /512b 0x7c00,查看軟盤引導(dǎo)扇區(qū)應(yīng)該被加載到的內(nèi)存位置。輸出的內(nèi)存值都為 0,說明軟盤引導(dǎo)扇區(qū)還沒有被加載到此處??梢则?yàn)證 BIOS 第一條指令所在邏輯地址中的段地址和 CS 寄存器值是一致的,偏移地址和 IP 寄存器值是一致的。由于內(nèi)存還沒有被使用,所以其中的值都為 0。2.3 調(diào)試軟盤引導(dǎo)扇區(qū)程序2.3.1. 輸入調(diào)試命令 vb 0x0000:0x7c00,添加斷點(diǎn)2.3.2. 輸入調(diào)試命令 c 繼續(xù)執(zhí)行2.3.3. 輸入調(diào)試命令 sreg 驗(yàn)證 CS 寄存器( 0x0000)的值。2.3.4. 輸
7、入調(diào)試命令 r 驗(yàn)證 IP 寄存器( 0x7c00)的值。2.3.5輸入調(diào)試命令 xp /1024b 0x0000 驗(yàn)證此時 BIOS 中斷向量表已經(jīng)被載入。2.3.6.輸入調(diào)試命令 xp /512b 0x7c00 顯示軟盤引導(dǎo)扇區(qū)程序的所有字節(jié)碼。2.3.7輸入調(diào)試命令 xp /512b 0x0600 驗(yàn)證圖 3-2 中第一個用戶可用區(qū)域是空白的。2.3.8輸入調(diào)試命令 xp /512b 0x7e00 驗(yàn)證圖 3-2 中第二個用戶可用區(qū)域是空白的。2.3.9 自己設(shè)計(jì)兩個查看內(nèi)存的調(diào)試命令,驗(yàn)證這兩個用戶可用區(qū)域的高地址端是空白的。(1) xp /512b 0x7f00 (2) xp /51
8、2b0x0700 2.3.10輸入調(diào)試命令 xp /512b 0xa0000 驗(yàn)證圖 3-2 中上位內(nèi)存已經(jīng)被系統(tǒng)占用。2.3.11自己設(shè)計(jì)一個查看內(nèi)存的調(diào)試命令,驗(yàn)證上位內(nèi)存的高地址端已經(jīng)被系統(tǒng)占用。xp /512b 0xb0000 2.3.12 輸入調(diào)試命令 xp /8b 0x1000 查看內(nèi)存 0x1000 處的數(shù)據(jù),驗(yàn)證此塊內(nèi)存的前三個字節(jié)和 loader.lst文件中的第一條指令的字節(jié)碼是相同的。2.3.13根據(jù)之前記錄的 loader.bin 文件的大小,自己設(shè)計(jì)一個查看內(nèi)存的調(diào)試命令loader.bin文件的大小為1566個字節(jié),轉(zhuǎn)換為十六進(jìn)制的61E,所以程序最后八個字節(jié)在物理
9、內(nèi)存的0x1616到0x161D的位置,所以調(diào)試命令為xp/8b 0x1616。經(jīng)檢驗(yàn), loader.bin程序結(jié)束位置字節(jié)碼與反匯編命令相同。注:查看loader.bin文件的大小應(yīng)在“屬性”對話框中看。2.4 調(diào)試加載程序使用查看虛擬內(nèi)存的調(diào)試命令 x /1wx 0x80001117 查看內(nèi)存中保存的 32 位函數(shù)入口地址,在Console 窗口中會輸出:0x0000000080001117 <bogus+ 0>: 0x800*2.5 調(diào)試內(nèi)核在“監(jiān)視”窗口中可以看到KiSystemStartup 函數(shù)地址為void (PVOID) 0x800* KiSystemStartu
10、p>2.6 EOS 啟動后的狀態(tài)和行為三、綜合實(shí)驗(yàn)總結(jié)或結(jié)論1. 為什么 EOS 操作系統(tǒng)從軟盤啟動時要使用 boot.bin 和 loader.bin 兩個程序?使用一個可以嗎? 它們各自的主要功能是什么? 如果將 loader.bin 的功能移動到 boot.bin 文件中,則 boot.bin 文件的大小是否仍然能保持小于 512 字節(jié)?答:在IDE環(huán)境啟動執(zhí)行EOS操作系統(tǒng)時,會將boot.bin,loader.bin,kernal.dll三個二進(jìn)制寫入軟件鏡像文件中,然后讓虛擬機(jī)來執(zhí)行軟盤中的EOS操作系統(tǒng),使用其中一個是不能運(yùn)行的。 2.為什么軟盤引導(dǎo)扇區(qū)程序選擇將 load
11、er.bin加載到第一個可用區(qū)域的 0x1000 處呢?這樣做有什么好處?這樣做會對 loader.bin 文件的大小有哪些限制。答:用戶只用兩個可用區(qū)域,加載位置非此即彼。第一個可用用戶區(qū)是低地址區(qū),且空間大小比較小,適合容納小文件,所以我們選擇將占用空loder.bin加載到第一用戶區(qū)。優(yōu)點(diǎn):低地址開始,便于搜索查找小文件占用小空間,節(jié)約資源。限制:loder.bin文件必須小于 1c00k。實(shí)驗(yàn) 3 進(jìn)程的創(chuàng)建一、 綜合實(shí)驗(yàn)的目的與要求練習(xí)使用 EOS API 函數(shù) CreateProcess 創(chuàng)建一個進(jìn)程,掌握創(chuàng)建進(jìn)程的方法,理解進(jìn)程和程序的區(qū)別。調(diào)試跟蹤 CreateProcess
12、函數(shù)的執(zhí)行過程,了解進(jìn)程的創(chuàng)建過程,理解進(jìn)程是資源分配的單位。二、實(shí)驗(yàn)正文1 準(zhǔn)備實(shí)驗(yàn)2 練習(xí)使用控制臺命令創(chuàng)建 EOS 應(yīng)用程序的進(jìn)程 Hello.exe 應(yīng)用程序輸出結(jié)果3 練習(xí)通過編程的方式讓應(yīng)用程序創(chuàng)建另一個應(yīng)用程序的進(jìn)程可知子進(jìn)程結(jié)束后,父進(jìn)程繼續(xù)執(zhí)行4 調(diào)試 CreateProcess 函數(shù)在“反匯編”窗口的左側(cè)顯示的虛擬地址中看到所有指令的虛擬地址都大于 0x80000000,說明內(nèi)核( kernel.dll) 處于高 2G 的虛擬地址空間中。查看 main 函數(shù)的指令所在的虛擬地址都是小于 0x80000000,說明應(yīng)用程序( eosapp.exe)處于低 2G 的虛擬地址空間
13、中。5 調(diào)試 PsCreateProcess 函數(shù)進(jìn)程執(zhí)行的結(jié)果:繪制一幅進(jìn)程創(chuàng)建過程的流程圖。6 練習(xí)通過編程的方式創(chuàng)建應(yīng)用程序的多個進(jìn)程多個進(jìn)程并發(fā)執(zhí)行的結(jié)果:有結(jié)果顯示可知有兩個進(jìn)程在執(zhí)行三、綜合實(shí)驗(yàn)總結(jié)或結(jié)論1. 在源代碼文件 NewTwoProc.c 提供的源代碼基礎(chǔ)上進(jìn)行修改,要求使用 hello.exe 同時創(chuàng)建 10 個進(jìn)程。修改結(jié)果如下圖所示: 部分修改代碼如下圖所示:(“”部分為相似的4-9進(jìn)程代碼) if (CreateProcess("A:Hello.exe", NULL, 0, &StartupInfo, &ProcInfoOne)
14、&& CreateProcess("A:Hello.exe", NULL, 0, &StartupInfo, &ProcInfoTwo)&& CreateProcess("A:Hello.exe", NULL, 0, &StartupInfo, &ProcInfo3) && CreateProcess("A:Hello.exe", NULL, 0, &StartupInfo, &ProcInfo10) WaitForSingleObject
15、(ProcInfoOne.ProcessHandle, INFINITE);WaitForSingleObject(ProcInfoTwo.ProcessHandle, INFINITE);WaitForSingleObject(ProcInfo3.ProcessHandle, INFINITE);WaitForSingleObject(ProcInfo10.ProcessHandle, INFINITE);GetExitCodeProcess(ProcInfoOne.ProcessHandle, &ulExitCode); GetExitCodeProcess(ProcInfo3.P
16、rocessHandle, &ulExitCode);printf("nThe process 3 exit with %d.n", ulExitCode); GetExitCodeProcess(ProcInfo10.ProcessHandle, &ulExitCode);printf("nThe process 10 exit with %d.n", ulExitCode);CloseHandle(ProcInfoOne.ProcessHandle); CloseHandle(ProcInfoTwo.ThreadHandle);Clo
17、seHandle(ProcInfo3.ProcessHandle);CloseHandle(ProcInfo3.ThreadHandle); CloseHandle(ProcInfo10.ProcessHandle);CloseHandle(ProcInfo10.ThreadHandle);2. 在 PsCreateProcess 函 數(shù) 中 調(diào) 用 了 PspCreateProcessEnvironment 函 數(shù) 后 又 先 后 調(diào) 用 了PspLoadProcessImage 和 PspCreateThread 函數(shù), 學(xué)習(xí)這些函數(shù)的主要功能。能夠交換這些函數(shù)被調(diào)用的順序嗎?答:PspC
18、reateProcessEnvironment 創(chuàng)建了進(jìn)程控制塊,地址空間和分配了句柄表,PspLoadProcessImage將進(jìn)程的可執(zhí)行映象加載的到了進(jìn)程的地址空間中,PspCreateThread 創(chuàng)建了進(jìn)程的主線程。這三個函數(shù)知道自己從哪里開始執(zhí)行,執(zhí)行哪些指令,因此不能交換它們的順序。 實(shí)驗(yàn) 4 線程的狀態(tài)和轉(zhuǎn)換一、 綜合實(shí)驗(yàn)的目的與要求調(diào)試線程在各種狀態(tài)間的轉(zhuǎn)換過程,熟悉線程的狀態(tài)和轉(zhuǎn)換。通過為線程增加掛起狀態(tài),加深對線程狀態(tài)的理解。二、實(shí)驗(yàn)正文1 準(zhǔn)備實(shí)驗(yàn)2 調(diào)試線程狀態(tài)的轉(zhuǎn)換過程2.1 線程由阻塞狀態(tài)進(jìn)入就緒狀態(tài)“ *Thread”State 域的值為 3( Wai
19、ting), 雙向鏈表項(xiàng) StateListEntry的 Next 和 Prev 指針的值都不為 0, 說明這個線程還處于阻塞狀態(tài),并在某個同步對象的等待隊(duì)列中; StartAddr 域的值為IopConsoleDispatchThread,說明這個線程就是控制臺派遣線程。在“調(diào)用堆?!贝翱谥须p擊 PspUnwaitThread 函數(shù)對應(yīng)的堆棧項(xiàng), 按F10調(diào)試,此時 State 域的值為 0( Zero), 雙向鏈表項(xiàng) StateListEntry 的 Next 和 Prev 指針的值都為 0, 說明這個線程已經(jīng)處于游離狀態(tài)。按 F5 繼續(xù)執(zhí)行, 在 PspReadyThread 函數(shù)中的斷
20、點(diǎn)處中斷。按 F10 單步調(diào)試直到此函數(shù)的最后。此時 State 域的值為 1( Ready),雙向鏈表項(xiàng) StateListEntry 的 Next 和 Prev 指針的值都不為 0,說明這個線程已經(jīng)處于就緒狀態(tài),并已經(jīng)被放入優(yōu)先級為 24 的就緒隊(duì)列中。 2.2 線程由運(yùn)行狀態(tài)進(jìn)入就緒狀態(tài)2.3 線程由就緒狀態(tài)進(jìn)入運(yùn)行狀態(tài)2.4 線程由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài)3 為線程增加掛起狀態(tài)三、綜合實(shí)驗(yàn)總結(jié)或結(jié)論1. 思考一下,在本實(shí)驗(yàn)中,當(dāng) loop 線程處于運(yùn)行狀態(tài)時, EOS 中還有哪些線程,它們分別處于什么狀態(tài)。可以使用控制臺命令 pt 查看線程的狀態(tài)。答:有一個優(yōu)先級為0的空閑線程處于就緒狀態(tài)
21、,8個優(yōu)先級為24的控制臺線程處于阻塞狀態(tài),1個優(yōu)先級的24的控制臺派遣線程處于阻塞狀態(tài) 。2. 當(dāng) loop 線程在控制臺 1 中執(zhí)行,并且在控制臺 2 中執(zhí)行 suspend 命令時,為什么控制臺 1 中的 loop線程處于就緒狀態(tài)而不是運(yùn)行狀態(tài)?答:在控制臺 2 中執(zhí)行 suspend 命令時,優(yōu)先級為24的控制臺2線程搶占處理器,即控制臺2線程處于運(yùn)行狀態(tài),因此此時loop處于就緒狀態(tài)。3. 總結(jié)一下在圖 5-3 中顯示的轉(zhuǎn)換過程,哪些需要使用線程控制塊中的上下文,哪些不需要使用, 并說明原因。答:就緒運(yùn)行,運(yùn)行就緒,運(yùn)行阻塞需要使用TCB因?yàn)檫@些過程有線程調(diào)進(jìn)或調(diào)出處理機(jī)的過程,新建
22、就緒,阻塞就緒不需要使用TCB上下文,因?yàn)闆]有占用處理機(jī)資源。 4. 請讀者找出這些轉(zhuǎn)換過程的原語操作(關(guān)中斷和開中斷) 是在哪些代碼中完成的。答:IntState=KeEnableInterrupts(FALSE);/關(guān)中斷 KeEnableInterrupts(IntState);/開中斷實(shí)驗(yàn) 5 進(jìn)程的同步1、 綜合實(shí)驗(yàn)的目的與要求使用 EOS 的信號量, 編程解決生產(chǎn)者消費(fèi)者問題,理解進(jìn)程同步的意義。調(diào)試跟蹤 EOS 信號量的工作過程,理解進(jìn)程同步的原理。修改 EOS 的信號量算法,使之支持等待超時喚醒功能,加深理解進(jìn)程同步的原理。2、 實(shí)驗(yàn)正文1 準(zhǔn)備實(shí)驗(yàn)2 使用 EOS 的信號量解
23、決生產(chǎn)者消費(fèi)者問題3 調(diào)試 EOS 信號量的工作過程3.1 創(chuàng)建信號量PsInitializeSemaphore 函數(shù)中用來初始化信號量結(jié)構(gòu)體成員的值,應(yīng)該和傳入 CreateSemaphore 函數(shù)的參數(shù)值是一致的。單步調(diào)試 PsInitializeSemaphore 函數(shù)執(zhí)行的過程,函數(shù)的調(diào)用層次:先再3.2 等待、釋放信號量3.2.1 等待信號量(不阻塞)完成 PsWaitForSemaphore 函數(shù)中所有操作。 Empty的計(jì)數(shù)減少了 1(由 10 變?yōu)榱?9)3.2.2 釋放信號量(不喚醒)完成 PsReleaseSemaphore 函數(shù)中的所有操作。 Full計(jì)數(shù)增加了 1(由
24、0 變?yōu)榱?1)。3.2.3 等待信號量(阻塞)在“調(diào)用堆?!贝翱谥须p擊 Producer 函數(shù)所在的堆棧幀,綠色箭頭指向等待 Empty 信號量的代碼行,查看 Producer 函數(shù)中變量 i 的值為 14,表示生產(chǎn)者線程正在嘗試生產(chǎn) 14 號產(chǎn)品。在“調(diào)用堆?!贝翱谥须p擊 PsWaitForSemaphore 函數(shù)的堆棧幀,查看 Empty 信號量計(jì)數(shù)( Semaphore->Count)的值為- 釋放信號量(喚醒)Consumer 函數(shù)中變量 i 的值為 4,說明已經(jīng)消費(fèi)了 4 號產(chǎn)品。查看 PsReleaseSemaphore 函數(shù)中 Empty 信號量計(jì)數(shù)( Se
25、maphore->Count)的值為-1,和生產(chǎn)者線程被阻塞時的值是一致的。單步調(diào)試 PsReleaseSemaphore 函數(shù),Empty計(jì)數(shù)的值已經(jīng)由-1增加為了04 修改 EOS 的信號量算法(1)修改 PsWaitForSemaphore 函數(shù):if (Semaphore->Count > 0) Semaphore->Count-; flag=STATUS_SUCCESS; else flag=PspWait(&Semaphore->WaitListHead,
26、Milliseconds); KeEnableInterrupts(IntState); return flag; (2)修改PsReleaseSemaphore函數(shù):while (!ListIsEmpty(&Semaphore->WaitListHead)&&(ReleaseCount)PspWakeThread(&Semaphore->WaitListHead, STATUS_SUCCESS); PspThreadSchedule(); ReleaseCount-;
27、; Semaphore->Count=Semaphore->Count+ReleaseCount; Status = STATUS_SUCCESS; KeEnableInterrupts(IntState); return Status;測試結(jié)果:根據(jù)文檔中的測試方法可看到結(jié)果中有兩個消費(fèi)者三、綜合實(shí)驗(yàn)總結(jié)或結(jié)論1. 思考在 ps/semaphore.c 文件內(nèi)的 PsWaitForSemaphore 和 PsReleaseSemaphore 函數(shù)中,為什么要使用原子操作?答:EOS內(nèi)核中維護(hù)了大量內(nèi)
28、核數(shù)據(jù),正是這些數(shù)據(jù)描述了EOS操作系統(tǒng)的狀態(tài)如果有一組相互關(guān)聯(lián)的內(nèi)核數(shù)據(jù)共同描述了這個操作系統(tǒng)的某個狀態(tài),那么在修改這樣一組內(nèi)核數(shù)據(jù)時就必須保證一致性。這就要求修改這部分?jǐn)?shù)據(jù)的代碼在執(zhí)行過程中不能被打斷,這種操作叫做“原語操作”。 2. 根據(jù)本實(shí)驗(yàn) 3.3.2 節(jié)中設(shè)置斷點(diǎn)和調(diào)試的方法,自己設(shè)計(jì)一個類似的調(diào)試方案來驗(yàn)證消費(fèi)者線程在消費(fèi) 24 號產(chǎn)品時會被阻塞,直到生產(chǎn)者線程生產(chǎn)了 24 號產(chǎn)品后,消費(fèi)者線程才被喚醒并繼續(xù)執(zhí)行的過程。答: 生產(chǎn)到23號產(chǎn)品后,進(jìn)程阻塞。實(shí)驗(yàn) 6 時間片輪轉(zhuǎn)調(diào)度1、 綜合實(shí)驗(yàn)的目的與要求調(diào)試 EOS 的線程調(diào)度程序,熟悉基于優(yōu)先級的搶先式調(diào)度。為 EOS 添加時
29、間片輪轉(zhuǎn)調(diào)度,了解其它常用的調(diào)度算法。二、實(shí)驗(yàn)正文1 準(zhǔn)備實(shí)驗(yàn)2 閱讀控制臺命令“rr”相關(guān)的源代碼3 調(diào)試線程調(diào)度程序3.1 調(diào)試當(dāng)前線程不被搶先的情況查看 ThreadFunction 函數(shù)中變量 pThreadParameter->Y 的值應(yīng)該為 0,說明正在調(diào)試的是第 0個新建的線程。按2次 F5 的循環(huán)輸出的內(nèi)容: 以二進(jìn)制格式查看就緒位圖的值BitScanReverse 函數(shù)會從就緒位圖中掃描最高優(yōu)先級,并保存在變量HighestPriority 中。查看變量 HighestPriority 的值為 8。3.2 調(diào)試當(dāng)前線程被搶先的情況激活虛擬機(jī)窗口,可以看到第 0 個新建的
30、線程正在執(zhí)行。在“監(jiān)視”窗口中查看就緒位圖的值為 1000000000000000100000001,說明此時在優(yōu)先級為 24的 就 緒 隊(duì) 列 中 存 在 就 緒 線 程 。 在 “ 監(jiān) 視 ” 窗 口 中 添 加 表 達(dá) 式“ ListGetCount(&PspReadyListHeads24) ”,其值為 1,說明優(yōu)先級為 24 的就緒隊(duì)列中只有一個就緒線程。掃描就緒位圖后獲得的最高優(yōu)先級的值 HighestPriority 也就應(yīng)該是 24。顯示0x18=24繼續(xù)調(diào)試優(yōu)先級24 的線程已經(jīng)進(jìn)入了“運(yùn)行”狀態(tài)。4 為 EOS 添加時間片輪轉(zhuǎn)調(diào)度修改部分代碼:VOID P
31、spRoundRobin( VOID ) if(NULL!=PspCurrentThread&&Running=PspCurrentThread->State) PspCurrentThread->RemainderTicks-; if (0 = PspCurrentThread->RemainderTicks)
32、 PspCurrentThread->RemainderTicks = TICKS_OF_TIME_SLICE; if(BIT_TEST(PspReadyBitmap, PspCurrentThread->Priority) PspReadyThread(PspCurrentThread); 測試:能看到 20 個線程輪流執(zhí)行的效果5 修改線程時間片的大小執(zhí)行的效果: 參數(shù)=20
33、 參數(shù)=100 時間片過大,算法便退化成為先進(jìn)先出算法。三、綜合實(shí)驗(yàn)總結(jié)或結(jié)論1. 結(jié)合線程調(diào)度執(zhí)行的時機(jī),說明在 ThreadFunction 函數(shù)中,為什么可以使用“關(guān)中斷”和“開中斷”方法來保護(hù)控制臺這種臨界資源。結(jié)合線程調(diào)度的對象說明這樣做的原因。答:EOS會設(shè)置CPU停止響應(yīng)外部設(shè)備產(chǎn)生的硬中斷,也就不會在由硬中斷觸發(fā)線程調(diào)度。開中斷和關(guān)中斷使處理機(jī)在這段時間屏蔽掉了外界所有中斷,使他線程無法占用資源。使用開中斷和關(guān)中斷進(jìn)程同步不會改變線程狀態(tài),可以保證那些沒有獲得處理器的資源都在就緒隊(duì)列中。2.為什么不需要將被中斷線程轉(zhuǎn)入“就緒”狀態(tài)?如果此時將被中斷線程轉(zhuǎn)入了“就緒”狀態(tài)又會怎么
34、樣?可以結(jié)合 PspRoundRobin 函數(shù)和 PspSelectNextThread 函數(shù)的流程進(jìn)行思考,并使用搶先和不搶先兩種情況進(jìn)行說明。答:(1)因?yàn)槠渌麅?yōu)先隊(duì)列的線程等待時間不能過長。(2)若將中斷線程轉(zhuǎn)入就緒隊(duì)列,只有當(dāng)此線程執(zhí)行完畢之后,其他隊(duì)列的線程才有機(jī)會進(jìn)入就緒隊(duì)列,尤其是當(dāng)其他就緒隊(duì)列中的線程關(guān)于人機(jī)交互的時候,會嚴(yán)重影響用戶體驗(yàn)。3. EOS 內(nèi)核時間片大小取 60ms,在線程比較多時,就可以觀察出線程輪流執(zhí)行的情況,但是在 Windows、Linux 等操作系統(tǒng)啟動后,正常情況下都有上百個線程在并發(fā)執(zhí)行,為什么覺察不到它們被輪流執(zhí)行,并且每個程序都運(yùn)行的很順利呢?答
35、:因?yàn)闀r間片選取合適,線程輪流運(yùn)行,體現(xiàn)了其虛擬性。實(shí)驗(yàn) 7 物理存儲器與進(jìn)程邏輯地址空間的管理1、 綜合實(shí)驗(yàn)的目的與要求通過查看物理存儲器的使用情況,并練習(xí)分配和回收物理內(nèi)存,從而掌握物理存儲器的管理方法。通過查看進(jìn)程邏輯地址空間的使用情況,并練習(xí)分配和回收虛擬內(nèi)存, 從而掌握進(jìn)程邏輯地址空間的管理方法。2、 實(shí)驗(yàn)正文1 準(zhǔn)備實(shí)驗(yàn)2 閱讀控制臺命令“pm”相關(guān)的源代碼,并查看其執(zhí)行的結(jié)果3 分配物理頁和釋放物理頁按 F10 單步調(diào)試 MiAllocateAnyPages 函數(shù)的執(zhí)行過程,結(jié)果如圖可知其空閑頁為7126,零頁鏈表為0,已用表為1050.按 F10 單步調(diào)試 MiFreePage
36、s 函數(shù)的執(zhí)行過程,結(jié)果如圖可知其再分配1頁后,空閑頁為7125,零頁鏈表為0,已用表為1051,即用空閑頁分配,沒用零頁鏈表分配。4 閱讀控制臺命令“vm”相關(guān)的源代碼,并查看其執(zhí)行的結(jié)果輸入命令“ A: LoopApp.exe”后按回車。 此時就使用 EOS 應(yīng)用程序文件 LoopApp.exe 創(chuàng)建了一個應(yīng)用程序進(jìn)程,由于此進(jìn)程執(zhí)行了一個死循環(huán),所以此進(jìn)程不會結(jié)束執(zhí)行,除非關(guān)閉虛擬機(jī)。5 在系統(tǒng)進(jìn)程中分配虛擬頁和釋放虛擬頁調(diào)試釋放虛擬頁的過程:BaseAddress 由初始化的變成了和 RegionSize由初始化的變成了。在調(diào)用 MmAllocateVirtualMemory 函數(shù)時將
37、 RegionSize 參數(shù)的值設(shè)置為PAGE_SIZE*2+1,觀察“輸出”窗口中轉(zhuǎn)儲的信息,輸出文本略。3、 綜合實(shí)驗(yàn)總結(jié)或結(jié)論1. 在本實(shí)驗(yàn) 3.3 中,如果分配了物理頁后,沒有回收,會對 EOS 操作系統(tǒng)造成什么樣的影響? 目前 EOS操作系統(tǒng)內(nèi)核函數(shù) MiAllocateAnyPages 能處理所有物理頁被分配完畢的情況嗎?答:(1)會造成自由頁鏈表和零鏈表不斷減少,甚至為空。所有物理頁都分配完畢的現(xiàn)象。(2)不能。 2. 嘗試從性能的角度分析內(nèi)核函數(shù) MiAllocateAnyPages 和 MiAllocateZeroedPages。 嘗試從安全性的角度分析分配零頁的必要性。答:
38、 MiAllocateAnyPages 分配物理頁。首先從空閑頁鏈表中分配,如果分配空閑鏈表不足則再從零頁鏈表分配。MiAllocateZeroedPages首先從零頁鏈表中分配,如果零頁不足則從空閑鏈表分配。 3. 觀察本實(shí)驗(yàn) 3.4 中使用“ vm” 命令輸出的系統(tǒng)進(jìn)程的虛擬地址描述符,可以看到在 2 號描述符和 3 號描述符之間有兩個虛擬頁的空隙,嘗試結(jié)合虛擬頁的分配和釋放說明產(chǎn)生這個空隙的原因。答:產(chǎn)生空隙是由于虛擬頁被釋放而造成的。在啟動時會有一個初始化線程在初始化完畢之后就退出了,線程的堆棧所占用的虛擬頁也就被釋放了。 4. 在本實(shí)驗(yàn) 3.5 中,調(diào)用 MmAllocateVirt
39、ualMemory 函數(shù)分配虛擬頁時只使用了 MEM_RESERVE 標(biāo)志,沒有使用 MEM_COMMIT 標(biāo)志,嘗試說明這兩個標(biāo)志的區(qū)別。答:使用MEM_RESERVE標(biāo)志分配虛擬頁時,沒有為其映射實(shí)際的物理頁。使用MEM_COMMIT標(biāo)志分配虛擬頁時,會為其映射實(shí)際的物理頁。實(shí)驗(yàn) 8 分頁存儲器管理1、 綜合實(shí)驗(yàn)的目的與要求學(xué)習(xí) i386 處理器的二級頁表硬件機(jī)制,理解分頁存儲器管理原理。查看 EOS 應(yīng)用程序進(jìn)程和系統(tǒng)進(jìn)程二級頁表映射信息,理解頁目錄和頁表的管理方式。編程修改頁目錄和頁表的映射關(guān)系,理解分頁地址變換原理。2、 實(shí)驗(yàn)正文1 準(zhǔn)備實(shí)驗(yàn)2 查看 EOS 應(yīng)用程序進(jìn)程的頁目錄和頁
40、表驗(yàn)證結(jié)果與指導(dǎo)教程的二級頁表映射信息結(jié)果相同。(輸出文本略)3 查看應(yīng)用程序進(jìn)程和系統(tǒng)進(jìn)程并發(fā)時的頁目錄和頁表 (輸出文本略)4 查看應(yīng)用程序進(jìn)程并發(fā)時的頁目錄和頁表 (輸出文本略)5 在二級頁表中映射新申請的物理頁 (輸出文本略)3、 綜合實(shí)驗(yàn)總結(jié)或結(jié)論1. 觀察之前輸出的頁目錄和頁表的映射關(guān)系,可以看到頁目錄的第 0x300 個 PDE 映射的頁框號就是頁目錄本身,說明頁目錄被復(fù)用為了頁表。而恰恰就是這種映射關(guān)系決定了 4K 的頁目錄映射在虛擬地址空間的 0xC0300000-0xC0300FFF,4M 的頁表映射在 0xC0000000-0xC03FFFFF?,F(xiàn)在,假設(shè)修改了頁目錄,使
41、其第 0x100 個 PDE 映射的頁框號是頁目錄本身,此時頁目錄和頁表會映射在 4G 虛擬地址空間的什么位置呢?答:頁目錄占用1個物理頁,頁框號是0x409.頁表占用5個物理頁,頁框號是0x41D,0x401,0x403,0x404,0x402.2. 思考頁式存儲管理機(jī)制的優(yōu)缺點(diǎn)。答:優(yōu)點(diǎn):虛存量大,適合多道程序運(yùn)行,動態(tài)頁式管理提供了內(nèi)外存統(tǒng)一管理的虛存實(shí)現(xiàn)方式。內(nèi)存利用率高,不要求作業(yè)連續(xù)存放,有效地解決了內(nèi)存碎片問題。缺點(diǎn):要進(jìn)行頁面中斷缺頁中斷等處理,系統(tǒng)開銷較大,有可能產(chǎn)生”抖動”現(xiàn)象。地址變換機(jī)構(gòu)復(fù)雜,一般采用硬件實(shí)現(xiàn),添加了機(jī)器成本。 實(shí)驗(yàn) 10 磁盤調(diào)度算法1、 綜合實(shí)驗(yàn)的目
42、的與要求通過學(xué)習(xí) EOS 實(shí)現(xiàn)磁盤調(diào)度算法的機(jī)制,掌握磁盤調(diào)度算法執(zhí)行的條件和時機(jī)。觀察 EOS 實(shí)現(xiàn)的 FCFS、 SSTF 和 SCAN 磁盤調(diào)度算法,了解常用的磁盤調(diào)度算法。編寫 CSCAN 和 N-Step-SCAN 磁盤調(diào)度算法,加深對各種掃描算法的理解。2、 實(shí)驗(yàn)正文1 準(zhǔn)備實(shí)驗(yàn)驗(yàn)證先來先服務(wù)( FCFS)磁盤調(diào)度算法:目前磁頭初始停留在磁道 10,其它被阻塞的線程依次訪問磁道 8、21、9、78、0、41、 10、67、12、10。調(diào)試結(jié)果如下:輸出Start Cylinder: 10TID: 31 Cylinder: 8 Offset: 2 -TID: 32 Cylinder:
43、 21 Offset: 13 +TID: 33 Cylinder: 9 Offset: 12 -TID: 34 Cylinder: 78 Offset: 69 +TID: 35 Cylinder: 0 Offset: 78 -TID: 36 Cylinder: 41 Offset: 41 +TID: 37 Cylinder: 10 Offset: 31 -TID: 38 Cylinder: 67 Offset: 57 +TID: 39 Cylinder: 12 Offset: 55 -TID: 40 Cylinder: 10 Offset: 2 -3 驗(yàn)證最短尋道時間優(yōu)先( SSTF)磁盤調(diào)度
44、算法輸出結(jié)果Start Cylinder: 10TID: 37 Cylinder: 10 Offset: 0 =TID: 40 Cylinder: 10 Offset: 0 =TID: 33 Cylinder: 9 Offset: 1 -TID: 31 Cylinder: 8 Offset: 1 -TID: 39 Cylinder: 12 Offset: 4 +TID: 32 Cylinder: 21 Offset: 9 +TID: 36 Cylinder: 41 Offset: 20 +TID: 38 Cylinder: 67 Offset: 26 +TID: 34 Cylinder: 78
45、 Offset: 11 +TID: 35 Cylinder: 0 Offset: 78 -即以10 9 8 12 21 41 67 78 0 的順序?qū)さ? 驗(yàn)證 SSTF 算法造成的線程“饑餓”現(xiàn)象修改函數(shù)中的源代碼,使磁頭初始停留在磁道 10,而讓其它線程依次訪問磁道 78、21、9、8、11、41、10、67、12、10。輸出結(jié)果:Start Cylinder: 10TID: 37 Cylinder: 10 Offset: 0 =TID: 40 Cylinder: 10 Offset: 0 =TID: 33 Cylinder: 9 Offset: 1 -TID: 34 Cylinder:
46、8 Offset: 1 -TID: 35 Cylinder: 11 Offset: 3 +TID: 39 Cylinder: 12 Offset: 1 +TID: 32 Cylinder: 21 Offset: 9 +TID: 36 Cylinder: 41 Offset: 20 +TID: 38 Cylinder: 67 Offset: 26 +TID: 31 Cylinder: 78 Offset: 11 +即以10 9 8 11 12 21 41 67 78的順序?qū)さ揽梢园l(fā)現(xiàn),雖然訪問 78 號磁道的線程的請求第一個被放入請求隊(duì)列,但卻被推遲到最后才被處理,出現(xiàn)了“饑餓”現(xiàn)象。如果不斷有
47、新線程的請求到達(dá)并被優(yōu)先滿足,則訪問 78 號磁道的線程的“饑餓”情況就會更加嚴(yán)重。5 驗(yàn)證掃描( SCAN)磁盤調(diào)度算法輸出結(jié)果:Start Cylinder: 10TID: 37 Cylinder: 10 Offset: 0 =TID: 40 Cylinder: 10 Offset: 0 =TID: 39 Cylinder: 12 Offset: 2 +TID: 32 Cylinder: 21 Offset: 9 +TID: 36 Cylinder: 41 Offset: 20 +TID: 38 Cylinder: 67 Offset: 26 +TID: 34 Cylinder: 78 O
48、ffset: 11 +TID: 33 Cylinder: 9 Offset: 69 -TID: 31 Cylinder: 8 Offset: 1 -TID: 35 Cylinder: 0 Offset: 8 -即以10 12 21 41 67 78 9 8 0的順序?qū)さ? 改寫 SCAN 算法改寫代碼(部分):PREQUEST pNextRequest=NULL,pNextRequest1=NULL,pNextRequest2 = NULL; for (pListEntry = RequestListHead.Next; pListEntry != &RequestListHead;p
49、ListEntry = pListEntry->Next) pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry); Offset = pRequest->Cylinder - CurrentCylinder;if (0 = Offset) pNextRequest = pRequest;goto RETURN; if (Offset > 0) if (Offset < InsideShortestDistance) InsideShortestDistance = Offset; pNextReques
50、t1 = pRequest; if (Offset < 0) if (-Offset < OutsideShortestDistance) OutsideShortestDistance = -Offset;pNextRequest2 = pRequest; if(ScanInside)if(pNextRequest1)return pNextRequest1; else ScanInside=!ScanInside;return pNextRequest2; elseif(pNextRequest2)return pNextRequest2;elseScanInside=!Sca
51、nInside;return pNextRequest1;RETURN: return pNextRequest; 得到輸出結(jié)果與上一結(jié)果相同。7 編寫循環(huán)掃描( CSCAN)磁盤調(diào)度算法改寫代碼(部分):IopDiskSchedule(VOID)for (pListEntry = RequestListHead.Next; pListEntry != &RequestListHead; pListEntry = pListEntry->Next) pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry); Offs
52、et = pRequest->Cylinder - CurrentCylinder; if (Offset=0)pNextRequest = pRequest;goto RETURN; else if (Offset > 0 && Offset < InsideShortestDistance) InsideShortestDistance = Offset;pNextRequestInside = pRequest;else if (Offset < 0 && -Offset > OutsideLongestDistance) O
53、utsideLongestDistance = -Offset; pNextRequestOutside = pRequest; ScanInside=1;if(pNextRequestInside != NULL) pNextRequest = pNextRequestInside; elsepNextRequest = pNextRequestOutside;RETURN: return pNextRequest; 輸出結(jié)果:Start Cylinder: 10TID: 37 Cylinder: 10 Offset: 0 =TID: 40 Cylinder: 10 Offset: 0 =T
54、ID: 39 Cylinder: 12 Offset: 2 +TID: 32 Cylinder: 21 Offset: 9 +TID: 36 Cylinder: 41 Offset: 20 +TID: 38 Cylinder: 67 Offset: 26 +TID: 34 Cylinder: 78 Offset: 11 +TID: 35 Cylinder: 0 Offset: 78 -TID: 31 Cylinder: 8 Offset: 8 +TID: 33 Cylinder: 9 Offset: 1 +即以10 12 21 41 67 78 0 8 9的順序?qū)さ? 驗(yàn)證 SSTF、 SCA
55、N 及 CSCAN 算法中的“磁臂粘著”現(xiàn)象輸出結(jié)果:Start Cylinder: 10TID: 32 Cylinder: 10 Offset: 0 =TID: 33 Cylinder: 10 Offset: 0 =TID: 34 Cylinder: 10 Offset: 0 =TID: 35 Cylinder: 10 Offset: 0 =TID: 36 Cylinder: 10 Offset: 0 =TID: 37 Cylinder: 10 Offset: 0 =TID: 38 Cylinder: 10 Offset: 0 =TID: 39 Cylinder: 10 Offset: 0 =TID: 40 Cylinder: 10 Offset: 0 =TID: 31 Cylinder: 78 Offset: 68 +即以10 10 10 10 10 10 10 10 10 78的順序?qū)さ朗褂?SSTF、 SCAN 和 CSCAN 算法調(diào)度這組數(shù)據(jù),輸出結(jié)果相同可以發(fā)現(xiàn),雖然訪問 78 號磁道的線程的請求第一個被放入請求隊(duì)列,但卻被推遲到最后才被處理,出現(xiàn)了“磁臂
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑項(xiàng)目經(jīng)理合同范本
- 光伏股份分配合同范本
- 機(jī)械加工合股合同范本
- 培訓(xùn)機(jī)構(gòu)課程協(xié)議協(xié)議書
- 手機(jī)屏幕材料檢測協(xié)議書
- 房屋更名轉(zhuǎn)讓合同范本
- 托管合伙入股合同范本
- 客戶產(chǎn)品試用合同范本
- 單身老人雇女保姆協(xié)議書
- 員工單店入股合同范本
- GB 252-2015普通柴油
- 生產(chǎn)交接班記錄表
- 山西洗煤廠安全管理人員機(jī)考題庫大全-上(單選、多選題)
- 硅酸鈣板、含鋯型硅酸鋁纖維棉、高鋁型硅酸鋁纖維棉技術(shù)規(guī)格
- 小學(xué)二年級下冊道德與法治《小水滴的訴說》教學(xué)教案
- GB∕T 15762-2020 蒸壓加氣混凝土板
- 護(hù)士分層級培訓(xùn)與管理課件
- 廣州版五年級英語下冊期末知識點(diǎn)復(fù)習(xí)ppt課件
- 照明電氣安裝工程施工方案及工藝方法要求
- 計(jì)算方法全書課件完整版ppt整本書電子教案最全教學(xué)教程ppt課件
- 公路工程施工安全技術(shù)規(guī)范-JTG-F90-2015
評論
0/150
提交評論