操作系統(tǒng)的啟動_第1頁
操作系統(tǒng)的啟動_第2頁
操作系統(tǒng)的啟動_第3頁
操作系統(tǒng)的啟動_第4頁
操作系統(tǒng)的啟動_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精品文檔你我共享實驗2操作系統(tǒng)的啟動實驗性質(zhì):驗證建議學(xué)時:2學(xué)時一、 實驗?zāi)康母櫿{(diào)試EOS在PC機上從加電復(fù)位到成功啟動的全過程,了解操作系統(tǒng)的啟動過程。查看EOSB動后的狀態(tài)和行為,理解操作系統(tǒng)啟動后的工作方式。二、 預(yù)備知識閱讀本書第3章,了解E0礫作系統(tǒng)的啟動過程。閱讀第2章中的第2.4節(jié),復(fù)習(xí)匯編語言的相關(guān)知識,并掌握NASMC編代碼的特點。閱讀附錄A, 了解Bochs和Virtual PC 這兩款虛擬機軟件的特點,重點熟悉 Bochs的調(diào)試命令。三、 實驗內(nèi)容3.1準(zhǔn)備實驗1. 啟動 OS Lab。2.新建一個EOS Kernel項目。3.在項目管理器” 窗口中打開boot文件夾

2、中的boot.asm和loader.asm兩個匯編文件。boot.asm是軟盤引導(dǎo)扇區(qū)程序的源文件,loader.asm是loader程序的源文件。簡單閱讀一下這兩個文件中的NASMC編代碼和注釋。4.按F7生成項目。5.生成完成后,使用Windows資源管理器打開項目文件夾中的Debug文件夾。找到由boot.asm生成的軟盤引導(dǎo)扇區(qū)程序boot.bin文件,該文件的大小一定為 512字節(jié)(與軟盤引導(dǎo)扇區(qū)的大小一致)。找到由 loader.asm生成的loader程序loader.bin 文件,記錄下此文件的大小1566字節(jié),在下面的實驗中會用到。 找到由其它源文件生成的操作系統(tǒng)內(nèi)核文件ke

3、rnel.dll 。3.2調(diào)試E0操作系統(tǒng)的啟動過程3.2.1使用Bochs做為遠(yuǎn)程目標(biāo)機按照下面的步驟將調(diào)試時使用的遠(yuǎn)程目標(biāo)機修改為Bochs:1. 在“項目管理器”窗口中,右鍵點擊項目節(jié)點,在彈出的快捷菜單中選擇“屬性”。2.在彈出的“屬性頁”對話框右側(cè)的屬性列表中找到“遠(yuǎn)程目標(biāo)機”屬性,將此屬性值修改為“BochsDebug”(此時按F1可以獲得關(guān)于此屬性的幫助)。3. 點擊“確定”按鈕關(guān)閉“屬性頁”對話框。接下來就可以使用Bochs模擬器調(diào)試BIOS程序和軟盤引導(dǎo) 扇區(qū)程序了。3.2.2調(diào)試 BIOS程序精品文檔你我共享按F5啟動調(diào)試,此時會彈出兩個Bochs窗口。標(biāo)題為“ Bochs

4、 for windows - Display”的窗口相當(dāng)于計AAAAAA精品文檔你我共享AAAAAAdl=0 x0000Ffff, dl=0 x0000Fff, dl-0 x0000Fff,ualid =7 ualid =7 ualid =7 ualid =7 ualid =7KbocJis:2 rrax: 0 x00000080:00000000 rex: rdx: 0 x00000000:00080F20 rbx: rsp: 0 x00000000:03000003 rbp: is i: Ux00300090:00000000 rdi: i8 : 3x30300030:00000000 r

5、9 : 110: 0 x30300030:08000000 rll: 112 : 0 x30300030:00080000 rl3 : rl4: 0 x00300090:09080000 rlS: pip: 0 x00000000: e F latfs 0 x 00000002Id uip vif ac vn nt IOPL=Q 0 x000000000 x000000000 x000000000 x000000000 x000000000X0000B0B00 x806000000 x0000300000000000000000000000000000000000of df i tf sf a

6、F af算機的顯示器,顯示操作系統(tǒng)的輸出。標(biāo)題為Bochs for windowsConsole ”的窗口是Bochs的控制臺,用來輸入調(diào)試命令,輸出各種調(diào)試信息。啟動調(diào)試后,Bochs在CPI要執(zhí)行的第一條指令(即 BIOS勺第一條指令)處中斷。此時,Display窗口沒有顯示任何內(nèi)容,Con sole窗口顯示要執(zhí)行的BIOS第 一條指令的相關(guān)信息,并等待用戶輸入調(diào)試命令,如圖10-1 :05fffsi= jmp far F0S0:e85h;圖10-1 : Con sole窗口顯示在BIOS第 一條指令處中斷從Console窗口顯示的內(nèi)容中,我們可以獲得關(guān)于BIOS第一條指令的如下信息:行首

7、的OxfffffffO表示此條指令所在的物理地址。fOOO:fffO 表示此條指令所在的邏輯地址(段地址:偏移地址)。jmp far f000:e05b是此條指令的反匯編代碼。行尾的ea5be000f0是此條指令的十六進(jìn)制字節(jié)碼,可以看出此條指令有5個字節(jié)。接下來可以按照下面的步驟,查看CPU在沒有執(zhí)行任何指令之前主要寄存器中的數(shù)據(jù),以及內(nèi)存中的數(shù)據(jù):1.在Console窗口中輸入調(diào)試命令 sreg后按回車,顯示當(dāng)前CPU中各個段寄存器的值,如圖10-2。其中CS寄存器信息行中的“ s=0 xf000 ”表示CS寄存器的值為OxfOOO。bochssregrcs:s=0 xf000, dh=0

8、 xff0093ff, dl=0 x0000fff, ualid=7ds: =0 x0003. ss:S=0X0000, esfsldtr:s=0 xB000r dh=0 x00008200 dl-0 x0S0iaffff, ualid=lt:s=axa6a0rdi-x0000fFff, vaiid-iydtr: base -=8x00000800. limit =BxffFf idtr=0 x00000800. limit =0 xFfFf圖10-2 :使用sreg命令查看段寄存器的值2.輸入調(diào)試命令r后按回車,顯示當(dāng)前 CPI中各個通用寄存器的值,如圖10-3。其中“ rip:OxOOOO

9、OOOO:OOOOfffO ”表示 IP 寄存器的值為 OxfffO。精品文檔你我共享AAAAAA圖10-3 :使用r命令查看通用寄存器的值精品文檔你我共享AAAAAA3.輸入調(diào)試命令xp /1024b 0 x0000 ,查看開始的1024個字節(jié)的物理內(nèi)存。在 Con sole中輸出的這1K物理 內(nèi)存的值都為0,說明BIOS中斷向量表還沒有被加載到此處。4.輸入調(diào)試命令xp /512b 0 x7c00 ,查看軟盤引導(dǎo)扇區(qū)應(yīng)該被加載到的內(nèi)存位置。輸出的內(nèi)存值都為0,說明軟盤引導(dǎo)扇區(qū)還沒有被加載到此處??梢则炞CBIOS第一條指令所在邏輯地址中的段地址和CS寄存器值是一致的,偏移地址和IP寄存器的值

10、是一致的。由于內(nèi)存還沒有被使用,所以其中的值都為0。3.2.3調(diào)試軟盤引導(dǎo)扇區(qū)程序BIOS在執(zhí)行完自檢和初始化工作后,會將軟盤引導(dǎo)扇區(qū)加載到物理地址0 x7c00-0 x7dff位置,并從0 x7c00處的指令開始執(zhí)行引導(dǎo)程序,所以接下來練習(xí)從0 x7c00處調(diào)試軟盤引導(dǎo)扇區(qū)程序:1.輸入調(diào)試命令vb 0 x0000:0 x7c00,這樣就在邏輯地址 0 x0000:0 x7c00 (相當(dāng)于物理地址0 x7c00 )處添 加了一個斷點。2.輸入調(diào)試命令c繼續(xù)執(zhí)行,在0 x7c00處的斷點中斷。中斷后會在Console窗口中輸出下一個要執(zhí)行的指 令,即軟盤引導(dǎo)扇區(qū)程序的第一條指令,如下(0) 0

11、 x00007c00 0000:7c00 (u nk. ctxt): jmp .+0 x006d (0 x00007c6f) ; eb6d3.為了方便后面的使用, 先在紙上分別記錄下此條指令的字節(jié)碼(eb6d)和此條指令要跳轉(zhuǎn)執(zhí)行的下一條指令的地址(括號中的 0 x00007c6f )。4.輸入調(diào)試命令sreg驗證CS寄存器(0 x0000)的值。5.輸入調(diào)試命令r驗證IP寄存器(0 x7c00)的值。6.由于BIOS程序此時已經(jīng)執(zhí)行完畢,輸入調(diào)試命令xp /1024b 0 x0000驗證此時BIOS中斷向量表已經(jīng)被載入。7.輸入調(diào)試命令xp /512b 0 x7c00顯示軟盤引導(dǎo)扇區(qū)程序的所

12、有字節(jié)碼。觀察此塊內(nèi)存最開始的兩個字節(jié)分別為0 xeb和0 x6d,這和引導(dǎo)程序第一條指令的字節(jié)碼(eb6d)是相同的。此塊內(nèi)存最后的兩個字節(jié)分別為0 x55和0 xaa,表示引導(dǎo)扇區(qū)是激活的,可以用來引導(dǎo)操作系統(tǒng),這兩個字節(jié)是boot.asm中最后一行語句dw 0 xaa55定義的(注意,Intel 80386 CPU 使用little-endian字節(jié)順序,參見附錄 B)。8.輸入調(diào)試命令xp /512b 0 x0600 驗證圖3-2中第一個用戶可用區(qū)域是空白的。9.輸入調(diào)試命令xp /512b 0 x7e00 驗證圖3-2中第二個用戶可用區(qū)域是空白的。10.自己設(shè)計兩個查看內(nèi)存的調(diào)試命令

13、,分別驗證這兩個用戶可用區(qū)域的高地址端也是空白的。11.輸入調(diào)試命令xp /512b 0 xa0000 驗證圖3-2中上位內(nèi)存已經(jīng)被系統(tǒng)占用。12.自己設(shè)計一個查看內(nèi)存的調(diào)試命令,驗證上位內(nèi)存的高地址端已經(jīng)被系統(tǒng)占用。NASM匯編器在將boot.asm生成為boot.bin的同時,會生成一個 boot.lst列表文件,幫助開發(fā)者調(diào)試 boot.asm文件中的匯編代碼。按照下面的步驟查看boot.lst 文件:1.在 項目管理器窗口中,右鍵點擊boot 文件夾中的boot.asm文件。精品文檔你我共享AAAAAA2.在彈出的快捷菜單中選擇打開生成的列表文件”,在源代碼編輯器中就會打開文件 boo

14、t.lst 。3. 將boot.lst文件和boot.asm文件對比可以發(fā)現(xiàn), 此文件包含了 boot.asm文件中所有的匯編代碼, 同時 在代碼的左側(cè)又添加了更多的信息。4.在boot.lst中查找到軟盤引導(dǎo)扇區(qū)程序第一條指令所在的行(第73行)73 00000000 EB6D jmp short Start此行包含的信息有:73是行號。00000000是此條指令相對于程序開始位置的偏移(第一條指令應(yīng)該為0)。EB6D是此條指令的字節(jié)碼,和之前記錄下來的指令字節(jié)碼是一致的。軟盤引導(dǎo)扇區(qū)程序的主要任務(wù)就是將軟盤中的loader.bin 文件加載到物理內(nèi)存的 0 x1000處,然后跳轉(zhuǎn)到load

15、er程序的第一條指令(物理地址0 x1000處的指令)繼續(xù)執(zhí)行l(wèi)oader程序。按照下面的步驟調(diào)試此過程:1.在boot.lst文件中查找到加載完畢loader.bin 文件后要跳轉(zhuǎn)到loader程序中執(zhí)行的指令(第 278行)278 00000181 EA00100000 jmp 0:LOADER_ORG根據(jù)此指令相對于程序開始(0 x7C00)的偏移(0 x0181)可以得到此指令的邏輯地址為0 x0000:7D81。2.輸入調(diào)試命令vb 0 x0000:0 x7d81添加一個斷點。3.輸入調(diào)試命令c繼續(xù)執(zhí)行,到斷點處中斷。在Con sole窗口中顯示(0) 0 x00007d81 000

16、0:7d81 (unk. ctxt): jmp far 0000:1000 ; ea00100000此條指令會跳轉(zhuǎn)到物理內(nèi)存0 x1000處(即Loader程序的第一條指令)繼續(xù)執(zhí)行。4.按照打開boot.lst文件的方法打開loader.lst 文件,并在此文件中查找到loader程序的第一條指令(第33行)33 00000000 E91801 jmp Start5.輸入調(diào)試命令xp /8b 0 x1000 查看內(nèi)存0 x1000處的數(shù)據(jù),驗證此塊內(nèi)存的前三個字節(jié)和loader.lst 文件中的第一條指令的字節(jié)碼是相同的。6.根據(jù)之前記錄的loader.bin 文件的大小,自己設(shè)計一個查看內(nèi)

17、存的調(diào)試命令,查看內(nèi)存中l(wèi)oader程序結(jié)束位置的字節(jié)碼,并與loader.lst 文件中最后指令的字節(jié)碼比較,驗證loader程序被完全加載到了正確的位置。3.2.4調(diào)試加載程序Loader程序的主要任務(wù)是將操作系統(tǒng)內(nèi)核(kernel.dll 文件)加載到內(nèi)存中,然后讓CPU進(jìn)入保護(hù)模式并且啟用分頁機制,最后進(jìn)入操作系統(tǒng)內(nèi)核開始執(zhí)行(跳轉(zhuǎn)到kernel.dll 的入口點執(zhí)行)。按照下面的步驟調(diào)試上述過程:精品文檔你我共享AAAAAA1.在loader.lst 文件中查找到準(zhǔn)備進(jìn)入 E0操作系統(tǒng)內(nèi)核執(zhí)行的指令(第 755行)755 0000014F FF1517010080 call dwor

18、d va_lmageE ntry2.計算此條指令的物理地址要復(fù)雜一些:偏移地址實際上是相對于節(jié)(節(jié)SECTIOI是NASMC編中的概念)開始的。由于在boot.asm程序中只有一個節(jié),所以之前計算的結(jié)果都是正確的,但是在loader.asm程序中有兩個節(jié),并且此條指令是在第二個節(jié)中。下面引用的代碼是loader.lst中第一個節(jié)的最后一條指令(第593行)593 000003C1 C20600 ret 6因為第一個節(jié)中最后一條指令的偏移為0 x03c1,并占用了 3個字節(jié)(字節(jié)碼為C20600),所以可以計算出進(jìn)入內(nèi)核執(zhí)行的指令所在的物理地址為0 x1513( 0 x1000+0 x03c1+

19、0 x3+0 x14f )。3.使用添加物理地址斷點的調(diào)試命令pb 0 x1513添加一個斷點。4.輸入調(diào)試命令c繼續(xù)執(zhí)行,到斷點處中斷。在Con sole窗口中顯示要執(zhí)行的下一條指令(注意,此時的邏輯地址都為虛擬地址):(0) 0 x00001513 0008:0000000080001513 (unk. ctxt): call dword ptr ds:0 x80001117 ;ff1517110080由于這里使用了函數(shù)指針的概念,所以,根據(jù)反匯編指令可以確定內(nèi)核入口點函數(shù)的地址就保存在虛擬地址0 x8000117處的四個字節(jié)中。5.使用查看虛擬內(nèi)存的調(diào)試命令 x /1wx 0 x8000

20、1117查看內(nèi)存中保存的32位函數(shù)入口地址,在 Console窗口中會輸出類似下面的內(nèi)容:0 x0000000080001117 : 0 x800*記錄下此塊內(nèi)存中保存的函數(shù)地址,后面的實驗會驗證內(nèi)核入口點函數(shù)的地址與此地址是一致的。3.2.5調(diào)試內(nèi)核調(diào)試內(nèi)核的步驟如下:1.在OS Lab的項目管理器窗口中打開ke文件夾中的start.c文件,此文件中只定義了一個函數(shù),就是操作系統(tǒng)內(nèi)核的入口點函數(shù)KiSystemStartup 。2.在KiSystemStartup函數(shù)中的代碼行(第61行)KiI nitializePic();添加一個斷點。3.現(xiàn)在可以在Con sole窗口中輸入調(diào)試命令c繼

21、續(xù)調(diào)試,在剛剛添加的斷點處中斷。4.在start.c源代碼文件中的KiSystemStartup函數(shù)名上點擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇添加監(jiān)視”,KiSystemStartup函數(shù)就被添加到了監(jiān)視”窗口中。在 監(jiān)視”窗口中可以看到此函數(shù)地址為void (PVOID) 0 x800* 精品文檔你我共享AAAAAA與在虛擬內(nèi)存x80001117處保存的函數(shù)入口地址相同,說明的確是由Loader程序進(jìn)入了操作系統(tǒng)內(nèi)核。5.按F5繼續(xù)執(zhí)行EOS操作系統(tǒng)內(nèi)核,在Display窗口中顯示EO操作系統(tǒng)已經(jīng)啟動,并且控制臺程序已經(jīng) 開始運行了。3.2.6 EOS啟動后的狀態(tài)和行為查看EOS勺版本號:1.

22、在控制臺中輸入命令 ver ”后按回車。精品文檔你我共享AAAAAA2.輸出EOS版本后的控制臺如圖10-4所示。圖10-4 :使用ver命令查看EOS勺版本號。 查看E0啟動后的進(jìn)程和線程的信息:1.在控制臺中輸入命令 pt ”后按回車。2.輸出的進(jìn)程和線程信息如圖10-5所示。昭FC -PC 2007Action di t 匸D l&ppyCONSOLE-1 (Press Ctri + FlF8 to suitch console 弊indou.) )Lfe 1 cone to EOS shel 1uerTe vat ion EOS (Version llunber 1.01ptProce

23、ss List (1 Process) .EX.WXWID * Systen? : Priority 3 ThreadCount 1 FrinaryThread ID !1VZ4102MxAi11 a| JlFCaUID t Systen?:JU 1 S L l JLUPriorityliirCclOl J K E K ! State :iHtParent Proces sID StartAddressP0Ready19x900181?C2QY24Ualting1QxSOO1SE3A2124Running1Ox80OlB26DZZ24Uaiting1Gx8001826DZ3YZ4Uaiting

24、10X8OO18Z6DZ1Y21Halting10 x8001826DZ5YZ1Ua iting10 x80018260z&24Uniting10 x80018260Z7Z4Walting10 x80018Z6D2824Uaiting10 x80018Z6D圖10-5 :使用pt命令查看進(jìn)程和線程的信息。有必要對圖10-5中顯示的進(jìn)程和線程信息進(jìn)行一下詳細(xì)的說明。在進(jìn)程列表中只有一個ID為1的系統(tǒng)進(jìn)程,其優(yōu)先級為24,包含有10個線程,其中的ID為2的線程是該進(jìn)程的主線程,系統(tǒng)進(jìn)程沒有映像名稱。在線 程列表中有10個線程,它們都是系統(tǒng)線程。其中優(yōu)先級為0的是空閑線程,當(dāng)沒有優(yōu)先級大于0的線程占

25、用處理器時,空閑線程就會在處理器上運行并處于運行狀態(tài)( Running ),否則就處于就緒狀態(tài)(Ready)。ID為 20的線程是控制臺派遣線程,用于將鍵盤事件派遣到活動的控制臺線程,所以在沒有鍵盤事件發(fā)生的時間里,該線程都處于阻塞狀態(tài)( Waiting )。余下的八個線程都是控制臺線程,分別對應(yīng)于八個控制臺,由于它們執(zhí)行的是同一個控制臺線程函數(shù)(ke/sysproc.c文件中的KiShellThread函數(shù)),所以它們開始執(zhí)行的地址都是相同的。控制臺線程只有在處理控制臺命令的時候才會處于運行狀態(tài),其它時間它們都在等待控制臺命令的 精品文檔你我共享AAAAAA輸入,會處于阻塞狀態(tài)。由于本次是在

26、控制臺1中執(zhí)行的pt命令,所以控制臺1對應(yīng)的線程處于運行狀態(tài),而其它的七個控制臺線程都處于阻塞狀態(tài)。讀者可以嘗試按Ctrl+F8切換到控制臺8,然后執(zhí)行pt命令并查看執(zhí)行的效果。查看有應(yīng)用程序運行時進(jìn)程和線程的信息:1.在OS Lab中選擇 調(diào)試”菜單中的 停止調(diào)試”結(jié)束之前的調(diào)試。2.在OS Lab項目管理器窗口中雙擊Floppy.img文件,使用FloppylmageEditor工具打開此軟盤鏡像文 件。3.打開配套資源 學(xué)生包”在其中找到本實驗對應(yīng)的文件夾。可以在本書前言部分找到學(xué)生包”的下載地址。4.將本實驗文件夾中的 Hello.exe文件拖動到FloppyImageEditor工具

27、窗口的文件列表中釋放,Hello.exe文件即被添加到軟盤鏡像文件中。Hello.exe 個E0磁用程序,其源代碼可以參見本實驗文件夾中的Hello.c源文件。5.在FloppyImageEditor 中選擇文件菜單中的保存后關(guān)閉FloppyImageEditor 。6.按F5啟動調(diào)試。7.待EOSB動完畢,在E0腔制臺中輸入命令 hello ”后按回車。此時Hello.exe應(yīng)用程序就開始執(zhí)行。8.迅速按Ctrl+F2切換到控制臺2,并輸入命令 pt ”后按回車。輸出的進(jìn)程和線程信息如圖10-6所示。|嶺osL&b FC i erosoftVirtual FC 200T-ipx|Action d.i t Dflcppy HelpICONSOLE-2 (Press Ctrl+FPFB to suitchconsole u) )ndou,* )lUeleone to EOS shell亦1 * Process List(2 Process) “絃廈“住廈“試ID iSystem? I Priority i ThreadCounti PrimaryThread ID ImageNaine12419231H8133a: M

溫馨提示

  • 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

提交評論