電子科大-計算機-操作系統(tǒng)實驗報告-2014級(共18頁)_第1頁
電子科大-計算機-操作系統(tǒng)實驗報告-2014級(共18頁)_第2頁
電子科大-計算機-操作系統(tǒng)實驗報告-2014級(共18頁)_第3頁
電子科大-計算機-操作系統(tǒng)實驗報告-2014級(共18頁)_第4頁
電子科大-計算機-操作系統(tǒng)實驗報告-2014級(共18頁)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上電 子 科 技 大 學(xué)實 驗 報 告學(xué)生姓名:郫縣LBJ 學(xué)號:66 指導(dǎo)教師:溫柔可愛的劉杰彥實驗地點:主樓A2-413 實驗時間:2017年4月22日上午1、 實驗室名稱:計算機學(xué)院主樓機房2、 實驗項目名稱:進(jìn)程與資源管理實驗分工:郫縣LBJ 進(jìn)程管理設(shè)計 郫縣小胖子 資源管理設(shè)計 郫縣威斯布魯克 進(jìn)程調(diào)度與時鐘中斷設(shè)計3、 實驗學(xué)時:24、 實驗原理: 此處的實驗原理在指導(dǎo)書上非常豐富,因此不照搬過來,主要寫出所要使用到知識點,具體實現(xiàn)過程中的原理分析見報告第八部分“實驗步驟”處。(一) 總體設(shè)計系統(tǒng)總體架構(gòu)如圖1所示,最右邊部分為進(jìn)程與資源管理器,屬于操作系

2、統(tǒng)內(nèi)核的功能。要求能夠設(shè)計與實現(xiàn)一個簡單的進(jìn)程與資源管理器,具有如下功能:完成進(jìn)程創(chuàng)建、撤銷和進(jìn)程調(diào)度;完成多單元 (multi_unit)資源的管理;完成資源的申請和釋放;完成錯誤檢測和定時器中斷功能。圖1 系統(tǒng)總體結(jié)構(gòu)(二) Test shell設(shè)計應(yīng)具有的功能:1、從終端或者測試文件讀取命令;2、將用戶需求轉(zhuǎn)換成調(diào)度內(nèi)核函數(shù)(即調(diào)度進(jìn)程和資源管理器);3、在終端或輸出文件中顯示結(jié)果:如當(dāng)前運行的進(jìn)程、錯誤信息等。(三) 進(jìn)程管理設(shè)計1、進(jìn)程狀態(tài)與操作2、進(jìn)程控制塊結(jié)構(gòu)PCB3、主要函數(shù):創(chuàng)建進(jìn)程、撤銷進(jìn)程(四) 資源管理設(shè)計1、主要數(shù)據(jù)結(jié)構(gòu)RCB2、請求資源3、釋放資源(五)進(jìn)程調(diào)度與時

3、鐘中斷設(shè)計關(guān)鍵:使用基于優(yōu)先級的搶占式調(diào)度策略,在同一優(yōu)先級內(nèi)使用時間片輪轉(zhuǎn)算法。參考課上ppt: 5、 實驗?zāi)康模涸O(shè)計和實現(xiàn)進(jìn)程與資源管理,并完成Test shell的編寫,以建立系統(tǒng)的進(jìn)程管理、調(diào)度、資源管理和分配的知識體系,從而加深對操作系統(tǒng)進(jìn)程調(diào)度和資源管理功能的宏觀理解和微觀實現(xiàn)技術(shù)的掌握。6、 實驗內(nèi)容:設(shè)計與實現(xiàn)一個簡單的進(jìn)程與資源管理器,要求具有如下功能:完成進(jìn)程創(chuàng)建、撤銷和進(jìn)程調(diào)度;完成多單元 (multi_unit)資源的管理;完成資源的申請和釋放;完成錯誤檢測和定時器中斷功能。通過編寫測試腳本(test shell)來完成對進(jìn)程與資源管理器的測試。7、 實驗環(huán)境(設(shè)備、元

4、器件):Windows 7、Visual Studio 20158、 實驗步驟:(一) 系統(tǒng)功能需求分析:(二) 總體框架設(shè)計:1、 具體原理和總體工作流程分析:首先,通過test shell從測試文件中讀入各種命令。然后,對命令進(jìn)行分析,將用戶的需求轉(zhuǎn)換成調(diào)度內(nèi)核函數(shù),也就是說,通過調(diào)度進(jìn)程和資源管理器,實現(xiàn)創(chuàng)建進(jìn)程、撤銷進(jìn)程、進(jìn)程調(diào)度、對資源進(jìn)行管理、申請和釋放資源、檢測錯誤和定時器中斷等功能,從而模擬一個操作系統(tǒng)對進(jìn)程進(jìn)行調(diào)度和對資源進(jìn)行管理的過程。最后,在終端或者輸出文件中,把一系列操作后的結(jié)果顯示出來,包括當(dāng)前運行的進(jìn)程、錯誤信息等。2、 相關(guān)方法和算法:(1) C語言中的結(jié)構(gòu)str

5、uct,用來實現(xiàn)PCB、RCB等(2) C語言中的指針、鏈表操作,用來實現(xiàn)將PCB和RCB加入隊列尾部、從隊列中刪除、轉(zhuǎn)移至阻塞隊列等操作,以及進(jìn)程的調(diào)度執(zhí)行等。本實驗中我們采用的帶頭結(jié)點的鏈表來實現(xiàn)各種操作。(3) 基于優(yōu)先級的調(diào)度算法、時間片輪轉(zhuǎn)調(diào)度算法、搶占式調(diào)度算法的綜合應(yīng)用。3、 模塊調(diào)用關(guān)系:本實驗中,我們組共編寫了三個頭文件(pcb.h、rcb.h、test_shell_data.h)和四個源文件(main.c、pcb.c、rcb.c、test_shell_data.c),因此可以分為主函數(shù)設(shè)計模塊、進(jìn)程管理設(shè)計模塊、資源管理設(shè)計模塊和test shell設(shè)計模塊。在主函數(shù)模塊中

6、,需要調(diào)用其他三個模塊,如創(chuàng)建進(jìn)程、展示父子子進(jìn)程等操作,需要調(diào)用進(jìn)程管理設(shè)計模塊;調(diào)度算法的執(zhí)行、展示各種隊列等,需要調(diào)用test shell設(shè)計模塊;在進(jìn)程管理設(shè)計模塊中,像銷毀PCB等操作,需要執(zhí)行對RCB的釋放,則需調(diào)用test shell設(shè)計模塊;在資源管理設(shè)計模塊中,提供一些最小的操作,不調(diào)用其他模塊;在test shell設(shè)計模塊中,設(shè)計到對資源和進(jìn)程的各種操作,需要調(diào)用資源管理設(shè)計模塊和進(jìn)程管理設(shè)計模塊。(三) 進(jìn)程管理設(shè)計模塊詳細(xì)設(shè)計(本部分我負(fù)責(zé)實現(xiàn))我們的計劃是在在進(jìn)程管理設(shè)計模塊中,實現(xiàn)關(guān)于進(jìn)程的各種最基礎(chǔ)的結(jié)構(gòu)和操作,具體包括:實現(xiàn)PCB結(jié)構(gòu)體、PCB鏈表、PCB子節(jié)

7、點鏈表;實現(xiàn)對PCB鏈表的初始化、對子節(jié)點鏈表的初始化、新建PCB、對PCB鏈表中進(jìn)行刪除、插入、移除(不free)、從等待和阻塞隊列中獲取PCB得知、打印當(dāng)前PCB父節(jié)點、打印當(dāng)前PCB父節(jié)點、打印當(dāng)前PCB子節(jié)點鏈表、插入子隊列的尾部、從子隊列尾部刪除。1、 進(jìn)程狀態(tài)與操作(1) 進(jìn)程狀態(tài)共ready/running/blocked三種狀態(tài),通過結(jié)構(gòu)struct實現(xiàn),代碼如下:struct int running; int blocked; int ready;PCB_STATUS; /定義pcb狀態(tài)的三種情況(2) 進(jìn)程操作:在本次實驗中,將會讀進(jìn)程進(jìn)行以下操作,結(jié)合這些操作的具體內(nèi)容和

8、所學(xué)知識,很容易考慮到通過鏈表來實現(xiàn)這些操作。創(chuàng)建(create): (none) -> ready撤銷(destroy): running/ready/blocked -> (none)請求資源(Request): running -> blocked (當(dāng)資源沒有時,進(jìn)程阻塞)釋放資源(Release): blocked -> ready (因申請資源而阻塞的進(jìn)程被喚醒)時鐘中斷(Time_out): running -> ready調(diào)度:ready -> running / running ->ready2、 主要數(shù)據(jù)結(jié)構(gòu)實現(xiàn):(1)進(jìn)程控制塊結(jié)

9、構(gòu)PCB進(jìn)程控制塊PCB是進(jìn)程存在的唯一標(biāo)識,并且常駐內(nèi)存,進(jìn)程控制塊中有許多信息,在本次實驗中,根據(jù)我們的需求,所設(shè)計的進(jìn)程控制塊結(jié)構(gòu)如下:結(jié)合實驗指導(dǎo)書,我們通過結(jié)構(gòu)struct實現(xiàn)進(jìn)程控制塊結(jié)構(gòu)PCB,包含以下信息:PID(name)Other_resources /: resource which is occupiedStatus: Type & List/ type: ready, block, running., /List: RL(Ready list) or BL(block list)Creation_tree: Parent/ChildrenPriority: 0

10、, 1, 2 (Init, User, System)主要代碼及注釋如下:struct PCB /pcb結(jié)構(gòu)體 char name64; /Pname unsigned int pid; /Pid struct RCB_LIST* rcb_list; /Other resources struct PCB_LIST* parent_pcb; /父進(jìn)程 struct CHILD_PCB_LIST* child_pcb; /子進(jìn)程 int state; /Type&List int priority; /0,1,2;(3) 實現(xiàn)一個PCB的鏈表,方便后面的操作:struct PCB_LIS

11、T /pcb鏈表 struct PCB pcb; struct PCB_LIST * next_pcb;(4) 實現(xiàn)PCB的子節(jié)點鏈表:struct CHILD_PCB_LIST /pcb子節(jié)點鏈表 struct PCB_LIST* node; struct CHILD_PCB_LIST* next_node;3、 主要操作設(shè)計實現(xiàn)過程(1) 初始化PCB鏈表(添加了頭結(jié)點):void init_pcb_list(struct PCB_LIST *list) if (*list) return; struct PCB_LIST *p = (struct PCB_LIST*)malloc(siz

12、eof(struct PCB_LIST); p->next_pcb = NULL; memset(p, NULL, sizeof(struct PCB); *list = p;(2) 初始化子節(jié)點鏈表:void init_child_pcb_list(struct CHILD_PCB_LIST *list) if (*list) return; struct CHILD_PCB_LIST *p = (struct CHILD_PCB_LIST*)malloc(sizeof(struct CHILD_PCB_LIST); p->next_node = NULL; memset(p,

13、NULL, sizeof(struct CHILD_PCB_LIST); *list = p;(3) 創(chuàng)建一個新的PCB:struct PCB_LIST* create_pcb(char* name, unsigned int pid, int state, unsigned int priority,struct PCB_LIST* parent_pcb) struct PCB pcb; strcpy(,name,strlen(name); pcb.pid = pid; pcb.rcb_list = NULL; pcb.state = state; pcb.priority

14、= priority; pcb.parent_pcb = parent_pcb; pcb.child_pcb = NULL; struct PCB_LIST* pcb_node = (struct PCB_LIST*)malloc(sizeof(struct PCB_LIST); pcb_node->pcb = pcb; pcb_node->next_pcb = NULL; return pcb_node;(4) 從PCB鏈表中進(jìn)行刪除:void destory_from_pcb_list(struct PCB_LIST* list, char *name) struct PCB_

15、LIST* pr_temp, *temp; pr_temp = temp = list; int ret = 1; while (temp) if (!strcmp(name, temp->) && ret) release_resource(temp); pr_temp = temp = list; ret = 0; if (!strcmp(name, temp->) pr_temp->next_pcb = temp->next_pcb; free(temp); return; pr_temp = temp; temp

16、= temp->next_pcb; (5)插入pcb鏈表:void insert_into_pcb_list(struct PCB_LIST* list, struct PCB_LIST*node) if (!*list) init_pcb_list(list); struct PCB_LIST *pr_temp, *temp; pr_temp = temp = *list; while (temp) pr_temp = temp; temp = temp->next_pcb; pr_temp->next_pcb = node;(5) 從PCB鏈表中移除,并不釋放該PCB占用

17、的空間:void delete_from_pcb_list(struct PCB_LIST* list, char *name) struct PCB_LIST* pr_temp, *temp; pr_temp = temp = list; while (temp) if (!strcmp(name, temp->) pr_temp->next_pcb = temp->next_pcb; return; pr_temp = temp; temp = temp->next_pcb; (6) 從等待和阻塞隊列中獲取PCB的地址:struct PCB_LIST

18、* get_pcb(char* name) struct PCB_LIST* temp; for (int i = 2; i >= 0; i-) temp = READY_LISTi->next_pcb; while (temp) if (!strcmp(temp->, name) return temp; temp = temp->next_pcb; if (BLOCKED_LIST) temp = BLOCKED_LIST->next_pcb; while (temp) if (!strcmp(temp->, name)

19、return temp; temp = temp->next_pcb; return NULL;(7) 打印當(dāng)前PCB的父節(jié)點void show_pcb_parent(struct PCB_LIST* node) printf("%s parent node is %s n", node->, node->pcb.parent_pcb->);(8) 打印當(dāng)前PCB的子節(jié)點鏈表void show_pcb_child(struct PCB_LIST* node) printf("%s child is "

20、;, node->); struct CHILD_PCB_LIST* temp = node->pcb.child_pcb; if (temp) temp = temp->next_node; while (temp) printf(" -> |%s|", temp->node->); temp = temp->next_node; printf("n");(9) 插入子隊列的尾部void insert_into_child_pcb_list(struct CHILD_PCB_LI

21、ST* list, struct PCB_LIST*node) if (!*list) init_child_pcb_list(list); struct CHILD_PCB_LIST *pr_temp, *temp; pr_temp = temp = *list; while (temp) pr_temp = temp; temp = temp->next_node; struct CHILD_PCB_LIST *p = (struct CHILD_PCB_LIST*)malloc(sizeof(struct CHILD_PCB_LIST); p->node = node; p-

22、>next_node = NULL; pr_temp->next_node = p;(10) 從子隊列尾部進(jìn)行刪除void delete_from_child_pcb_list(struct CHILD_PCB_LIST* list, char *name) struct CHILD_PCB_LIST* pr_temp, *temp; if (!list) return; pr_temp = list; temp = pr_temp->next_node; while (temp) if (!strcmp(name, temp->node->) p

23、r_temp->next_node = temp->next_node; return; pr_temp = temp; temp = temp->next_node; (四) 其他模塊設(shè)計(組內(nèi)其他人設(shè)計)1、 Test shell設(shè)計Test shell將調(diào)度我們設(shè)計的進(jìn)程與資源管理器,從而完成測試,具有以下功能:(1)從終端或者測試文件讀取命令;(2)將用戶需求轉(zhuǎn)換成調(diào)度內(nèi)核函數(shù)(即調(diào)度進(jìn)程和資源管理器);(3)在終端或輸出文件中顯示結(jié)果:如當(dāng)前運行的進(jìn)程、錯誤信息等。2、 資源管理設(shè)計與進(jìn)程管理設(shè)計的思路和流程相似,首先是設(shè)計好各類數(shù)據(jù)結(jié)構(gòu),包括RCB結(jié)構(gòu)體、RCB等

24、待隊列鏈表、系統(tǒng)RCB結(jié)構(gòu)體、系統(tǒng)RCB鏈表、RCB鏈表。之后是實現(xiàn)好各類與RCB有關(guān)的基礎(chǔ)操作,包括初始化前面設(shè)計的各種鏈表、新建RCB,以及對鏈表進(jìn)行插入、刪除、移除等操作,還有顯示RCB隊列的操作。3、 實驗進(jìn)程調(diào)度與時鐘中斷設(shè)計核心思想即時間片輪轉(zhuǎn)調(diào)度算法、優(yōu)先級調(diào)度算法、搶占式算法的綜合應(yīng)用,設(shè)計到對前面各模塊的調(diào)用。9、 實驗數(shù)據(jù)及結(jié)果分析:將實驗指導(dǎo)書中給出的測試命令放到測試文件test.txt中,程序從該文件讀取命令,并將執(zhí)行結(jié)果輸出到屏幕,如下圖所示:上圖結(jié)果與試驗指導(dǎo)書中給出的預(yù)期輸出結(jié)果是一致的,說明實驗成功。具體的結(jié)果分析:為了更易于觀察,我們可以注釋掉讀文件的操作,讓

25、程序從鍵盤輸入讀取命令,每步命令的解釋及相關(guān)執(zhí)行結(jié)果截圖如下:cr x 1 /創(chuàng)建優(yōu)先級為1的進(jìn)程x,應(yīng)顯示“* the x is running”cr p 1 /創(chuàng)建優(yōu)先級為1的進(jìn)程p,應(yīng)顯示“* the x is running”cr q 1 /創(chuàng)建優(yōu)先級為1的進(jìn)程q,應(yīng)顯示“* the x is running”cr r 1 /創(chuàng)建優(yōu)先級為1的進(jìn)程r,應(yīng)顯示“* the x is running”經(jīng)過以上四條指令,就緒隊列中優(yōu)先級1的隊列中應(yīng)依次為x、p、q、r,可用資源數(shù)應(yīng)該都是總的資源數(shù),執(zhí)行結(jié)果、就緒隊列、資源隊列情況見下圖:to /一個時間片結(jié)束,應(yīng)去執(zhí)行p,顯示“* the p

26、 is running”同時,x進(jìn)程PCB將進(jìn)入優(yōu)先級為0的就緒隊列,如下圖:req 2 1 /為當(dāng)前進(jìn)程x申請1個R2資源,顯示不變輸出顯示不變,但是可用資源數(shù)目會發(fā)生變化,如下圖:to /一個時間片結(jié)束,應(yīng)去執(zhí)行q,顯示“* the q is running”req R3 3 /為當(dāng)前進(jìn)程q申請3個R3資源,顯示不變過程中截圖如下,可用資源數(shù)目進(jìn)一步減?。?to /一個時間片結(jié)束,應(yīng)去執(zhí)行r,顯示“* the r is running”req R4 3 /為當(dāng)前進(jìn)程x申請3個R4資源,顯示不變to /一個時間片結(jié)束,應(yīng)去執(zhí)行優(yōu)先級為0的就緒隊列中的第一個進(jìn)程x,顯示“* the x is

27、running”to指令后截圖如下,包括此時就緒隊列的情況,所有進(jìn)程的PCB都在優(yōu)先級為0的就緒隊列中:to /一個時間片結(jié)束,應(yīng)去執(zhí)行p,顯示“* the p is running”,x移到優(yōu)先級0就緒隊列的結(jié)尾新的優(yōu)先級為0的就緒隊列截圖如下:下面的兩條指令分別為當(dāng)前進(jìn)程申請資源,申請不到足夠的資源,相應(yīng)進(jìn)程則會進(jìn)入阻塞隊列。req R3 1 /p申請1個R3,但R3已經(jīng)全部給了q,因此p被阻塞,進(jìn)入阻塞隊列,當(dāng)前轉(zhuǎn)去執(zhí)行原來在p后的q進(jìn)程,顯示“* the q is running”顯示及阻塞隊列如下: req R4 2 /q申請2個R4,但R4已經(jīng)只剩下1個,因此q被阻塞,進(jìn)入阻塞隊列

28、,當(dāng)前轉(zhuǎn)去執(zhí)行原來在q后的r進(jìn)程,顯示“* the r is running”req R2 2 /r申請2個R2,但R2已經(jīng)只剩下1個,因此r被阻塞,進(jìn)入阻塞隊列,當(dāng)前轉(zhuǎn)去執(zhí)行原來在r后的x進(jìn)程,顯示“* the x is running”以上兩步過后,阻塞隊列及就緒隊列截圖如下:to /一個時間片結(jié)束,就緒隊列中只有x,因此仍然執(zhí)行x,顯示“* the x is running” de q /撤銷q進(jìn)程,將釋放q進(jìn)程占用的3個R3資源,前面因為申請不到R3資源而被阻塞的p進(jìn)程將重新回到就緒隊列,位于x的后面,顯示不變to /一個時間片結(jié)束,應(yīng)去執(zhí)行p,顯示“* the p is runnin

29、g”to /一個時間片結(jié)束,應(yīng)去執(zhí)行x,顯示“* the x is running”經(jīng)過以上四條指令,就緒隊列中優(yōu)先級0的隊列中應(yīng)依次為x、p,阻塞隊列中應(yīng)該只有r,如下圖: 至此,詳細(xì)的每步分析完畢,實驗成功。10、 實驗結(jié)論:本次實驗過程中,我組成員分工明確,在熟練掌握課堂知識的基礎(chǔ)上,使用c語言模擬了操作系統(tǒng)對進(jìn)程和資源的管理,成功地實現(xiàn)了基于優(yōu)先級和時間片輪轉(zhuǎn)的搶占式調(diào)度算法,實驗結(jié)果與預(yù)期相同,很好地完成了本次實驗11、 總結(jié)及心得體會:(1) 鏈表、指針的掌握和應(yīng)用十分重要;(2) 將總的任務(wù)劃分成各個模塊,實現(xiàn)各個模塊后再總體實現(xiàn),可以提高效率;(3) 在程序中增加一些出錯處理的

30、提示信息,有利于提高調(diào)試過程的效率。12、 對本實驗過程及方法、手段的改進(jìn)建議:可以增加難度更大的功能,如模擬進(jìn)程中斷后,返回斷點繼續(xù)執(zhí)行等。 報告評分: 指導(dǎo)教師簽字:電 子 科 技 大 學(xué)實 驗 報 告學(xué)生姓名:郫縣LBJ 學(xué)號:66 指導(dǎo)教師:溫柔可愛的劉杰彥實驗地點:主樓A2-413 實驗時間:2017年6月2日一、 實驗室名稱:計算機學(xué)院主樓機房二、 實驗項目名稱:內(nèi)存地址轉(zhuǎn)化實驗三、 實驗學(xué)時:2四、 實驗原理:(一) 邏輯地址到線性地址的轉(zhuǎn)換1、 邏輯地址、段標(biāo)識符、索引號、GDT、LDT、T1字段、段描述符、Base字段、線性地址等概念;2、 GDTR、LDTR等相關(guān)寄存器知識

31、;(以上兩條在實驗指導(dǎo)書中很詳細(xì),篇幅較長,不做粘貼了)3、 邏輯地址到線性地址的轉(zhuǎn)換過程從邏輯地址到線性地址的轉(zhuǎn)換過程,如下圖所示(以T1=1為例,此時從段選擇符中分離出段描述符和T1字段,T1=1,表明段描述符存放在LDT中);(1)從GDTR中獲得GDT的地址,從LDTR中獲得LDT在GDT中的偏移量,查找GDT,從中獲取LDT的起始地址;(2)從DS中的高13位獲取DS段在LDT中索引位置,查找LDT,獲取DS段的段描述符,從而獲取DS段的基地址;(3)根據(jù)DS段的基地址段內(nèi)偏移量,獲取所需單元的線性地址。、(二) 線性地址到物理地址的轉(zhuǎn)換1、 物理地址的概念;(不做粘貼了)2、 將線

32、性地址轉(zhuǎn)換成物理地址的步驟:(1)、因為頁目錄表的地址放在CPU的cr3寄存器中,因此首先從cr3中取出進(jìn)程的頁目錄表地址(操作系統(tǒng)負(fù)責(zé)在調(diào)度進(jìn)程的時候,已經(jīng)把這個地址裝入對應(yīng)寄存器);(2)、根據(jù)線性地址前十位,在頁目錄表中,找到對應(yīng)的索引項,因為引入了二級管理模式,頁目錄中的項,不是頁的地址,而是一個頁表的起始地址。(3)、查找頁表,根據(jù)線性地址的中間十位,在頁表中找到數(shù)據(jù)頁的起始地址;(4)、將頁的起始地址與頁內(nèi)偏移量(即線性地址中最后12位)相加,得到最終我們想要的物理地址;五、 實驗?zāi)康模海?)掌握計算機的尋址過程(2)掌握頁式地址地址轉(zhuǎn)換過程(3)掌握計算機各種寄存器的用法六、 實

33、驗內(nèi)容:本實驗運行一個設(shè)置了全局變量的循環(huán)程序,通過查看段寄存器,LDT表,GDT表等信息,經(jīng)過一系列段、頁地址轉(zhuǎn)換,找到程序中該全局變量的物理地址。七、 實驗器材(設(shè)備、元器件):計算機、Linux內(nèi)核(0.11)+Bochs虛擬機八、 實驗步驟:1、 點擊bochs.exe安裝bochs。2、 拷貝bootimage-0.11-hd、diska.img、hdc-0.11-new.img、mybochsrc-hd.bxrc至安裝目錄。3、 在安裝目錄中找到bochsdbg.exe程序,并運行。4、 在彈出的界面中,點擊“Load”加載配置文件“mybochsrc-hd.bxrc”。隨后,點擊

34、“Start”啟動Bochs虛擬機。 5、 虛擬機啟動后,出現(xiàn)兩個窗口,一個為Bochs控制窗口(Console),另一個為Linux操作系統(tǒng)運行窗口(主顯示窗口Display)。6、 在控制窗口輸入“c”后回車,加載Linux操作系統(tǒng)。 7、 在Linux操作系統(tǒng)中,使用vi工具編寫mytest2.c源文件。隨后執(zhí)行“gcc -o mytest2 mytest2.c”命令編譯并生成“mytest2”可執(zhí)行文件。實驗中所使用的C語言代碼如下:#include <stdio.h>int j = 0x;int main() printf("the address of j i

35、s 0x%xn", &j); while(j); printf("program terminated normally!n"); return 0;8、 在Linux操作系統(tǒng)中,運行“./mytest2”可執(zhí)行文件,結(jié)果如下:由此可以看出,在“while(j)”處進(jìn)入死循環(huán),程序的第二條輸出語句不會被執(zhí)行。9、 先關(guān)閉bochs和虛擬機,再右鍵mybochsrc-hd.bxrc,選擇debugger,點擊start,在console界面輸入c后回車,在display界面中再次輸入./mytest2,運行之前寫好分程序,再回到console界面進(jìn)行Ctrl

36、+c操作: 10、 在控制窗口中輸入sreg命令,查看段的具體信息。根據(jù)ds段的信息是可以確定索引號為標(biāo)藍(lán)的13位,即索引號為02H,TI為標(biāo)紅的1位,對應(yīng)TI=1,因此可知段描述符放在LDT中,并且為LDT表的第三項。0x0017=0000 0000 0001 0111B11、 查看LDTR寄存器,其中存放了LDT在GDT的位置,可知索引號為標(biāo)藍(lán)的13位,即索引為0DH,表示LDT起始地址存放在GDT的第14項。0x0068=0000 0000 0110 1000B12、 查看GDTR寄存器,其中存放了GDT在內(nèi)存中的起始地址5CB8H:13、 由上圖可知,GDT在內(nèi)存中的起始地址為5CB8H,因為每一個段描述符由8個字節(jié)組成,則LDT的首地址為:(GDTR)+0x0D*8 = 0x5CB8 + 0x0D*8 = 0x5D20執(zhí)行xp /2w 0x5cb8+0x0d*

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論