合肥工業(yè)大學(xué)操作系統(tǒng)實驗報告_第1頁
合肥工業(yè)大學(xué)操作系統(tǒng)實驗報告_第2頁
合肥工業(yè)大學(xué)操作系統(tǒng)實驗報告_第3頁
合肥工業(yè)大學(xué)操作系統(tǒng)實驗報告_第4頁
合肥工業(yè)大學(xué)操作系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精品文檔合肥工業(yè)高校計算機與信息學(xué)院試驗報告課 程: 計算機操作系統(tǒng)專業(yè)班級: 計算機科學(xué)與技術(shù)2班學(xué) 號: 姓 名: 試驗1 試驗環(huán)境的使用一.試驗?zāi)康?.生疏操作系統(tǒng)集成試驗環(huán)境OS Lab的根本使用方法。 2.練習(xí)編譯、調(diào)試EOS操作系統(tǒng)內(nèi)核以及EOS應(yīng)用程序。二.試驗內(nèi)容1啟動OS Lab2. 學(xué)習(xí)OS Lab的根本使用方法2.1新建Windows把握臺應(yīng)用程序工程 2.2生成工程2.3執(zhí)行工程2.4調(diào)試工程 2.4.1 使用斷點中斷執(zhí)行 2.4.2單步調(diào)試 2.4.3查看變量的值 2.4.4調(diào)用堆棧3. EOS內(nèi)核工程的生成和調(diào)試 3.1新建EOS內(nèi)核工程 3.2生成工程3.3調(diào)試工

2、程3.4查看軟盤鏡像文件中的內(nèi)容3.5查看EOS SDKSoftware Development Kit文件夾4. EOS應(yīng)用程序工程的生成和調(diào)試 4.1新建EOS應(yīng)用程序工程 4.2生成工程 4.3調(diào)試工程4.4查看軟盤鏡像文件中的內(nèi)容4.5修改EOS應(yīng)用程序工程名稱5 退出OS Lab6 保存EOS內(nèi)核工程三.試驗結(jié)果本試驗主要是生疏EOS操作系統(tǒng)的根本操作,練習(xí)了:1新Windows把握臺應(yīng)用程序項,1.“文件菜單中選擇“新建,然后單擊“工程。2. 在“新建工程對話框中,選擇工程模板“把握臺應(yīng)用程序 (c)。3. 在“名稱中輸入新工程使用的文件夾名稱“oslab。4. 在“位置中輸入新工

3、程保存在磁盤上的位置“C:test。新建完畢后, OS Lab 會自動翻開這個新建的工程。2在“生成菜單中選擇“生成工程。結(jié)果如圖3執(zhí)行工程:選擇“調(diào)試菜單中的“開頭執(zhí)行4調(diào)試工程:1. 右鍵點擊“工程管理器窗口中的“源文件文件夾節(jié)點,在彈出的快捷菜單中選擇“添加中的“添加新文件。 2. 在彈出的“添加新文件對話框中選擇“C 源文件模板。 3. 在“名稱中輸入文件名稱“func。 4. 點擊“添加按鈕,添加并自動翻開文件func.c,此時的“工程管理器窗口會如圖: 5. 在 func.c 文件中添加函數(shù): int Func (int n) n = n + 1; return n; 6. 點擊源

4、代碼編輯器上方的console.c標(biāo)簽,切換到console.c文件。將 main 函數(shù)修改為: int main (int argc, char* argv) int Func (int n); / 聲明Func函數(shù) int n = 0; n = Func(10); printf (Hello World!n); return 0; 代碼修改完畢后按F7試驗結(jié)果為輸出:Hello World!7. 在main函數(shù)中定義變量n的代碼行 int n = 0; 上點擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“插入/刪除斷點,會在此行左側(cè)的空白處顯示一個紅色圓點,表示已經(jīng)成功在此行代碼添加了一個斷點練習(xí)使用

5、“逐過程, “逐語句,“跳出功能8.在源代碼編輯器中變量n的名稱上點擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“快速監(jiān)視,進行單步測試,觀看n結(jié)果依次為0,119調(diào)用堆棧,選擇“調(diào)試菜單“窗口中的“調(diào)用堆棧,激活“調(diào)用堆棧窗口??梢钥吹疆?dāng)前“調(diào)用堆棧窗口中只有一個main函數(shù)顯示的內(nèi)容還包括了參數(shù)值和函數(shù)地址。 按F11“逐語句功能的快捷鍵調(diào)試,直到進入Func函數(shù) ,其中當(dāng)前正在調(diào)試的Func函數(shù)在棧頂位置,main函數(shù)在棧底位置。說明是在main函數(shù)中調(diào)用了Func函數(shù)。 10查看軟盤鏡像文件中的內(nèi)容,在“工程管理器窗口中雙擊軟盤鏡像文件Floppy.img四.試驗總結(jié)今日第一次進行操作系統(tǒng)這門課

6、的試驗,這也是將抽象的理論學(xué)問應(yīng)用到實踐的一個很好的時機,同時,我們也學(xué)習(xí)了使用OS Lab的這個試驗環(huán)境,OS Lab的操作界面和Microsoft Visual Studio 2021很像,所以使用起來很快就能上手,對于試驗內(nèi)容,今日主要練習(xí)了:新建Windows把握臺應(yīng)用程序工程、生成工程、執(zhí)行工程、調(diào)試工程以及EOS應(yīng)用程序工程的生成和調(diào)試;設(shè)置間斷點,并且在它的根底上進行了單步操作;具體觀看了通過“快速監(jiān)視“標(biāo)記的數(shù)的值的變化過程等根本操作,這也為以后試驗的順當(dāng)進行打下了良好的根底。5. 試驗截圖試驗2 操作系統(tǒng)的啟動一.試驗?zāi)康?.跟蹤調(diào)試EOS在PC機上從加電復(fù)位到成功啟動的全過

7、程,了解操作系統(tǒng)的啟動過程。 2.查看EOS啟動后的狀態(tài)和行為,理解操作系統(tǒng)啟動后的工作方式。 二.試驗內(nèi)容1 預(yù)備試驗2 調(diào)試EOS操作系統(tǒng)的啟動過程2.1 使用Bochs做為遠程目標(biāo)機2.2 調(diào)試BIOS程序2.3 調(diào)試軟盤引導(dǎo)扇區(qū)程序2.4 調(diào)試加載程序2.5 調(diào)試內(nèi)核2.6 EOS啟動后的狀態(tài)和行為三.試驗結(jié)果1.新建一個EOS Kernel工程。 2.使用Bochs做為遠程目標(biāo)機1在“工程管理器窗口中,右鍵點擊工程節(jié)點,在彈出的快捷菜單中選擇“屬性。 2 在彈出的“屬性頁對話框右側(cè)的屬性列表中找到“遠程目標(biāo)機屬性,將此屬性值修改為“Bochs Debug 3點擊“確定按鈕關(guān)閉“屬性頁

8、對話框。接下來就可以使用Bochs模擬器調(diào)試BIOS程序和軟盤引導(dǎo)扇區(qū)程序了。 3.按F5啟動調(diào)試,此時會彈出兩個Bochs窗口。標(biāo)題為“Bochs for windows - Display的窗口相當(dāng)于計算機的顯示器,顯示操作系統(tǒng)的輸出。標(biāo)題為“Bochs for windows - Console的窗口是Bochs的把握臺,用來輸入調(diào)試命令,輸出各種調(diào)試信息。4.啟動調(diào)試后,Bochs在CPU要執(zhí)行的第一條指令即BIOS的第一條指令處中斷。 此時,Display窗口沒有顯示任何內(nèi)容,Console窗口顯示要執(zhí)行的BIOS第一條指令的相關(guān)信息,并等待用戶輸入調(diào)試命令5.然后查看CPU在沒有執(zhí)

9、行任何指令之前主要存放器中的數(shù)據(jù),以及內(nèi)存中的數(shù)據(jù)1在Console窗口中輸入調(diào)試命令sreg后按回車,顯示當(dāng)前CPU中各個段存放器的值2輸入調(diào)試命令r后按回車,顯示當(dāng)前CPU中各個通用存放器的值3輸入調(diào)試命令xp /1024b 0x0000,查看開頭的1024個字節(jié)的物理內(nèi)存。在Console中輸出的這1K物理內(nèi)存的值都為0,說明BIOS中斷向量表還沒有被加載到此處。 4輸入調(diào)試命令xp /512b 0x7c00,查看軟盤引導(dǎo)扇區(qū)應(yīng)當(dāng)被加載到的內(nèi)存位置。輸出的內(nèi)存值都為0,說明軟盤引導(dǎo)扇區(qū)還沒有被加載到此處。 6.EOS啟動后的狀態(tài)和行為1 在把握臺中輸入命令“ver后按回車。結(jié)果如圖 2查

10、看EOS啟動后的進程和線程的信息: 在把握臺中輸入命令“pt后按回車。輸出的進程和線程信息如下圖四.試驗總結(jié)今日的試驗在試驗一的根底上學(xué)習(xí)了EOS操作系統(tǒng)的啟動、跟蹤調(diào)試以及EOS在PC機上從加電復(fù)位到成功啟動的全過程,這讓我們對EOS這個平臺有了初步的把握,同時我們也練習(xí)了查看了EOS啟動后的狀態(tài)和行為,學(xué)會了查看CPU主要存放器中以及內(nèi)存中的數(shù)據(jù)的方法。五.試驗截圖試驗3進程的創(chuàng)立一,試驗?zāi)康模?,練習(xí)使用 EOS API 函數(shù) CreateProcess 創(chuàng)立一個進程, 把握創(chuàng)立進程的方法, 理解進程和程序的區(qū)分。2,調(diào)試跟蹤 CreateProcess 函數(shù)的執(zhí)行過程,了解進程的創(chuàng)立過

11、程,理解進程是資源安排的單位。二,預(yù)備學(xué)問:閱讀本書第 5.1 節(jié),重點理解程序和進程的關(guān)系,生疏進程把握塊結(jié)構(gòu)體以及進程創(chuàng)立的過程。認真學(xué)習(xí)CreateProcess函數(shù)和其它與創(chuàng)立進程相關(guān)的函數(shù)的說明, 留意理解這些函數(shù)的參數(shù)和返回值的意義。三,主要試驗內(nèi)容及步驟:1, 預(yù)備試驗;2, 練習(xí)使用把握臺命令創(chuàng)立EOS 應(yīng)用程序的進程:練習(xí)使用把握臺命令創(chuàng)立 EOS 應(yīng)用程序進程的具體步驟如下:1 在 EOS 應(yīng)用程序工程的“工程管理器窗口中雙擊 Floppy.img 文件,使用 FloppyImageEditor工具翻開此軟盤鏡像文件。2將本試驗文件夾中的 Hello.exe 文件拖動到 F

12、loppyImageEditor 工具窗口的文件列表中釋放,Hello.exe 文件即被添加到軟盤鏡像文件中。Hello.exe 一個 EOS 應(yīng)用程序,其源代碼可以參見本試驗文件夾中的 Hello.c 源文件。3在 FloppyImageEditor 中選擇“文件菜單中的“保存后關(guān)閉 FloppyImageEditor。4按 F7 生成 EOS 應(yīng)用工程。5按 F5 啟動調(diào)試。OS Lab 會彈出一個調(diào)試特別對話框,并中斷應(yīng)用程序的執(zhí)行。6 在調(diào)試特別對話框中選擇“否,無視特別連續(xù)執(zhí)行應(yīng)用程序。7 激活虛擬機窗口,待該應(yīng)用程序執(zhí)行完畢后,在 EOS 的把握臺中輸入命令“A:Hello.exe

13、后回車。8 Hello.exe 應(yīng)用程序開頭執(zhí)行,觀看其輸出如圖 11-1。9待 Hello.exe 執(zhí)行完畢后可以重復(fù)第 7 步,或者結(jié)束此次調(diào)試。3. 練習(xí)通過編程的方式讓應(yīng)用程序創(chuàng)立另一個應(yīng)用程序的進程使用 OS Lab 翻開本試驗文件夾中的 NewProc.c 文件將此文件拖動到 OS Lab 窗口中釋放即可 依據(jù)下面的步驟查看應(yīng)用程序創(chuàng)立另一個應(yīng)用程序的進程的執(zhí)行結(jié)果:1 使用NewProc.c文件中的源代碼替換之前創(chuàng)立的EOS應(yīng)用程序工程中的EOSApp.c文件內(nèi)的源代碼。2按 F7 生成修改后的 EOS 應(yīng)用程序工程。3 按 F5 啟動調(diào)試。OS Lab 會首先彈出一個調(diào)試特別對

14、話框。4 在調(diào)試特別對話框中選擇“否,連續(xù)執(zhí)行。5激活虛擬機窗口查看應(yīng)用程序輸出的內(nèi)容, 如圖 11-2。 結(jié)合圖 11-1, 可以看到父進程 EOSApp.exe首先開頭執(zhí)行并輸出內(nèi)容,父進程創(chuàng)立了子進程Hello.exe后,子進程開頭執(zhí)行并輸出內(nèi)容,待子進程結(jié)束后父進程再連續(xù)執(zhí)行。6結(jié)束此次調(diào)試。4.調(diào)試 CreateProcess 函數(shù)依據(jù)下面的步驟調(diào)試 CreateProcess 函數(shù)創(chuàng)立進程的過程:1 按 F5 啟動調(diào)試 EOS 應(yīng)用程序,OS Lab 會首先彈出一個調(diào)試特別對話框。2 選擇“是調(diào)試特別,調(diào)試會中斷。3在 main 函數(shù)中調(diào)用 CreateProcess 函數(shù)的代碼行

15、第 57 行添加一個斷點。4按 F5 連續(xù)調(diào)試,在斷點處中斷。5按 F11 調(diào)試進入 CreateProcess 函數(shù)。此時已經(jīng)開頭進入 EOS 內(nèi)核進行調(diào)試。.5, 調(diào)試PsCreateProcess 函數(shù) 創(chuàng)立進程最主要的操作就是創(chuàng)立進程把握塊(PCB),并初始化其中的各種信息也就是為進程安排各種資源 。所以在 PsCreateProcess 函數(shù)中首先調(diào)用了 PspCreateProcessEnvironment 函數(shù)來創(chuàng)立進程把握塊。調(diào)試 PspCreateProcessEnvironment 函數(shù)的步驟如下:1在 PsCreateProcess 函數(shù)中找到調(diào)用 PspCreatePr

16、ocessEnvironment 函數(shù)的代碼行create.c文件的第 163 行 ,并在此行添加一個斷點。2 按 F5 連續(xù)調(diào)試,到此斷點處中斷。3 按 F11 調(diào)試進入 PspCreateProcessEnvironment 函數(shù)。由于 PspCreateProcessEnvironment 函數(shù)的主要功能是創(chuàng)立進程把握塊并初始化其中的局部信息,所以在此函數(shù)的開頭,定義了一個進程把握塊的指針變量 NewProcess。在此函數(shù)中查找到創(chuàng)立進程把握塊的代碼行create.c 文件的第 418 行Status = ObCreateObject( PspProcessType,NULL,size

17、of(PROCESS) + ImageNameSize + CmdLineSize,0,(PVOID*)&NewProcess );這里的 ObCreateObject 函數(shù)會在由 EOS 內(nèi)核管理的內(nèi)存中創(chuàng)立了一個新的進程把握塊也就是安排了一塊內(nèi)存 ,并由 NewProcess 返回進程把握塊的指針也就是所安排內(nèi)存的起始地址 。依據(jù)下面的步驟調(diào)試進程把握塊的創(chuàng)立過程:1在調(diào)用 ObCreateObject 函數(shù)的代碼行create.c 文件的第 418 行添加一個斷點。2按 F5 連續(xù)調(diào)試,到此斷點處中斷。3 按 F10 執(zhí)行此函數(shù)后中斷。4 此時為了查看進程把握塊中的信息,將表達式*New

18、Process 添加到“監(jiān)視窗口中。5 將鼠標(biāo)移動到“監(jiān)視窗口中此表達式的“值屬性上,會彈出一個臨時窗口,在臨時窗口中會依據(jù)進程把握塊的結(jié)構(gòu)顯示各個成員變量的值可以參考 PROCESS 結(jié)構(gòu)體的定義 。由于只是新建了進程把握塊,還沒有初始化其中成員變量,所以值都為 0。接下來調(diào)試初始化進程把握塊中各個成員變量的過程:(1)首先創(chuàng)立進程的地址空間,即 4G 虛擬地址空間。在代碼行create.c 文件的第 437 行NewProcess-Pas = MmCreateProcessAddressSpace();添加一個斷點。(2) 按 F5 連續(xù)調(diào)試,到此斷點處中斷。(3)按 F10 執(zhí)行此行代碼

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

20、,在 PsCreateProcess 函數(shù)中是使用ProcessObject 指針指向進程把握塊的,所以將表達式*ProcessObject 添加到“監(jiān)視窗口中就可以連續(xù)觀看新建進程把握塊中的信息。(7)接下來連續(xù)使用 F10 一步步調(diào)試 PsCreateProcess 函數(shù)中的代碼,同樣要留意觀看執(zhí)行后的代碼修改了進程把握塊中的哪些成員變量。當(dāng)調(diào)試到 PsCreateProcess 函數(shù)的最終一行代碼時,查看進程把握塊中的信息, 此時全部的成員變量都已經(jīng)被初始化了 留意觀看成員 ImageName 的值 。(8)按 F5 連續(xù)執(zhí)行,EOS 內(nèi)核會為剛剛初始化完畢的進程把握塊新建一個進程。激活

21、虛擬機窗口查看新建進程執(zhí)行的結(jié)果。(9)在 OS Lab 中選擇“調(diào)試菜單中的“停止調(diào)試結(jié)束此次調(diào)試。(10)選擇“調(diào)試菜單中的“刪除全部斷點 。6, 練習(xí)通過編程的方式創(chuàng)立應(yīng)用程序的多個進程.四試驗收獲及感悟:通過本次試驗生疏了進程的創(chuàng)立,對進程更加的了解。也讓我更加生疏OS Lab這個軟件,對于EOS操作系統(tǒng)的理解也更加深刻。5 試驗截圖試驗4:線程的狀態(tài)和轉(zhuǎn)換一,試驗?zāi)康模?,調(diào)試線程在各種狀態(tài)間的轉(zhuǎn)換過程,生疏線程的狀態(tài)和轉(zhuǎn)換。2,通過為線程增加掛起狀態(tài),加深對線程狀態(tài)的理解。二,預(yù)備學(xué)問:閱讀本書第 5.2.3 節(jié),了解線程都有哪些狀態(tài)以及 EOS 是如何定義這些狀態(tài)的。了解線程是如

22、何在這些狀態(tài)之間進行轉(zhuǎn)換的,特殊是要閱讀一下 EOS 中用于線程轉(zhuǎn)換的相關(guān)函數(shù)的源代碼。閱讀本書第 5.2.4節(jié), 了解 EOS 為線程添加的掛起狀態(tài), 以及 Suspend 和 Resume 原語操作。 線程狀態(tài)的轉(zhuǎn)換和線程的同步、線程的調(diào)度是不行分割的,所以建議讀者簡潔學(xué)習(xí)一下第 5.3 和 5.4 節(jié)中的內(nèi)容。此外,由于本試驗需要觀看“把握臺派遣線程在不同狀態(tài)間的轉(zhuǎn)換過程,所以讀者也需要對該線程有一個簡潔的了解。把握臺派遣線程做為一個系統(tǒng)線程優(yōu)先級為 24 ,在 EOS 啟動后就會被創(chuàng)立,但是該線程絕大局部時間都處于堵塞狀態(tài),只有當(dāng)發(fā)生鍵盤大事例如鍵被按下時才會被喚醒,當(dāng)該線程將鍵盤大事

23、派遣到當(dāng)前活動的把握臺后,該線程就會重新回到堵塞狀態(tài)等待下一個鍵盤大事到來。該線程的線程函數(shù)是文件 io/console.c 中的 IopConsoleDispatchThread 函數(shù)第 567 行 。三,主要試驗內(nèi)容及步驟:1,預(yù)備試驗;2,調(diào)試線程狀態(tài)的轉(zhuǎn)換過程;在本練習(xí)中,會在與線程狀態(tài)轉(zhuǎn)換相關(guān)的函數(shù)中添加假設(shè)干個斷點,并引導(dǎo)讀者單步調(diào)試這些函數(shù),使讀者對 EOS 中的以下線程狀態(tài)轉(zhuǎn)換過程有一個全面的生疏:l 線程由堵塞狀態(tài)進入就緒狀態(tài)。l 線程由運行狀態(tài)進入就緒狀態(tài)。l 線程由就緒狀態(tài)進入運行狀態(tài)。l 線程由運行狀態(tài)進入堵塞狀態(tài)。為了完成這個練習(xí),EOS 預(yù)備了一個把握臺命令“l(fā)oo

24、p ,這個命令的命令函數(shù)是 ke/sysproc.c 文件中的 ConsoleCmdLoop 函數(shù)第 797 行 ,在此函數(shù)中使用 LoopThreadFunction 函數(shù)第 755 行創(chuàng)立了一個優(yōu)先級為 8 的線程后面簡稱為“l(fā)oop 線程 ,該線程會在把握臺中不停的死循環(huán)輸出該線程的ID 和執(zhí)行計數(shù),執(zhí)行計數(shù)會不停的增長以表示該線程在不停的運行??梢砸罁?jù)下面的步驟查看一下 loop命令執(zhí)行的效果:1 按 F7 生成在本試驗 3.1 中創(chuàng)立的 EOS Kernel 工程。2 按 F5 啟動調(diào)試。3 待 EOS 啟動完畢,在 EOS 把握臺中輸入命令“l(fā)oop后按回車。4 結(jié)束此次調(diào)試。接下

25、來依據(jù)下面的步驟調(diào)試線程狀態(tài)轉(zhuǎn)換的過程:1 在 ke/sysproc.c 文件的 LoopThreadFunction 函數(shù)中,開頭死循環(huán)的代碼行第 787 行添加一個斷點。2按 F5 啟動調(diào)試。3 待 EOS 啟動完畢,在 EOS 把握臺中輸入命令“l(fā)oop后按回車。EOS 會在斷點處中斷執(zhí)行,說明 loop 線程已經(jīng)開頭死循環(huán)了。此時,EOS 中全部的系統(tǒng)線程要么處于就緒狀態(tài)其優(yōu)先級肯定小于 8,例如系統(tǒng)空閑線程 ,要么就處于堵塞狀態(tài)例如把握臺派遣線程或把握臺線程 ,所以,只有優(yōu)先級為 8 的 loop 線程能夠在處理器上執(zhí)行。接下來依據(jù)下面的步驟對斷點進行一些調(diào)整:1刪除全部斷點。2翻開

26、 ps/sched.c 文件,在與線程狀態(tài)轉(zhuǎn)換相關(guān)的函數(shù)中添加斷點,這樣,一旦有線程的狀態(tài)發(fā)生轉(zhuǎn)變,EOS 會中斷執(zhí)行,就可以觀看線程狀態(tài)轉(zhuǎn)換的具體過程了。需要添加的斷點有:l 在 PspReadyThread 函數(shù)體中添加一個斷點第 130 行 。l 在 PspUnreadyThread 函數(shù)體中添加一個斷點第 158 行 。l 在 PspWait 函數(shù)體中添加一個斷點第 223 行 。l 在 PspUnwaitThread 函數(shù)體中添加一個斷點第 282 行 。l 在 PspSelectNextThread 函數(shù)體中添加一個斷點第 395 行 。3按 F5 連續(xù)執(zhí)行,然后激活虛擬機窗口。此

27、時在虛擬機窗口中會看到 loop 線程在不停執(zhí)行,而之前添加的斷點都沒有被命中,說明此時還沒有任何線程的狀態(tài)發(fā)生轉(zhuǎn)變。在開頭觀看線程狀態(tài)轉(zhuǎn)換過程之前還有必要做一個說明。在后面的練習(xí)中,會在 loop 線程執(zhí)行的過程中按一次空格鍵,這會導(dǎo)致 EOS 依次執(zhí)行下面的操作:1把握臺派遣線程被喚醒,由堵塞狀態(tài)進入就緒狀態(tài)。2loop 線程由運行狀態(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)2.1,線程

28、由堵塞狀態(tài)進入就緒狀態(tài)依據(jù)下面的步驟調(diào)試線程狀態(tài)轉(zhuǎn)換的過程:1. 在虛擬機窗口中按下一次空格鍵。2. 此時 EOS 會在 PspUnwaitThread 函數(shù)中的斷點處中斷。在“調(diào)試菜單中選擇“快速監(jiān)視 ,在快速監(jiān)視對話框的表達式編輯框中輸入表達式“*Thread ,然后點擊“重新計算按鈕,即可查看線程把握塊TCB中的信息。其中 State 域的值為 3Waiting ,雙向鏈表項 StateListEntry的 Next 和 Prev 指針的值都不為 0,說明這個線程還處于堵塞狀態(tài),并在某個同步對象的等待隊列中;StartAddr 域的值為 IopConsoleDispatchThread,

29、說明這個線程就是把握臺派遣線程。3. 關(guān)閉快速監(jiān)視對話框,激活“調(diào)用堆棧窗口。依據(jù)當(dāng)前的調(diào)用堆棧,可以看到是由鍵盤中斷效勞程序KdbIsr進入的。當(dāng)按下空格鍵后,就會發(fā)生鍵盤中斷,從而觸發(fā)鍵盤中斷效勞程序。在該效勞程序的最終中會喚醒把握臺派遣線程,將鍵盤大事派遣到活動的把握臺。4. 在“調(diào)用堆棧窗口中雙擊 PspWakeThread 函數(shù)對應(yīng)的堆棧項。可以看到在此函數(shù)中連續(xù)調(diào)用了PspUnwaitThread 函數(shù)和 PspReadyThread 函數(shù), 從而使處于堵塞狀態(tài)的把握臺派遣線程進入就緒狀態(tài)。5. 在“調(diào)用堆棧窗口中雙擊 PspUnwaitThread 函數(shù)對應(yīng)的堆棧項,先來看看此函

30、數(shù)是如何轉(zhuǎn)變線程狀態(tài)的。按 F10 單步調(diào)試直到此函數(shù)的最終,然后再從快速監(jiān)視對話框中觀看“*Thread表達式的值。此時 State 域的值為 0Zero ,雙向鏈表項 StateListEntry 的 Next 和 Prev 指針的值都為 0,說明這個線程已經(jīng)處于游離狀態(tài),并已不在任何線程狀態(tài)的隊列中。認真閱讀PspUnwaitThread 函數(shù)中的源代碼,理解這些源代碼是如何轉(zhuǎn)變線程狀態(tài)的。6. 按 F5 連續(xù)執(zhí)行,在 PspReadyThread 函數(shù)中的斷點處中斷。按 F10 單步調(diào)試直到此函數(shù)的最終,然后再從快速監(jiān)視對話框中觀看“*Thread表達式的值。此時 State 域的值為

31、 1Ready ,雙向鏈表項 StateListEntry 的 Next 和 Prev 指針的值都不為 0,說明這個線程已經(jīng)處于就緒狀態(tài),并已經(jīng)被放入優(yōu)先級為 24 的就緒隊列中。認真閱讀 PspReadyThread 函數(shù)中的源代碼,理解這些源代碼是如何轉(zhuǎn)變線程狀態(tài)的。通過以上的調(diào)試,可以將線程由堵塞狀態(tài)進入就緒狀態(tài)的步驟總結(jié)如下:(1) 將線程從等待隊列中移除。(2) 將線程的狀態(tài)由 Waiting 修改為 Zero。(3) 將線程插入其優(yōu)先級對應(yīng)的就緒隊列的隊尾。(4) 將線程的狀態(tài)由 Zero 修改為 Ready。至此,把握臺派遣線程已經(jīng)進入就緒狀態(tài)了,因為其優(yōu)先級24比當(dāng)前處于運行狀

32、態(tài)的 loop 線程的優(yōu)先級8要高,依據(jù) EOS 已實現(xiàn)的基于優(yōu)先級的搶先式調(diào)度算法,loop 線程會進入就緒狀態(tài),把握臺派遣線程會搶占處理器從而進入運行狀態(tài)。接下來調(diào)試這兩個轉(zhuǎn)換過程。2.2,線程由運行狀態(tài)進入就緒狀態(tài)依據(jù)下面的步驟調(diào)試線程狀態(tài)轉(zhuǎn)換的過程:1. 按 F5 連續(xù)執(zhí)行,在 PspSelectNextThread 函數(shù)中的斷點處中斷。在快速監(jiān)視對話框中查看“*PspCurrentThread表達式的值,觀看當(dāng)前占用處理器的線程的狀況。其中 State 域的值為 2Running ,雙向鏈表項 StateListEntry 的 Next 和 Prev 指針的值都為 0,說明這個線程仍

33、舊處于運行狀態(tài),由于只能有一個處于運行狀態(tài)的線程,所以這個線程不在任何線程狀態(tài)的隊列中;StartAddr 域的值為 LoopThreadFunction,說明這個線程就是 loop 線程。留意,在本次斷點被命中之前,loop 線程就已經(jīng)被中斷執(zhí)行了,并且其上下文已經(jīng)保存在線程把握塊中。2. 按 F10 單步調(diào)試,直到對當(dāng)前線程的操作完成也就是花括號中的操作完成 。再從快速監(jiān)視對話框中查看“*PspCurrentThread表達式的值。其中 State 域的值為 1Ready ,雙向鏈表項StateListEntry 的 Next 和 Prev 指針的值都不為 0,說明 loop 線程已經(jīng)進入

34、了就緒狀態(tài),并已經(jīng)被放入優(yōu)先級為 8 的就緒隊列中。 認真閱讀 PspSelectNextThread 函數(shù)這個花括號中的源代碼,理解這些源代碼是如何轉(zhuǎn)變線程狀態(tài)的,并與 PspReadyThread 函數(shù)中的源代碼進行比較,說明這兩段源代碼的異同,體會為什么在這里不能直接調(diào)用 PspReadyThread 函數(shù)。通過以上的調(diào)試,可以將線程由運行狀態(tài)進入就緒狀態(tài)的步驟總結(jié)如下:(1) 線程中斷運行,將線程中斷運行時的上下文保存到線程把握塊中。(2) 假設(shè)處于運行狀態(tài)的線程被更高優(yōu)先級的線程搶先,就需要將該線程插入其優(yōu)先級對應(yīng)的就緒隊列的隊首。 留意,假設(shè)處于運行狀態(tài)的線程主動讓出處理器,例如時

35、間片用完,就需要將程插入其優(yōu)先級對應(yīng)的就緒隊列的隊尾。 (3) 將線程的狀態(tài)由 Running 修改為 Ready。至此, loop 線程已經(jīng)進入就緒狀態(tài)了, 接下來調(diào)試把握臺派遣線程會得處處理器進入運行狀態(tài)的過程。2.3: 線程由就緒狀態(tài)進入運行狀態(tài)依據(jù)下面的步驟調(diào)試線程狀態(tài)轉(zhuǎn)換的過程:1. 按 F5 連續(xù)執(zhí)行, 在 PspUnreadyThread 函數(shù)中的斷點處中斷。 在快速監(jiān)視對話框中查看 “*Thread表達式的值。其中 State 域的值為 1Ready ,雙向鏈表項 StateListEntry 的 Next 和 Prev 指針的值都不為 0,說明這個線程處于就緒狀態(tài),并在優(yōu)先級

36、為 24 的就緒隊列中;StartAddr 域的值為 IopConsoleDispatchThread, 說明這個線程就是把握臺派遣線程。 認真閱讀 PspUnreadyThread函數(shù)中的源代碼,理解這些源代碼是如何轉(zhuǎn)變線程狀態(tài)的。2. 關(guān)閉快速監(jiān)視對話框后,在“調(diào)用堆棧窗口中激活 PspSelectNextThread 函數(shù)對應(yīng)的堆棧項,可以看到在 PspSelectNextThread 函數(shù)中已經(jīng)將 PspCurrentThread 全局指針指向了把握臺派遣線程,并在調(diào)用 PspUnreadyThread 函數(shù)后,將當(dāng)前線程的狀態(tài)改成了 Running。3. 在“調(diào)用堆棧窗口中激活 Ps

37、pUnreadyThread 函數(shù)對應(yīng)的堆棧項,然后按 F10 單步調(diào)試,直到返回 PspSelectNextThread 函數(shù)并將線程狀態(tài)修改為 Running。再從快速監(jiān)視對話框中查看“*PspCurrentThread表達式的值,觀看當(dāng)前占用處理器的線程的狀況。其中 State 域的值為 2Running ,雙向鏈表項 StateListEntry 的 Next 和 Prev 指針的值都為 0,說明把握臺派遣線程已經(jīng)處于運行狀態(tài)了。接下來,會將該線程的上下文從線程把握塊TCB復(fù)制處處理器的各個存放器中,處理器就可以從該線程上次停止運行的位置連續(xù)運行了。通過以上的調(diào)試,可以將線程由就緒狀態(tài)

38、進入運行狀態(tài)的步驟總結(jié)如下:(1) 將線程從其優(yōu)先級對應(yīng)的就緒隊列中移除。(2) 將線程的狀態(tài)由 Ready 修改為 Zero。(3) 將線程的狀態(tài)由 Zero 修改為 Running。(4) 將線程的上下文從線程把握塊TCB復(fù)制處處理器的各個存放器中,讓線程從上次停止運行的位置連續(xù)運行。至此,把握臺派遣線程已經(jīng)開頭運行了。因為此時沒有比把握臺派遣線程優(yōu)先級更高的線程來搶占處理器,所以把握臺派遣線程可以始終運行,直到將此次由于空格鍵被按下而產(chǎn)生的鍵盤大事處理完畢,然后把握臺派遣線程會由運行狀態(tài)重新進入堵塞狀態(tài),開頭等待下一個鍵盤大事到來。2.4,線程由運行狀態(tài)進入堵塞狀態(tài):依據(jù)下面的步驟調(diào)試線

39、程狀態(tài)轉(zhuǎn)換的過程:1. 按 F5 連續(xù)執(zhí)行, 在 PspWait 函數(shù)中的斷點處中斷。 在快速監(jiān)視對話框中查看 “*PspCurrentThread表達式的值,觀看當(dāng)前占用處理器的線程的狀況。其中 State 域的值為 2Running ,雙向鏈表項 StateListEntry 的 Next 和 Prev 指針的值都為 0, 說明這個線程仍舊處于運行狀態(tài); StartAddr域的值為 IopConsoleDispatchThread,說明這個線程就是把握臺派遣線程。2. 按 F10 單步調(diào)試,直到左側(cè)的黃色箭頭指向代碼第 248 行。再從快速監(jiān)視對話框中查看“*PspCurrentThrea

40、d表達式的值。其中 State 域的值為 3Waiting ,雙向鏈表項StateListEntry 的 Next 和 Prev 指針的值都不為 0,說明把握臺派遣線程已經(jīng)處于堵塞狀態(tài)了,并在某個同步對象的等待隊列中。第 248 行代碼可以觸發(fā)線程調(diào)度功能,會中斷執(zhí)行當(dāng)前已經(jīng)處于堵塞狀態(tài)的把握臺派遣線程,并將處理器上下文保存到該線程的線程把握塊中。通過以上的調(diào)試,可以將線程由運行狀態(tài)進入堵塞狀態(tài)的步驟總結(jié)如下:(1) 將線程插入等待隊列的隊尾。(2) 將線程的狀態(tài)由 Running 修改為 Waiting。(3) 將線程中斷執(zhí)行,并將處理器上下文保存到該線程的線程把握塊中。至此,把握臺派遣線程

41、已經(jīng)進入堵塞狀態(tài)了。因為此時 loop 線程是就緒隊列中優(yōu)先級最高的線程,線程調(diào)度功能會選擇讓 loop 線程連續(xù)執(zhí)行。依據(jù)下面的步驟調(diào)試線程狀態(tài)轉(zhuǎn)換的過程:1. 按 F5 連續(xù)執(zhí)行,與本試驗 3.2.3 節(jié)中的狀況相同,只不過這次變?yōu)?loop 線程由就緒狀態(tài)進入運行狀態(tài)。2. 再按 F5 連續(xù)執(zhí)行,EOS 不會再被斷點中斷。激活虛擬機窗口,可以看到 loop 線程又開頭不停的執(zhí)行死循環(huán)了。3. 可以再次按空格鍵,將以上的調(diào)試步驟重復(fù)一遍。這次調(diào)試的速度可以快一些,認真體會線程狀態(tài)轉(zhuǎn)換的過程。3,為線程增加掛起狀態(tài): OS 已經(jīng)實現(xiàn)了一個 suspend 命令,其命令函數(shù)為 ConsoleC

42、mdSuspendThread在 ke/sysproc.c 文件的第 843 行 。在這個命令中調(diào)用了 Suspend 原語在 ps/psspnd.c 文件第 27 行的 PsSuspendThread 函數(shù)中實現(xiàn) 。Suspend 原語可以將一個處于就緒狀態(tài)的線程掛起。以 loop 線程為例,當(dāng)使用 suspend 命令將其掛起時,loop 線程的執(zhí)行計數(shù)就會停止增長。依據(jù)下面的步驟觀看 loop 線程被掛起的狀況:1. 刪除之前添加的全部斷點。2. 按 F5 啟動調(diào)試。3. 待 EOS 啟動完畢,在 EOS 把握臺中輸入命令“l(fā)oop后按回車。此時可以看到 loop 線程的執(zhí)行計數(shù)在不停增

43、長,說明 loop 線程正在執(zhí)行。記錄下 loop 線程的 ID。4. 按 Ctrl+F2 切換到把握臺 2,輸入命令“suspend 31 假設(shè) loop 線程的 ID 是 31后按回車。5. 按 Ctrl+1 切換回把握臺 1,可以看到由于 loop 線程已經(jīng)成功被掛起,其執(zhí)行計數(shù)已經(jīng)停止增長了。此時占用處理器的是 EOS 中的空閑線程。 四,試驗收獲及感悟: 通過本次試驗,我學(xué)會了調(diào)試線程在各種狀態(tài)間的轉(zhuǎn)化過程,生疏了線程的狀態(tài)和轉(zhuǎn)換,在試驗中我通過為線程增加掛起狀態(tài),加深了對線程狀態(tài)的理解。5 試驗截圖:試驗5 進程的同步一.試驗?zāi)康?.使用EOS的信號量,編程解決生產(chǎn)者消費者問題,理

44、解進程同步的意義。 2.調(diào)試跟蹤EOS信號量的工作過程,理解進程同步的原理。 3.修改EOS的信號量算法,使之支持等待超時喚醒功能有限等待,加深理解進程同步的原理。 二.試驗內(nèi)容1 預(yù)備試驗2 使用EOS的信號量解決生產(chǎn)者消費者問題3 調(diào)試EOS信號量的工作過程3.1 創(chuàng)立信號量3.2 等待、釋放信號量3.2.1 等待信號量不堵塞3.2.2 釋放信號量不喚醒3.2.3 等待信號量堵塞3.2.4 釋放信號量喚醒4 修改EOS的信號量算法三.試驗結(jié)果1.依據(jù)下面的步驟查看生產(chǎn)者消費者同步執(zhí)行的過程:1使用pc.c文件中的源代碼,替換之前創(chuàng)立的EOS應(yīng)用程序工程中EOSApp.c文件內(nèi)的源代碼。 2

45、按F7生成修改后的EOS應(yīng)用程序工程。 3按F5啟動調(diào)試。OS Lab會首先彈出一個調(diào)試特別對話框。 4在調(diào)試特別對話框中選擇“否,連續(xù)執(zhí)行。 5馬上激活虛擬機窗口查看生產(chǎn)者消費者同步執(zhí)行的過程 6待應(yīng)用程序執(zhí)行完畢后,結(jié)束此次調(diào)試。 2. 等待、釋放信號量1等待信號量不堵塞 生產(chǎn)者和消費者剛開頭執(zhí)行時,用來放產(chǎn)品的緩沖區(qū)都是空的,所以生產(chǎn)者在第一次調(diào)用WaitForSingleObject函數(shù)等待Empty信號量時,應(yīng)當(dāng)不需要堵塞就可以馬上返回。2釋放信號量不喚醒生產(chǎn)者線程通過等待Empty信號量使空緩沖區(qū)數(shù)量削減了1,通過釋放Full信號量使?jié)M緩沖區(qū)數(shù)量增加了1,這樣就表示生產(chǎn)者線程生產(chǎn)了

46、一個產(chǎn)品并占用了一個緩沖區(qū)。3等待信號量堵塞 由于開頭時生產(chǎn)者線程生產(chǎn)產(chǎn)品的速度較快,而消費者線程消費產(chǎn)品的速度較慢,所以當(dāng)緩沖池中全部的緩沖區(qū)都被產(chǎn)品占用時,生產(chǎn)者在生產(chǎn)新的產(chǎn)品時就會被堵塞4釋放信號量喚醒 只有當(dāng)消費者線程從緩沖池中消費了一個產(chǎn)品,從而產(chǎn)生一個空緩沖區(qū)后,生產(chǎn)者線程才會被喚醒并連續(xù)生產(chǎn)14號產(chǎn)品。四.試驗總結(jié)今日的試驗的內(nèi)容是進程的同步,這也是進程這一概念提出后面臨的一個格外大的問題,因為當(dāng)進程在競爭臨界資源時,由于進程的異步性,便會給系統(tǒng)造成混亂,所以能不能讓諸多進程之間有效的共享資源和相互合作,就變成了一個很重要的問題。今日的試驗也讓我們直接的觀看到了EOS操作系統(tǒng)如何

47、通過信號量機制解決進程同步問題,并對程序進行修改,這對我們今后的學(xué)習(xí)有很大的掛念,但對于解決大量同步操作帶來的系統(tǒng)死鎖問題,我還是欠缺實踐和生疏。五.試驗截圖試驗7:物理存儲器與進程規(guī)律空間的管理一,試驗?zāi)康模?,通過查看物理存儲器的使用狀況,并練習(xí)安排和回收物理內(nèi)存,從而把握物理存儲器的管理方法。2,通過查看進程規(guī)律地址空間的使用狀況,并練習(xí)安排和回收虛擬內(nèi)存,從而把握進程規(guī)律地址空間的管理方法。二,預(yù)備學(xué)問:閱讀本書第 6 章。重點閱讀第 6.3 節(jié)和第 6.6 節(jié),了解物理存儲器的管理方式和進程規(guī)律地址空間的管理方式。三,主要試驗內(nèi)容及步驟:1,預(yù)備試驗;2,閱讀把握臺命令“ pm 相關(guān)

48、的源代碼,并查看其執(zhí)行的結(jié)果;3,安排物理頁和釋放物理頁: 接下來,在 pm 命令函數(shù)中添加安排物理頁和釋放物理頁的代碼,單步調(diào)試管理物理頁的方法。依據(jù)下面的步驟修改 pm 命令的源代碼:1. 使用 OS Lab 翻開本試驗文件夾中的 pm.c 文件將文件拖動到 OS Lab 窗口中釋放即可翻開 。此文件中有一個修改后的 ConsoleCmdPhysicalMemory 函數(shù),主要是在原有代碼的后面增加了安排物理頁和釋放物理頁的代碼。2. 使用 pm.c 文件中 ConsoleCmdPhysicalMemory 函數(shù)的函數(shù)體替換 ke/sysproc.c 文件中ConsoleCmdPhysic

49、alMemory 函數(shù)的函數(shù)體。3. 按 F7 生成修改后的 EOS Kernel 工程。4. 按 F5 啟動調(diào)試。5. 待 EOS 啟動完畢,在 EOS 把握臺中輸入命令“pm后按回車。依據(jù)下面的步驟調(diào)試安排物理頁和釋放物理頁的過程:1. 結(jié)束之前的調(diào)試。2. 在 ke/sysproc.c 文件的 ConsoleCmdPhysicalMemory 函數(shù)中,在調(diào)用 MiAllocateAnyPages 函數(shù)的代碼行第 1103 行添加一個斷點,在調(diào)用 MiFreePages 函數(shù)的代碼行第 1115 行添加一個斷點。3. 按 F5 啟動調(diào)試。4. 待 EOS 啟動完畢,在 EOS 把握臺中輸入

50、命令“pm后按回車。5. pm 命令開頭執(zhí)行后,會在調(diào)用 MiAllocateAnyPages 函數(shù)的代碼行處中斷,按 F11 調(diào)試進入MiAllocateAnyPages 函數(shù)。6. 按 F10 單步調(diào)試 MiAllocateAnyPages 函數(shù)的執(zhí)行過程,嘗試答復(fù)下面的問題:(1) 本次安排的物理頁的數(shù)量是多少?安排的物理頁的頁框號是多少?(2) 物理頁是從空閑頁鏈表中安排的?還是從零頁鏈表中安排的?(3) 哪一行語句削減了空閑頁的數(shù)量?哪一行語句將剛剛安排的物理頁由空閑狀態(tài)修改為忙狀態(tài)?(4) 繪制 MiAllocateAnyPages 函數(shù)的流程圖。連續(xù)調(diào)試釋放物理頁的過程:1. 按

51、 F5 連續(xù)執(zhí)行,會在調(diào)用 MiFreePages 函數(shù)的代碼行處中斷,按 F11 調(diào)試進入 MiFreePages 函數(shù)。2. 按 F10 單步調(diào)試 MiFreePages 函數(shù)的執(zhí)行過程,嘗試答復(fù)下面的問題:(1) 本次釋放的物理頁的數(shù)量是多少?釋放的物理頁的頁框號是多少?釋放的物理頁是之前安排的物理頁嗎?(2) 釋放的物理頁是被放入了空閑頁鏈表中?還是零頁鏈表中?(3) 繪制 MiFreePages 函數(shù)的流程圖。結(jié)束此次調(diào)試。 連續(xù)修改 pm 命令的源代碼, 嘗試在調(diào)用 MiAllocateAnyPages 函數(shù)時安排多個物理頁,然后在調(diào)用 MiFreePages 函數(shù)時將安排的多個物

52、理頁釋放,并練習(xí)調(diào)試這兩個函數(shù)在安排多個物理頁和釋放多個物理頁時執(zhí)行的過程4,閱讀把握臺命令“ vm相關(guān)的源代碼,并查看其執(zhí)行結(jié)果;5,在系統(tǒng)進程中安排虛擬頁和釋放虛擬頁: 接下來, 在 vm 命令函數(shù)中添加安排虛擬頁和釋放虛擬頁的代碼, 單步調(diào)試管理虛擬頁的方法。 首先,依據(jù)下面的步驟修改 vm 命令的源代碼:1. 使用 OS Lab 翻開本試驗文件夾中的 vm.c 文件將文件拖動到 OS Lab 窗口中釋放即可翻開 。此文件中有一個修改后的 ConsoleCmdVM 函數(shù),主要是在原有代碼的后面增加了安排虛擬頁和釋放物理頁的代碼。2. 使用 vm.c 文件中 ConsoleCmdVM 函數(shù)

53、的函數(shù)體替換 ke/sysproc.c 文件中 ConsoleCmdVM 函數(shù)的函數(shù)體。3. 按 F7 生成修改后的 EOS Kernel 工程。4. 按 F5 啟動調(diào)試。5. 待 EOS 啟動完畢,在 EOS 把握臺中輸入命令“vm 1后按回車。命令執(zhí)行的結(jié)果會同時轉(zhuǎn)儲在“輸出窗口中。嘗試說明安排虛擬頁或者釋放虛擬頁后虛擬地址描述符以及物理存儲器的變化狀況。6,在應(yīng)用程序進程中,安排虛擬頁和釋放虛擬頁;四,試驗收獲及感悟: 通過本次試驗,讓我學(xué)會了通過查看物理存儲器的使用狀況,并練習(xí)安排和回收物理內(nèi)存,從而把握物理存儲器的管理方法。以及通過查看進程規(guī)律地址空間的使用狀況,并練習(xí)安排和回收虛擬

54、內(nèi)存,從而把握進程規(guī)律地址空間的管理方法。五:試驗截圖:試驗8:分頁存儲器的管理一,試驗?zāi)康模?,學(xué)習(xí) i386 處理器的二級頁表硬件機制,理解分頁存儲器管理原理2,查看 EOS 應(yīng)用程序進程和系統(tǒng)進程的二級頁表映射信息,理解頁名目和頁表的管理方式。3,編程修改頁名目和頁表的映射關(guān)系,理解分頁地址變換原理。二,預(yù)備學(xué)問:閱讀本書第 6 章。了解 i386 處理器的二級頁表硬件機制,EOS 操作系統(tǒng)的分頁存儲器管理方式,以及進程地址空間的內(nèi)存分布。三,主要試驗內(nèi)容及步驟:1,預(yù)備試驗;2,查看 EOS應(yīng)用程序進程的頁名目和頁表;使用 OS Lab 翻開本試驗文件夾中的 memory.c 和 getcr3.asm 文件將文件拖動到 OS Lab 窗口中釋放即可翻開 。認真閱讀這兩個文件中的源代碼和注釋,main 函數(shù)的流程圖可以參見圖 16-1。依據(jù)下面的步驟查看 EOS 應(yīng)用程序進程的頁名目和頁表:1. 使用 memory.c 文件中的源代碼替換之前創(chuàng)立的 EOS 應(yīng)用程序工程中 EOSApp.c 文件中的源代碼。2. 右鍵點擊“工程管理器窗口中的“源文件文件夾節(jié)點,在彈出的快捷菜單中選擇“添加中的“添加新文件。3. 在彈出的“添加新文件對話框中選擇“asm 源文件模板。4. 在“名稱中輸入文件名稱“func。5. 點擊“添加按鈕添加并自動翻開文件

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論