操作系統(tǒng)綜合實驗_第1頁
操作系統(tǒng)綜合實驗_第2頁
操作系統(tǒng)綜合實驗_第3頁
操作系統(tǒng)綜合實驗_第4頁
操作系統(tǒng)綜合實驗_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

華北電力大學

實驗報告

實驗名稱操作系統(tǒng)實臉

課程名稱操作系統(tǒng)綜合實驗

專業(yè)班級:學生姓名:

學號:成績:

指導教師:實驗曰期:

華北電力大學實驗報告

實驗一

--實驗目的

(1)熟悉操作系統(tǒng)集成實驗環(huán)境osLab的基本使用方法。

(2)練習編譯、調試EOS操作系統(tǒng)內核以及EOS應用程序。

--實驗內容

(1)啟動osLab;

(2)學習OSLab的基本使用方法:練習使用OSLab編寫一個Windows控制臺應用程序,

熟悉OSLab的基本使用方法(主要包括新建項目、生成項目、調試項目等);

(3)EOS內核項目的生成和調試:對EOS內核項目的各種操作(包括新建、生成和各

種調試功能等)與對Windows控制臺項目的操作是完全一致的;

(4)EOS應用程序項目的生成和調試;

(5)退出OSLab。

三.實驗內容問題及解答

1)練習使用單步調試功能(逐過程、逐語句),體會在哪些情況下應該使用〃逐過程”

調試,在哪些情況下應該使用“逐語句"調試。練習使用各種調試工具(包括“監(jiān)視“窗

口、"調用堆棧”窗口等)。

答:逐語句,就是每次執(zhí)行一行語句,如果碰到函數(shù)調用,它就會進入到函數(shù)里

面。而逐過程,碰到函數(shù)時,不進入函數(shù),把函數(shù)調用當成一條語句執(zhí)行。

因此,在需要進入函數(shù)體時用逐語句調試,而不需要進入函數(shù)體時用逐過程調試。

2)思考生成EOSSDK文件夾的目的和作用。查看EOSSDK文件夾中的內容,明白文

件夾的組織結構和各個文件的來源和作用。查看EOS應用程序包含了SDK文件夾中的哪

些頭文件,是如何包含的?

華北電力大學實驗報告

答:EOSSDK是為應用程序調用系統(tǒng)API提供服務,可作為用戶編程中可使用的

工具包集合。

EOSSDK文件夾主要包括INC頭文件、LIB文件夾導入庫文件和BIN文件夾動

態(tài)鏈接庫,可執(zhí)行程序,二進制文件。

EOSSDK包含的頭文件有:eos.h負貢導出API函數(shù)聲明;eosdef.h負責導出函

數(shù)類型的定義;error』負責導出錯誤碼。

四.實驗過程

1.新建Windows控制臺應用程序

生成項目:

執(zhí)行項目:

調試項目:

intF-UK(inilb,//產(chǎn)明數(shù)

1?idinin=0.

11:n=Fun<(10);

12DrirtfWcrld!\n*):

2.使用斷點終端執(zhí)行:

查看EOSSDK(SoftwareDevelopmentKit)文件夾:

修改EOS應用程序項目名稱:

r:IIKSnr.E-1(FrrssCtrl*F1**Ffitnsaitc*ccuwlewindru...)

JcleonetoEOS3bc11

五.實驗心得

這次是驗證性試驗,具體步驟和操作方法都是與實驗教程參考書上一致,實

驗很順利,實驗過程沒有遇到困難。通過這次實驗,我掌握了OSLab啟動和

退出操作;練習使用OSLab編寫一個Windows控制臺應用程序,熟悉OSLab

的基本使用方法新建項目、生成項目、調試項目等。

華北電力大學實驗報告

實驗2操作系統(tǒng)的啟動

--實驗目的

1.跟蹤調試EOS在PC機上從加電復位到成功啟動的全過程,了解操作系統(tǒng)的啟動過程。

2.直看EOS啟動后的狀態(tài)和行為,理解操作系統(tǒng)啟動后的工作方式。

二.實驗內容

1.調試EOS操作系統(tǒng)的啟動過程。

2.調試加載程序。Loader程序的主要任務是將操作系統(tǒng)內核(kernel.dll文件)加載

到內存中,然后讓CPU進入保護模式并且啟用分頁機制,最后進入操作系統(tǒng)內核開始執(zhí)

行(跳轉到kernel.dll的入口點執(zhí)行1

3,調試內核。

4.EOS啟動后的狀態(tài)和行為。查看EOS的版本號:

1)在控制臺中輸入命令"ver”后按回車。

2)輸出EOS版本后的控制臺如下圖所示。

ActionEditQDfloppy

CONSOLE-1(PressCtrl+F1~F8toswitchconsolewindow...)

Ue1cometoEOSshell

>uer

TeuationEOS[VersionNumber1.0]

5查看有應用程序運行時進程和線程的信息:

1)待EOS啟動完畢,在EOS控制臺中輸入命令"hell?!焙蠼踊剀嚒4藭rHHIo.exe

應用程序就開始執(zhí)行。

2)迅速按Ctrl+F沏換到控制臺2,并輸入命令"pt"后按回車。輸出的進程和線程

信息如下圖所示

華北電力大學實驗報告

三.實驗內容問題及解答

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、Ioader.bin和kerneI.dII三個二

進制寫入軟盤鏡像文件中,然后讓虛擬機來執(zhí)行軟盤中的EOS操作系統(tǒng)。

僅使用其中一個是不能運行的。

2.軟盤引導扇區(qū)加載完畢后內存中有兩個用戶可用的區(qū)域,為什么軟盤引導扇區(qū)程序選擇

將loader.bin加載到第一個可用區(qū)域的0x1000處呢?這樣做有什么好處?這樣做會對

loader.bin文件的大小有哪些限制。

首先用戶只用兩個可用區(qū)域,加載位置非此即彼。第一個可用用戶區(qū)是低地址區(qū),且空

間大小比較小,適合容納小文件,所以我們選擇將占用空loder.bi加載到第一用戶區(qū)。

優(yōu)點:由低地址開始,便于檢索查找。小文件占用小空間,節(jié)約資源。

限制:Ioader.bin文件必須小于1cOOk.

3.練習使用Bochs單步調試BIOS程序、軟盤引導扇區(qū)程序和loader程序,加深對操作系

統(tǒng)啟動過程的理解。

實驗3進程的創(chuàng)建

一.實驗目的

--練習使用EOSAPI函數(shù)CreateProcess創(chuàng)建一個進程,掌握創(chuàng)建進程的方法,理

解進程和程序的區(qū)別。

二.調試跟蹤CreateProcess函數(shù)的執(zhí)行過程,了解進程的創(chuàng)建過程,理解進程是資

源分配的單位。

二.實驗內容

華北電力大學實驗報告

1.準備實驗.啟動osLab。

2.練習使用控制臺命令創(chuàng)建EOS應用程序的進程

3.練習通過編程的方式讓應用程序創(chuàng)建另一個應用程序的進程

4.調試CreateProcess函數(shù)

5.調域PsCreateProcess函數(shù)”。

6.練習通過編程的方式創(chuàng)建應用程序的多個進程

三.實驗內容問題及解答

1.在源代碼文件NewTwoProcc提供的源代碼基礎上進行修改,要求使用hello.exe

同時創(chuàng)建10個進程。

使用PROCESSJNFORMATION類型定義一個有10個元素的數(shù)組,每一個元素對應一個進

程。

2.學習本書第5章中的5.2節(jié),了解關于線程的相關知識,然后嘗試調試

PspCreateThread函數(shù),觀察線程控制塊(TCB)初始化的過程。

3.在PsCreateProcess函數(shù)中調用了PspCreateProcessEnvironment函數(shù)后又先

后調用了PspLoadProcessImage和PspCreateThread函數(shù),學習這些函數(shù)的主要功

能。能夠交換這些函數(shù)被調用的順序嗎?思考其中的原因。

PspCreateProcessEnvironment創(chuàng)建了地址空間和分配了句柄表。

PspLoadProcessImage是將進程的可執(zhí)行映像加載到了進程的地址空間中。

PspCreateThread創(chuàng)建了進程的主線程。這三個函4知道自己要從哪里開始執(zhí)行,執(zhí)行哪

些指令。因此不能交換他們的順序。

四.實驗心得

本實驗主要的問題就是用hello.exe同時創(chuàng)建10個進程:因為編程基礎不好,剛開始的

程序很難通過編譯.最后使用PROCESSJNFORMATION類型定義一個有10個元素的數(shù)

組,每一個元素對應一個進程。使用一個循環(huán)創(chuàng)建10個子進程,然后再使用一個循環(huán)等

華北電力大學實驗報告

待10個子進程結束,得到退出碼后關閉句柄。并對細節(jié)做了部分修正才成功。

實驗4線程的狀態(tài)和轉換

-?實驗目的和要求

1.倜成線程在各種狀態(tài)間的轉換過程,熟悉線程的狀態(tài)和轉換。

2.通過為線程增加掛起狀態(tài),加深對線程狀態(tài)的理解。

二.實驗內容及步驟

1.準備實驗。

2.調試線程狀態(tài)的轉換過程。

3.線程由阻塞狀態(tài)進入就緒狀態(tài)

4.線程由運行狀態(tài)進入就緒狀態(tài)

5.線程由就緒狀態(tài)迸入運行狀態(tài)

6線程由運行狀態(tài)進入阻塞狀態(tài).

7.為線程增加掛起狀態(tài)

8.完成Resume原語后,可以先使用suspend命令掛起loop線程,然后在控制臺2中

輸入命令"Resume31"(如果loop線程的ID是31)后按回車。命令執(zhí)行成功的結果如

下圖所示。如果切換回控制臺1后,發(fā)現(xiàn)loop線程的執(zhí)行計數(shù)恢復增長就說明Resume原

語可以正常工作。

三.實驗內容問題及解答

1.思考一下,在本實驗中,當loop線程處于運行狀態(tài)時,EOS中還有哪些線程,它們分

別處于什么狀態(tài)。可以使用控制臺命令pt查看線程的狀態(tài)。

華北電力大學實驗報告

5FOSLok>PC-Micro「。代VirtualPC2007

AotiooEditCOFloppyHug

二UNSULE-NCPir匕mmC(rl,F(xiàn)l/-Fatu=3it=h。?!癨。1匕winauw...>

Welcome七。七USsHc11

>P七

*w~w~w^w^wProcessLis-t<1Process)*^*****-**-**^*-**

IDISijG_tcm?IPr*1or*i-ttjIThroedCo”ntIPr*imoirijTHi*e?dIDITmcqcNcmc

1VNd11NN、Q

^******Thx*ua<l=rC11Thkuad)ccc

D。

號:ip:SJt匕:r?AX,t^nt1Di>t?*x-tCclclruw

NHc€K<ftyOx?0OX?XVC

NUJci-tlegOxBOOXSJESn

NI4<x1七iYHfoxooeiezGD

NRiinn1vifjo^noeinzGD

NUei±.ir?cjoxooom^r.n

Nl>Jci七ing0x(3001HNGD

NUletiLiBtyOx8GO18Z6?D

vNW?Aitiity0x8。。里8N6D

oN3d1X1ny9x80。2HN&D

lUUJc1七ing0x800182GD

0X1300lUD^JA

2.當loop線程在控制臺1中執(zhí)行,并且在控制臺2中執(zhí)行suspend命令時,為什么控制臺

1中的loop線程處于就緒狀態(tài)而不是運行狀態(tài)?

3.在本實驗3.2節(jié)中只調試了圖5-3中顯示的最主要的四種轉換過程,對于線程由新建進

入就緒狀態(tài),或者由任意狀態(tài)進入結束狀態(tài)的轉換過程還沒有調試,請讀者找到這兩個轉

換過程執(zhí)行的源代碼,自己練習調試。

4.總結一下在圖5?3中顯示的轉換過程,哪些需要使用線程控制塊中的上下文(將線程控

制塊中的上下文恢復到處理器中,或者將處理器的狀態(tài)復制到線程控制塊的上下文中),

哪些不需要使用,并說明原因。

5.在本實驗3.2節(jié)中總結的所有轉換過程都是分步驟進行的,為了確保完整性,顯然這些

轉換過程是不應該被打斷的,也就是說這些轉換過程都是原語操作(參見本書第2.6節(jié))。

請讀者找出這些轉換過程的原語操作(關中斷和開中斷)是在哪些代碼中完成的。(提示,

重新調試這些轉換過程,可以在調用堆棧窗口列出的各個函數(shù)中逐級查找關中斷和開中斷

的代碼。)

6.修改EOS源代碼,對已經(jīng)實現(xiàn)的線程的掛起狀態(tài)進行改進。首先,不再使用Zero狀態(tài)

表示靜止就緒狀態(tài),在枚舉類型THREAD_STATE中定義一個新的項用來表示靜止就緒狀

態(tài),并對PsSuspendThread函數(shù)進行適當修改。其次,處于阻塞狀態(tài)和運行狀態(tài)的線程

華北電力大學實驗報告

也應該可以被掛起并被恢復,讀者可以參考第5.2.4節(jié)中的內容以及圖5?5來完成此項改

進。注意要設計一些方案對所修改的代碼進行全面的測試,保證所做的改進是正確的。如

果完成了以上改進,請思考一下控制臺命令pt需要進行哪些相應的修改?

設計代碼

STATUS

PsResumThread(

INHANDLEhThread

)

(

STATUSStatus;

BOOLInlStale;

PTHREADThread;

Status=ObRefObjectByHandle(hThread,PspThreadType,(PV01D*)&Thread);

if(EOS_SUCCESS(Status)){

IntState=KeEnablelnterrupts(FALSE);//關中斷

if(Zero==Thread->Slate){

ListRemoveEntrj/(&Thread->StateListEntry);

PspReadyThread(Thread);

PspThreadSchcduleO;

Status=STATUS_SUCCESS;

}else{

Status=STATUS_NOT_SUPPORTED;

1

KeEnablelnterrupts(IntState);〃開中斷

ObDerefObject(Thread);

)

returnStatus;

1

實驗5進程的同步

實驗目的和要求

1.使用EOS的信號量,編程解決生產(chǎn)者一消費者問題,理解進程同步的意義。2.通過為

線程增加掛起狀態(tài),加深對線程狀態(tài)的理解。

華北電力大學實驗報告

2.調試跟蹤EOS信號量的工作過程,理解進程同步的原理。

3.修改EOS的信號量算法,使之支持等待超時喚醒功能(有限等待),加深理解進程同步

的原理。

二.實驗內容及步驟

1.實驗準備

1)啟動osLab。

2)新建一個EOSKernel項目。

3)生成EOSKernel項目,從而在該項目文件夾中生成SDK文件夾。

4)新建一個EOS應用程序項目。

5航用在第3步生成的SDK文件夾覆蓋EOS應用程序項目文件夾中的SDK文件夾。

2.使用EOS的信號量解決生產(chǎn)者-消費者問題

1)使用pc.c文件中的源代碼,替換之前創(chuàng)建的EOS應用程序項目中EOSApp.c文件內

的源代碼。

2)按F7生成修改后的EOS應用程序項目。

3)按F5啟動調試。OSLab會首先彈出一個調試異常對話框。

4)在調試異常對話框中選擇“否〃,繼續(xù)執(zhí)行。

5)立即激活虛擬機窗口查看生產(chǎn)者?消費者同步執(zhí)行的過程,如圖1

6)待應用程序執(zhí)行完畢后,結束此次調試。

華北電力大學實驗報告

CONSOLE-1(PressCtr1+F1~F8toswitchconsolewindow...)

MeleonetoEOSshell

>AutorunAAEOSApp.exe

Producea0

Consumea0

Producea1

ProduceaZ

Producea3

Producea4

Consumea1

Producea5

Producea6

Producea7

Producea8

ConsumeaZ

Producea9

Producea10

Producea11

Producea12

Consumea3

Producea13

Consumea4

Producea14

圖1

3調試EOS信號量的工作過程.

L創(chuàng)建信號量:信號量結構體(SEMAPHORE)中的各個成員變量是由API函數(shù)

CreateSemaphore的對應參數(shù)初始化的,查看main函數(shù)中創(chuàng)建Empty和Full信

號量使用的參數(shù)有哪些不同,又有哪些相同,思考其中的原因。

2.等待、釋放信號量

1)等待信號量(不阻塞):生產(chǎn)者和消費者剛開始執(zhí)行時,用來放產(chǎn)品的緩沖區(qū)都是

空的,所以生產(chǎn)者在第一次調用WaitForSingleObject函數(shù)等待Empty信號量時,

應該不需要阻塞就可以立即返回

2)釋放信號量(不喚醒):生產(chǎn)者線程通過等待Empty信號量使空緩沖區(qū)數(shù)量減少

了1,通過釋放Full信號量使?jié)M緩沖區(qū)數(shù)量增加了1,這樣就表示生產(chǎn)者線程生產(chǎn)了一

個產(chǎn)品并占用了一個緩沖區(qū)。

3)等待信號量(阻塞):由于開始時生產(chǎn)者線程生產(chǎn)產(chǎn)品的速度較快,而消費者線程消

華北電力大學實驗報告

費產(chǎn)品的速度較慢,所以當緩沖池中所有的緩沖區(qū)都被產(chǎn)品占用時,生產(chǎn)者在生產(chǎn)新的產(chǎn)

品時就會被阻塞.

4)釋放信號量(喚醒):只有當消費者線程從緩沖池中消費了一個產(chǎn)品,從而產(chǎn)生一

個空緩沖區(qū)后,生產(chǎn)者線程才會被喚醒并繼續(xù)生產(chǎn)14號產(chǎn)品.

4.修改EOS的信號量算法

1)要求:在目前EOSKernel項目的ps/sem叩hore.c文件中,

PsWaitForSemaphore函數(shù)的Milliseconds參數(shù)只能是INFINITE,

PsReleaseSemaphore函數(shù)的ReleaseCount參數(shù)只能是1。現(xiàn)在要求同時修改

PsWaitForSemaphore函數(shù)和PsReleaseSemaphore函數(shù)中的代碼,使這兩個參數(shù)能

夠真正起到作用,使信號量對象支持等待超時喚醒功能和批量釋放功能。

2)測試:

a.使用修改完畢的EOSKernel項目生成完全版本的SDK文件夾,并覆蓋之前的生

產(chǎn)者?消費者應用程序項目的SDK文件夾。

b.按F5調試執(zhí)行原有的生產(chǎn)者?消費者應用程序項目,結果必須仍然與圖1一致。

如果有錯誤,可以調試內核代碼來查找錯誤,然后在內核項目中修改,并重復步驟

ao

實驗六時間片輪轉調度

一.實驗目的及要求

1.調試EOS的線程調度程序,熟悉基于優(yōu)先級的搶先式調度。

2.為EOS添加時間片輪轉調度,了解其它常用的調度算法。

華北電力大學實驗報告

二.實驗內容及步驟

1.準備實驗

2.閱讀控制臺命令"rr”相關的源代碼

3.調試線程調度程序

a)調試當前線程不被搶先的情況

b)調試當前線程被搶先的情況

=.為EOS添加時間片輪轉調度

a)要求:修改ps/sched.c文件中的PspRoundRobin函數(shù)悌337行),在其中實

現(xiàn)時間片輪轉調度算法。

b)測試:

三.實驗內容問題及解答

修改線程時間片的大?。?/p>

在成功為EOS添加了時間片輪轉調度后,將ps/psp.h第104行定義的

TICKS_OF_TIME_SLICE的值修改為1。在EOS控制臺中輸入命令”rr〃后按回車。觀察

執(zhí)行的效果。還可以按照上面的步驟為nCKS_OF_TIME_SLICE取一些其它的極端值,

例如20或100等,分別觀察〃rr〃命令執(zhí)行的效果。通過分析造成執(zhí)行效果不同的原

因,理解時間片的大小對時間片輪轉調度造成的影響。

a)TICKS_OF_HME_SUCE的值為1

華北電力大學實驗報告

,OSLabPC-MicrosoftVirtualPC2007

ActionEditCDFloppyHelp

CONSOLE-1(PressCtrl+F1~F8toswitchconsolewindow.

Thread0(8):22238

Thread1(8):ZZ181

ThreadZ(8):ZZ157

Thread3(8):22294

Thread4(8):Z1706

Thread5(8):22393

Thread6(8):22573

Thread?(8):Z1871

Thread8(8):22394

Thread9(8):2254。

Thread10(8):21858

Thread11(8):22176

Thread1Z(8):22240

Thread13(8):2Z297

Thread14(8):Z253Z

Thread15(8):Z1618

Thread16(8):22409

Thread17(8):22407

Thread18(8):22436

Thread19(8):21875

>________

b)TICKS_OF_TIME_SLICE的值為20

LabPC-MicrosoftVirtualPC2007

EditCDFlcppyHelp

CONSOLE-1(PressCtr1+F1~F8toswitchconsolewindow.

Thread0(8):2248。

Thread1(8):22819

ThreadZ(8):23356

Thread3(8):Z3117

Thread4(8):22749

Thread5(8):21021

Thread6(8):2244s

Thread7C8):ZZZ97

Thread8(8):23403

Thread9C8):22612

Thread10(8):Z3757

Thread11(8):ZZZ76

Thread12(8):21966

Thread13(8):20924

Thread14(8):Z0550

Thread15(8):ZZ111

Thread16(8):20848

Thread17(8):20920

Thread18(8):Z1369

Thread19(8):20701

>

-kJ

c)TICKS_OF_TIME_SUCE的值為100

華北電力大學實驗報告

。OSLabPC-MicrosoftVirtualPC2007

1ActionrEdi*rtCDFloppyHelp

C0MS0LE-1(PressCtrl*Fl*F8toswitchconsolewindow...)

Thread0(8):21992

Thread1(8):22242

ThreadZ(8):22530

Thread3(8):ZZ073

Thread4(8):22124

Thread5(8):21815

Thread6(8):21908

Thread7(8):22443

Thread8(8):22279

Thread9(8):21856

Thread10(8):22304

Thread11(8):21989

Thread12(8):21740

Thread13(8):22471

Thread14(8):2Z053

Thread15(8):21952

Thread16(8):22166

Thread17(8):2Z133

Thread18(8):22247

Thread19(8):22474

>

3JH[二-L一___________

實驗七物理存儲器與進程邏輯地址空間的

管理

一.實驗目的及要求

1.使用EOS的信號量,編程解決生產(chǎn)者一消費者問題,理解進程同步的意義。2.通

過為線程增加掛起狀態(tài),加深對線程狀態(tài)的理解。

2.調試跟蹤EOS信號量的工作過程,理解進程同步的原理。

3.修改EOS的信號量算法,使之支持等待超時喚醒功能(有限等待),加深理解進

程同步的原理。

二.實驗內容及步驟

華北電力大學實驗報告

(1)、準備實驗

(2)、執(zhí)行控制臺命令"pm”,查看物理存儲器的信息

(3)、分配物理頁和釋放物理頁:

a.在pm命令函數(shù)中添加分配物理頁和釋放物理頁的代碼

b.單步倜域分配物理頁和釋放物理頁

(4)、執(zhí)行控制臺命令"vm”,查看系統(tǒng)進程的虛擬地址描述符信息

執(zhí)行控制臺命令"vm”,查看當創(chuàng)建了一個應用程序進程后,系統(tǒng)進程和應用程

序進程中虛擬地址描述符的信息

(5)、在系統(tǒng)進程中分配虛擬頁和釋放虛擬頁

(6)、在應用程序進程中分配虛擬頁和釋放虛擬頁

(7)、結束實驗

三.實現(xiàn)代碼及其說明:

INT*d;

if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)){//調用API

函數(shù)VirtualAlloc,分配一個整型變量所需的空間,并使用一個整型變量的指針指向

這個空間

printf("Allocated%dbytesvirtualmemoryofOx%x\n\n",sizeof(int),d);

printf("virtualmemoryoriginalvalue:Ox%x\n\n",*d);

*d=OxFFFFFFFF;//修改整型變量的值為OxFFFFFFFF

printf("virtualmemorynewvalue:Ox%x\n\n",*d);

printf("\nWaitfor10seconds\n");

Sleep(lOOOO);//調用API函數(shù)Sleep,等待10秒鐘。

華北電力大學實驗報告

if(VirtualFree(d,O,MEM_RELEASE))//調用API函數(shù)VirtualFree,釋放之前分

配的整型變量的空間

printf("\nRealeasevirtualmemorysuccess!\n");

else

printf("realeaseerror\n");

printf("\nEndlessloop!");

for(;;);

)

else

(

printf(uerror\nn);

return不能成功分配,打印出error,返回?L

}

printf("Helloworld!\n");

return0;

四.心得體會

本次實驗主要問題在于如何處理異常情況,也就是程序的健壯性。最開始調試結果不

正確,在老師指導下進行了分步調試,修改了部分代碼,最后成功了。最大的收獲是:熟

練對代碼分步調試,找出錯誤。

實驗八分頁存儲器管理

華北電力大學實驗報告

--實驗目的與要求

1.學習i386處理器的二級頁表硬件機制,理解分頁存儲器管理原理。

2.直看EOS應用程序進程和系統(tǒng)進程的二級頁表映射信息,理解頁目錄和頁表的管

理方式。

3.編程修改頁目錄和頁表的映射關系,理解分頁地址變換原理。

二.實驗步驟與代碼:

設計代碼

PRIVATE

VOID

ConsoleCmdMemoryMap(INHANDLEStdHandle){

BOOLIntState;

ULONGPfnOfPageDirectory;

ULONGPageTotal=0;

ULONGIndexOfDirEntry;

ULONGIndexOfTableEntry;

PMMPTE_HARDWAREpPde;

PMMPTE_HARDWAREpPte;

ULONG_PTRPageTableBase;

ULONG_PTRVirtualBase;

constchar*OutputFormat=NULL;

ASSERT(PspCurrentProcess==PspSystemProcess);

華北電力大學實驗報告

IntState=KeEnablelnterrupts(FALSE);II關中斷

ULONGPfnArray[2];

MiAllocateZeroedPages(2,PfnArray);

OutputFormat="Newpageframenumber:Ox%X,Ox%X\n";

fprintf(StdHandlerOutputFormat,PfnArray[O],PfnArray[l]);

KdbPrint(OutputFormatfPfnArray[O],PfnArray[l]);

IndexOfDirEntry=(OxEOOOOOOO>>22);//虛擬地址的高10位是PDE標

a

((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].PageFrameNumb

er=PfnArray[O];

((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].Valid=1;//

有效

((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].Writable=1;//

可寫

MiFlushEntireTIbO;//刷新快表

PageTableBase=OxCOOOOOOO+IndexOfDirEntry*PAGE_SIZE;

IndexOfTableEntry=(OxEOOOOOOO>>12)&Ox3FF;

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].PageFrameN

umber=PfnArray[l];

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Valid=1;

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Writable

=1;MiFlushEntireTIbQ;//刷新快表

華北電力大學實驗報告

IndexOfTableEntry=(OxEOOOlOOO>>12)&Ox3FF;

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].PageFrameN

umber=PfnArray[l];

((PMMPTE_HARDWARE)PageTableBase)[IndexOnableEntry].Valid=1;

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Wntable=1;

MiFlushEntireTIbO;//刷新快表

OutputFormat="ReadMemoryOxEOOOlOOO:%d\n";

fprintf(StdHandle,OutputFormat,*((PINT)0xE0001000));

KdbPrint(OutputFormat,*((PINT)0xE0001000));

*((PINT)0xE0000000)=100;//寫共享內存

fprintf(StdHandle,OutputFormat,*((PINT)0xE0001000));

KdbPrint(OutputFormat,*((PINT)0xE0001000));

OutputFormat="\nCR3->0x%X\n";

PfnOfPageDirectory=

(ULONG)(PspSystemProcess->Pas->PfnOfPageDirectory);

fprintf(StdHandle,OutputFormat,PfnOfPageDirectory);

KdbPrint(OutputFormat,PfnOfPageDirectory);

for(IndexOfDirEntry=0;IndexOfDirEntry<PTE_PER_TABLE;

IndexOfDirEntry++){pPde=

(PMMPTE_HARDWARE)((ULONG_PTR)PDE_BASE+IndexOfDirEntry*

PTE.SIZE);

if(!pPde->Valid)

華北電力大學實驗報告

continue;

OutputFormat="PDE:Ox%X(Ox%X)->Ox%X\n";

VirtualBase=(IndexOfDirEntry<<PDI_SHIFT);

fprintf(StdHandle,OutputFormat,IndexOfDirEntry,VirtualBase,

pPde->PageFrameNumber);

KdbPrint(OutputFormat,IndexOfDirEntry,VirtualBase,

pPde->PageFrameNumber);

PageTableBase=(ULONG_PTR)PTE_BASE+IndexOfDirEntry

溫馨提示

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

評論

0/150

提交評論