物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理實(shí)驗(yàn)報(bào)告_第1頁
物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理實(shí)驗(yàn)報(bào)告_第2頁
物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理實(shí)驗(yàn)報(bào)告_第3頁
物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理實(shí)驗(yàn)報(bào)告_第4頁
物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)實(shí) 驗(yàn) 報(bào) 告課程名稱操作系統(tǒng)實(shí)驗(yàn)課程編號(hào)0906553實(shí)驗(yàn)項(xiàng)目名稱物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理學(xué)號(hào)年級(jí)姓名專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生所在學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院指導(dǎo)教師實(shí)驗(yàn)室名稱地點(diǎn) 哈爾濱工程大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理一 實(shí)驗(yàn)概述:1.實(shí)驗(yàn)名稱:物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理2.實(shí)驗(yàn)?zāi)康模?)通過查看物理存儲(chǔ)器的使用情況,并練習(xí)分配和回收物理內(nèi)存,從而掌握物理存儲(chǔ)器的管理方法;2)通過查看進(jìn)程邏輯地址空間的使用情況,并練習(xí)分配和回收虛擬內(nèi)存,從而掌握進(jìn)程邏輯地址空間的 管理方法。 3.實(shí)驗(yàn)類型:驗(yàn)證、設(shè)計(jì)4.實(shí)驗(yàn)內(nèi)容: 1)準(zhǔn)備實(shí)驗(yàn),創(chuàng)建一個(gè)

2、EOS Kernel項(xiàng)目; 2)閱讀控制臺(tái)命令“pm”相關(guān)的源代碼,并查看其執(zhí)行的結(jié)果; 3)分配物理頁和釋放物理頁; 4)閱讀控制臺(tái)命令“vm”相關(guān)的源代碼,并查看執(zhí)行的結(jié)果; 5)在系統(tǒng)進(jìn)程中分配虛擬頁和釋放虛擬頁; 6)在應(yīng)用程序進(jìn)程中分配虛擬頁和釋放虛擬頁。二實(shí)驗(yàn)環(huán)境操作系統(tǒng):windows XP編譯器:Tevalaton OS Lab語言:C三實(shí)驗(yàn)過程1.設(shè)計(jì)思路和流程圖:MiAllocateAny函數(shù)流程圖:MiFreePages函數(shù)流程圖:2.實(shí)驗(yàn)過程:1)新建一個(gè) EOS Kernel 項(xiàng)目;2)閱讀 ke/sysproc.c 文件中的 ConsoleCmdPhysicalMe

3、mory 函數(shù),學(xué)習(xí)“pm”命令是如何統(tǒng)計(jì)并輸出物理存儲(chǔ)器信息的。在閱讀的過程中應(yīng)注意:在統(tǒng)計(jì)輸出物理存儲(chǔ)器信息之前要關(guān)閉中斷,之后要打開中斷,這樣可以防止在命令執(zhí)行的過程 中有其它線程分配或者釋放物理頁;全局變量 MiTotalPageFrameCount 保存了物理頁的總數(shù)。每個(gè)物理頁的大小是 4KB,由宏 PAGE_SIZE 定義;全局變量 MiZeroedPageCount 和 MiFreePageCount 分別保存了零頁和空閑頁的數(shù)量;計(jì)算已用物理頁數(shù)量的方法是:物理頁總數(shù)減去零頁數(shù)量,再減去空閑頁數(shù)量。3)生成所創(chuàng)建的項(xiàng)目,啟動(dòng)調(diào)試,待EOS啟動(dòng)完畢,在EOS控制臺(tái)中輸入命令“p

4、m”后回車,觀察命令執(zhí)行的結(jié)果。4)將修改后的ConsoleCmdPhysicalMemory 函數(shù)進(jìn)行替換,主要是在原有代碼的后面添加了分配物理頁和釋放物理頁的代碼,生成修改后的EOS Kernel項(xiàng)目,啟動(dòng)調(diào)試,待 EOS 啟動(dòng)完畢,在 EOS 控制臺(tái)中輸入命令“pm”后按回車;5)結(jié)束調(diào)試,在調(diào)用 MiAllocateAnyPages 函數(shù)的代碼行添加一個(gè)斷點(diǎn),在調(diào)用 MiFreePages 函數(shù)的代碼行添加一個(gè)斷點(diǎn);6)啟動(dòng)調(diào)試,待 EOS 啟動(dòng)完畢,在 EOS 控制臺(tái)中輸入命令“pm”后按回車,pm 命令開始執(zhí)行后,會(huì)在調(diào)用 MiAllocateAnyPages 函數(shù)的代碼行處中斷,

5、按 F11(逐語句)調(diào)試進(jìn)入 MiAllocateAnyPages 函數(shù);按 F10(逐過程)單步調(diào)試 MiAllocateAnyPages 函數(shù)的執(zhí)行過程:7)繼續(xù)執(zhí)行,會(huì)在調(diào)用 MiFreePages 函數(shù)的代碼行處中斷,按F11(逐語句)調(diào)試進(jìn)入 MiFreePages 函數(shù);按 F10(逐過程)單步調(diào)試 MiFreePages 函數(shù)的執(zhí)行過程: 8)閱讀控制臺(tái)命令“vm”相關(guān)的代碼,并查看執(zhí)行結(jié)果。 閱讀 ke/sysproc.c 文件中的 ConsoleCmdVM 函數(shù),學(xué)習(xí)“vm”命令是如何統(tǒng)計(jì)并輸出進(jìn)程的 虛擬地址描述符信息的,注意一下幾點(diǎn): 與“pm” ”命令輸出的是整個(gè)系統(tǒng)的

6、物理存儲(chǔ)器的使用情況不同,“vm”命令輸出的是某個(gè)進(jìn)程的 虛擬地址描述符信息,所以“vm”命令使用了一個(gè)參數(shù)進(jìn)程 ID,用來指定一個(gè)進(jìn)程。這個(gè)進(jìn) 程既可以是系統(tǒng)進(jìn)程,也可以是用戶進(jìn)程; 在統(tǒng)計(jì)輸出指定進(jìn)程的虛擬地址描述符信息之前要關(guān)閉中斷,之后要打開中斷,這樣可以防止在命令執(zhí)行的過程中有其它線程分配或者釋放虛擬頁; EOS 操作系統(tǒng)的進(jìn)程有 4G 的虛擬地址空間,但并不是所有的虛擬地址空間都使用虛擬地址描述符 來管理,有一些地址空間是靜態(tài)的,還有一些地址空間由其他的動(dòng)態(tài)方式來管理(例如系統(tǒng)內(nèi)存 池); 進(jìn)程 4G 虛擬地址空間中由虛擬地址描述符所管理空間的低地址和高地址是固定的,在這段地址空間

7、中,如果有虛擬頁被占用,就會(huì)使用虛擬地址描述符來標(biāo)識(shí),并放入鏈表中管理;9)啟動(dòng)調(diào)試,待 EOS 啟動(dòng)完畢,在 EOS 控制臺(tái)中輸入命令“pt”后按回車?!皃t”命令可以輸出當(dāng)前系統(tǒng)中的 進(jìn)程列表,其中系統(tǒng)進(jìn)程的 ID 為 1;在 EOS 控制臺(tái)中輸入命令“vm 1”后按回車,觀察命令執(zhí)行的結(jié)果:系統(tǒng)進(jìn)程中由虛擬地址描述符所管理的虛擬頁只會(huì)分配給進(jìn)程的句柄表(句柄表占用一個(gè)虛擬頁)和 線程的堆棧(堆棧占用兩個(gè)虛擬頁)。結(jié)合之前“pt”命令輸出的進(jìn)程和線程信息可知,當(dāng)前系統(tǒng)中只有 1 個(gè)系統(tǒng)進(jìn)程以及 10 個(gè)系統(tǒng)線程,所以在上圖中,1 號(hào)描述符所包含的一個(gè)虛擬頁即為系統(tǒng)進(jìn)程的句柄表,而2到11號(hào)

8、這10個(gè)描述符所分別包含的兩個(gè)虛擬頁即為 10 個(gè)系統(tǒng)線程的堆棧。10)將LoopApp.exe文件添加到軟盤鏡像的根目錄中,并保存,啟動(dòng)調(diào)試,待 EOS 啟動(dòng)完畢,在 EOS 控制臺(tái)中輸入命令“A:LoopApp.exe”后按回車。此時(shí)就使用 EOS 應(yīng)用 程序文件 LoopApp.exe 創(chuàng)建了一個(gè)應(yīng)用程序進(jìn)程,由于此進(jìn)程執(zhí)行了一個(gè)死循環(huán),所以此進(jìn)程不 會(huì)結(jié)束執(zhí)行,除非關(guān)閉虛擬機(jī);11)切換到“Console-2”,然后輸入命令“pt”后按回車。輸出的信息如圖所示。其中 ID 為 31 的進(jìn)程就是應(yīng)用程序進(jìn)程,ID 為 33 的線程就是應(yīng)用程序進(jìn)程的主線程;12)輸入命令“vm 1”后按回

9、車,可以查看系統(tǒng)進(jìn)程中虛擬地址描述符的信息。輸出的信息如圖所示。與第9步圖比較可知,3 號(hào)描述符所包含的一個(gè)虛擬頁即為應(yīng)用程序進(jìn)程的句柄表,13號(hào)描述符所包含的兩個(gè)虛擬頁即為應(yīng)用程序進(jìn)程主線程的堆棧;13)輸入命令“vm 31”后按回車,可以查看應(yīng)用程序進(jìn)程中虛擬地址描述符的信息;在進(jìn)程的 4G 邏輯地址空間中,應(yīng)用程序進(jìn)程可以自行管理低 2G 的用戶空間。從圖 15-6 中的信息可以得知,低 2G 的用戶空間又被分為了三部分: 0x00000000-0x0000FFFF 由 16 個(gè)虛擬頁構(gòu)成的 64KB 靜態(tài)空間,用于捕捉對(duì)空指針的非法訪問; 0x00010000-0x7FFEFFFF 由

10、虛擬地址描述符管理的動(dòng)態(tài)空間,用于存儲(chǔ)應(yīng)用程序進(jìn)程的代碼和數(shù) 據(jù)。上圖顯示應(yīng)用程序進(jìn)程的代碼和數(shù)據(jù)占用了此空間中的 5 個(gè)虛擬頁,并且是用從應(yīng)用程 序的基址 0x00400000 起始的; 0x7FFF0000-0x7FFFFFFF 由 16 個(gè)虛擬頁構(gòu)成的 64KB 靜態(tài)空間,用于捕捉對(duì)空指針的非法訪問。14)在系統(tǒng)進(jìn)程中分配虛擬頁和釋放虛擬頁,使用修改后的ConsoleCmdVM 函數(shù)的函數(shù)體替換 ke/sysproc.c 文件中 ConsoleCmdVM 函數(shù)的函數(shù)體,生成修改后的EOS Kernel項(xiàng)目,啟動(dòng)調(diào)試,待 EOS 啟動(dòng)完畢,在 EOS 控制臺(tái)中輸入命令“vm 1”后按回車;

11、15)在 ke/sysproc.c 文件的ConsoleCmdVM 函數(shù)中,在調(diào)用MmAllocateVirtualMemory 函數(shù)的代碼行添加一個(gè)斷點(diǎn),在調(diào)用 MmFreeVirtualMemory 函數(shù)的代碼行添加一 個(gè)斷點(diǎn);16)啟動(dòng)調(diào)試,待 EOS 啟動(dòng)完畢,在 EOS 控制臺(tái)中輸入命令“vm 1”后按回車,vm 命令開始執(zhí)行后,會(huì)在調(diào)用 MmAllocateVirtualMemory 函數(shù)的代碼行處中斷。此時(shí)要注意參數(shù) BaseAddress 和 RegionSize 初始化的值。按 F11(逐過程)調(diào)試進(jìn)入 MmAllocateVirtualMemory 函數(shù);17)按 F10(

12、逐過程)單步調(diào)試 MmAllocateVirtualMemory 函數(shù)的執(zhí)行過程,繼續(xù)執(zhí)行,會(huì)在調(diào)用 MmFreeVirtualMemory 函數(shù)的代碼行處中斷。此時(shí)要注意參數(shù) BaseAddress 和 RegionSize 初始化的值。按 F11 調(diào)試進(jìn)入 MmFreeVirtualMemory 函數(shù);18)嘗試在調(diào)用 MmAllocateVirtualMemory 函數(shù)時(shí)將 RegionSize 參數(shù)的值設(shè)置為 PAGE_SIZE+1 或者 PAGE_SIZE*2+1。觀察“輸出”窗口中轉(zhuǎn)儲(chǔ)的信息,并說明申請(qǐng)?zhí)摂M內(nèi)存的大小與實(shí)際分配的大 小之間的關(guān)系,以及分配的虛擬內(nèi)存大小會(huì)對(duì)分配的虛擬

13、地址產(chǎn)生什么樣的影響。將“輸出”窗 口中轉(zhuǎn)儲(chǔ)的信息保存在文本文件中;19)嘗試在調(diào)用 MmAllocateVirtualMemory 函數(shù)時(shí)將 BaseAddress 參數(shù)的值設(shè)置為已經(jīng)被占用的虛擬 內(nèi)存,例如 0xA0000000,觀察“輸出”窗口中轉(zhuǎn)儲(chǔ)的信息。將“輸出”窗口中轉(zhuǎn)儲(chǔ)的信息保存在 文本文件中;20)嘗試在調(diào)用 MmAllocateVirtualMemory 函數(shù)時(shí)將 RegionSize 參數(shù)的值設(shè)置為 PAGE_SIZE*2,將 BaseAddress 參數(shù)的值設(shè)置為 0xA0017004,觀察“輸出”窗口中轉(zhuǎn)儲(chǔ)的信息,并說明申請(qǐng)?zhí)摂M內(nèi) 存的大小與實(shí)際分配的大小之間的關(guān)系,以

14、及申請(qǐng)的虛擬地址會(huì)對(duì)分配的虛擬內(nèi)存大小產(chǎn)生什么 樣的影響。將“輸出”窗口中轉(zhuǎn)儲(chǔ)的信息保存在文本文件中;21)創(chuàng)建一個(gè)EOS應(yīng)用程序,調(diào)用API函數(shù)VirtualAlloc,分配一個(gè)整型變量所需的空間,并使用一個(gè)整型變量的指針指向這個(gè)空間。修改整型變量的值為 0xFFFFFFFF。在修改前輸出整型變量的值,在修改后再輸出整型變量的值。調(diào)用 API 函數(shù) Sleep,等待 10 秒鐘,調(diào)用 API 函數(shù) VirtualFree,釋放之前分配的整型變量的空間,進(jìn)入死循環(huán),這樣應(yīng)用程序就不會(huì)結(jié)束。#include “EOSApp.h”int main(int argc,char* argv)/啟動(dòng)調(diào)試

15、EOS應(yīng)用程序前要特別注意下面的問題:/ 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)目在磁盤上的位置不能改變。 2、在啟動(dòng)調(diào)試應(yīng)用程序之前必須首先刪除禁用所有的斷點(diǎn),在斷點(diǎn)中斷(int 3) 被命中后才能重新添加啟用斷點(diǎn),否則啟動(dòng)調(diào)試會(huì)失敗。 #ifdef_DEBUG_asm(“int$3n nop”); #endif INT* p;/調(diào)用API函數(shù)VirtualAlloc,分配一個(gè)整型變量所需的空間,并使用一個(gè)整型變量的指針指向這個(gè)空間 If(p=Vir

16、tualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT) printf(“Allocated %d bytes virtual memory of 0x%xnn”,sizeof(int),d); /輸出原始整型變量的值 printf("virtual memory original value:0x%xnn",p); /修改整型變量的值為0xFFFFFFFF *p=0xFFFFFFFF; /輸出修改后的整型變量的值 printf("virtual memory new value:0x%xnn",*p); print

17、f("nWait for 10 secondsn"); / 調(diào)用API函數(shù)Sleep,等待10秒鐘 Sleep(10000); / 調(diào)用API函數(shù)VirtualFree,釋放之前分配的整型變量的空間 if(VirtualFree(p,0,MEM_RELEASE) printf("nRealease virtual memory success!n"); else /若釋放不成功,打印輸出錯(cuò)誤,并返回-1。 printf("VirtualFree Error!n"); return -1; return 0;22)代碼修改完畢后,生成E

18、OS應(yīng)用程序項(xiàng)目,啟動(dòng)調(diào)試,輸出結(jié)果如圖所示。在應(yīng)用程序分配虛擬頁后,利用10秒后才釋放虛擬頁的間隙,可以在控制臺(tái)2中執(zhí)行命令“vm 31”, 查看此時(shí)應(yīng)用程序進(jìn)程的虛擬地址描述符信息,在應(yīng)用程序釋放虛擬頁后,可以在控制臺(tái) 2 中再 次執(zhí)行命令“vm 31”,查看此時(shí)應(yīng)用程序進(jìn)程的虛擬地址描述符信息。提示:API 函數(shù) VirtualAlloc 定義在 api/eosapi.c 文件,此 API 函數(shù)主要調(diào)用了 EOS 內(nèi)核函 數(shù) MmAllocateVirtualMemory,在 EOS 應(yīng)用程序中調(diào)用函數(shù) VirtualAlloc 時(shí),除了使用 MEM_RESERVE 標(biāo)志外,還必須使用 MEM_COMMIT 標(biāo)志;API 函數(shù) VirtualFree 定義在 api/eosapi.c 文件,此 API 函數(shù)主要調(diào)用了 EOS 內(nèi)核函 數(shù) MmFreeVirtualMemory,在 EOS 應(yīng)用程序中調(diào)用函數(shù) VirtualFree 時(shí),要使用 MEM_RELEASE 標(biāo)志。3. 主要數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)代碼及其說明 typedef struct _MMPFN ULONG Unused : 9; / 未用 ULONG PageState : 3; / 物理頁的狀態(tài) ULONG Next : 20; / 下一個(gè)物理頁的頁框號(hào) MMPFN, *PMMPFN; typedef enum

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論