實驗 調(diào)試操作系統(tǒng)的啟動.doc_第1頁
實驗 調(diào)試操作系統(tǒng)的啟動.doc_第2頁
實驗 調(diào)試操作系統(tǒng)的啟動.doc_第3頁
實驗 調(diào)試操作系統(tǒng)的啟動.doc_第4頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

操作系統(tǒng)的啟動操作系統(tǒng)的啟動實驗性質(zhì):驗證建議學(xué)時:2學(xué)時一、 實驗?zāi)康膌 跟蹤調(diào)試EOS在PC機(jī)上從加電復(fù)位到成功啟動的全過程,了解操作系統(tǒng)的啟動過程。二、 預(yù)備知識 閱讀EOS實驗指南第三章,了解EOS操作系統(tǒng)的啟動過程。閱讀2.4節(jié),復(fù)習(xí)匯編語言的相關(guān)知識,并掌握NASM匯編代碼的特點。閱讀附錄A,了解Bochs和Virtual PC這兩款虛擬機(jī)軟件的特點,重點熟悉Bochs的調(diào)試命令。三、 實驗內(nèi)容3.1 準(zhǔn)備實驗1. 啟動OS Lab。2. 新建一個EOS Kernel項目。3. 在“項目管理器”窗口中打開boot文件夾中的boot.asm和loader.asm兩個匯編文件。boot.asm是軟盤引導(dǎo)扇區(qū)程序的源文件,loader.asm是loader程序的源文件。簡單閱讀一下這兩個文件中的NASM匯編代碼和注釋。4. 按F7生成項目。5. 生成完成后,使用Windows資源管理器打開項目文件夾中的Debug文件夾。找到由boot.asm生成的軟盤引導(dǎo)扇區(qū)程序boot.bin文件,該文件的大小一定為512字節(jié)(與軟盤引導(dǎo)扇區(qū)的大小一致)。找到由loader.asm生成的loader程序loader.bin文件,記錄下此文件的大小,在下面的實驗中會用到。找到由其它源文件生成的操作系統(tǒng)內(nèi)核文件kernel.dll。3.2 調(diào)試EOS操作系統(tǒng)的啟動過程3.2.1 使用Bochs做為遠(yuǎn)程目標(biāo)機(jī)按照下面的步驟將調(diào)試時使用的遠(yuǎn)程目標(biāo)機(jī)修改為Bochs:1. 在“項目管理器”窗口中,右鍵點擊項目節(jié)點,在彈出的快捷菜單中選擇“屬性”。2. 在彈出的“屬性頁”對話框右側(cè)的屬性列表中找到“遠(yuǎn)程目標(biāo)機(jī)”屬性,將此屬性值修改為“Bochs Debug”(此時按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 for windows - Display”的窗口相當(dāng)于計算機(jī)的顯示器,顯示操作系統(tǒng)的輸出。標(biāo)題為“Bochs for windows - Console”的窗口是Bochs的控制臺,用來輸入調(diào)試命令,輸出各種調(diào)試信息。啟動調(diào)試后,Bochs在CPU要執(zhí)行的第一條指令(即BIOS的第一條指令)處中斷。 此時,Display窗口沒有顯示任何內(nèi)容,Console窗口顯示要執(zhí)行的BIOS第一條指令的相關(guān)信息,并等待用戶輸入調(diào)試命令,如圖1:圖1:Console窗口顯示在BIOS第一條指令處中斷從Console窗口顯示的內(nèi)容中,我們可以獲得關(guān)于BIOS第一條指令的如下信息:l 行首的0xfffffff0表示此條指令所在的物理地址。l f000:fff0表示此條指令所在的邏輯地址(段地址:偏移地址)。l jmp far f000:e05b是此條指令的反匯編代碼。l 行尾的ea5be000f0是此條指令的十六進(jìn)制字節(jié)碼,可以看出此條指令有5個字節(jié)。接下來可以按照下面的步驟查看CPU在沒有執(zhí)行任何指令之前主要寄存器和內(nèi)存中的數(shù)據(jù):1. 在Console窗口中輸入調(diào)試命令sreg后按回車,顯示當(dāng)前CPU中各個段寄存器的值,如圖2。其中CS寄存器信息行中的“s=0xf000”表示CS寄存器的值為0xf000。圖2:使用sreg命令查看段寄存器的值2. 輸入調(diào)試命令r后按回車,顯示當(dāng)前CPU中各個通用寄存器的值,如圖3。其中“rip: 0x00000000:0000fff0”表示IP寄存器的值為0xfff0。圖3:使用r命令查看通用寄存器的值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)該被加載到的內(nèi)存位置。輸出的內(nèi)存值都為0,說明軟盤引導(dǎo)扇區(qū)還沒有被加載到此處。 可以驗證BIOS第一條指令所在邏輯地址中的段地址和CS寄存器值是一致的,偏移地址和IP寄存器的值是一致的。由于內(nèi)存還沒有被使用,所以其中的值都為0。3.2.3 調(diào)試軟盤引導(dǎo)扇區(qū)程序BIOS在執(zhí)行完自檢和初始化工作后,會將軟盤引導(dǎo)扇區(qū)加載到物理地址0x7c00-0x7dff位置,并從0x7c00處的指令開始執(zhí)行引導(dǎo)程序,所以接下來練習(xí)從0x7c00處開始調(diào)試軟盤引導(dǎo)扇區(qū)程序:1. 輸入調(diào)試命令vb 0x0000:0x7c00,這樣就在邏輯地址0x0000:0x7c00(相當(dāng)于物理地址0x7c00)處添加了一個斷點。2. 輸入調(diào)試命令c繼續(xù)執(zhí)行,在0x7c00處的斷點中斷。中斷后會在Console窗口中輸出下一個要執(zhí)行的指令,即軟盤引導(dǎo)扇區(qū)程序的第一條指令(0) 0x00007c00 0000:7c00 (unk. ctxt): jmp .+0x006d (0x00007c6f) ; eb6d3. 為了方便后面的使用,先在紙上分別記錄下此條指令的字節(jié)碼(eb6d)和此條指令要跳轉(zhuǎn)執(zhí)行的下一條指令的地址(括號中的0x00007c6f)。4. 輸入調(diào)試命令sreg驗證CS寄存器(0x0000)的值。5. 輸入調(diào)試命令r驗證IP寄存器(0x7c00)的值。6. 由于BIOS程序此時已經(jīng)執(zhí)行完畢,輸入調(diào)試命令xp /1024b 0x0000驗證此時BIOS中斷向量表已經(jīng)被載入。7. 輸入調(diào)試命令xp /512b 0x7c00顯示軟盤引導(dǎo)扇區(qū)程序的所有字節(jié)碼。觀察此塊內(nèi)存最開始的兩個字節(jié)分別為0xeb和0x6d,這和引導(dǎo)程序第一條指令的字節(jié)碼(eb6d)是相同的。此塊內(nèi)存最后的兩個字節(jié)分別為0x55和0xaa,表示引導(dǎo)扇區(qū)是激活的,可以用來引導(dǎo)操作系統(tǒng),這兩個字節(jié)是boot.asm中最后一行語句dw 0xaa55定義的(注意,Intel 80386 CPU使用little endian字節(jié)順序)。8. 輸入調(diào)試命令xp /512b 0x0600驗證第一個用戶可用區(qū)域是空白的。9. 輸入調(diào)試命令xp /512b 0x7e00驗證第二個用戶可用區(qū)域是空白的。10. 自己設(shè)計兩個查看內(nèi)存的調(diào)試命令,分別驗證這兩個用戶可用區(qū)域的高地址端也是空白的。11. 輸入調(diào)試命令xp /512b 0xa0000驗證上位內(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文件。2. 在彈出的快捷菜單中選擇“打開生成的列表文件”,在源代碼編輯器中就會打開文件boot.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此行包含的信息有:l 73是行號。l 00000000是此條指令相對于程序開始位置的偏移(第一條指令應(yīng)該為0)。l EB6D是此條指令的字節(jié)碼,和之前記錄下來的指令字節(jié)碼是一致的。軟盤引導(dǎo)扇區(qū)程序的主要任務(wù)就是將軟盤中的loader.bin文件加載到物理內(nèi)存的0x1000處,然后跳轉(zhuǎn)到loader程序的第一條指令(物理地址0x1000處的指令)繼續(xù)執(zhí)行l(wèi)oader程序。按照下面的步驟調(diào)試上述過程:1. 在boot.lst文件中查找到加載完畢loader.bin文件后要跳轉(zhuǎn)到loader程序中執(zhí)行的指令(第278行) 278 00000181 EA00100000 jmp0:LOADER_ORG根據(jù)此指令相對于程序開始(0x7C00)的偏移(0x0181)可以得到此指令的邏輯地址為0x0000:7D81。2. 輸入調(diào)試命令vb 0x0000:0x7d81添加一個斷點。3. 輸入調(diào)試命令c繼續(xù)執(zhí)行,到斷點處中斷。在Console窗口中顯示(0) 0x00007d81 0000:7d81 (unk. ctxt): jmp far 0000:1000 ; ea00100000此條指令就會跳轉(zhuǎn)到物理內(nèi)存0x1000處(即Loader程序的第一條指令)繼續(xù)執(zhí)行。4. 按照打開boot.lst文件的方法打開loader.lst文件,并在此文件中查找到loader程序的第一條指令(第33行) 33 00000000 E91801 jmpStart5. 輸入調(diào)試命令xp /8b 0x1000查看內(nèi)存0x1000處的數(shù)據(jù),驗證此塊內(nèi)存的前三個字節(jié)和loader.lst文件中的第一條指令的字節(jié)碼是相同的。6. 根據(jù)之前記錄的loader.bin文件的大小,自己設(shè)計一個查看內(nèi)存的調(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ī)制,最后進(jìn)入操作系統(tǒng)內(nèi)核開始執(zhí)行(跳轉(zhuǎn)到kernel.dll的入口點執(zhí)行)。按照下面的步驟調(diào)試上述過程:1. 在loader.lst文件中查找到準(zhǔn)備進(jìn)入EOS操作系統(tǒng)內(nèi)核執(zhí)行的指令(第755行) 755 0000014F FF1517010080 call dword va_ImageEntry2. 計算此條指令的物理地址要復(fù)雜一些:偏移地址實際上是相對于節(jié)(節(jié)SECTION是NASM匯編中的概念)開始的。由于在boot.asm程序中只有一個節(jié),所以之前計算的結(jié)果都是正確的,但是在loader.asm程序中有兩個節(jié),并且此條指令是在第二個節(jié)中。下面引用的代碼是loader.lst中第一個節(jié)的最后一條指令(第593行)593 000003C1 C20600 ret 6因為第一個節(jié)中最后一條指令的偏移為0x03c1,并占用了3個字節(jié)(字節(jié)碼為C20600),所以可以計算出進(jìn)入內(nèi)核執(zhí)行的指令所在的物理地址為0x1513(0x1000+0x03c1+0x3+0x14f)。3. 使用添加物理地址斷點的調(diào)試命令pb 0x1513添加一個斷點。4. 輸入調(diào)試命令c繼續(xù)執(zhí)行,到斷點處中斷。在Console窗口中顯示要執(zhí)行的下一條指令(注意,此時的邏輯地址都為虛擬地址):(0) 0x00001513 0008:0000000080001513 (unk. ctxt): call dword ptr ds:0x80001117 ; ff1517110080由于這里使用了函數(shù)指針的概念,所以,根據(jù)反匯編指令可以確定內(nèi)核入口點函數(shù)的地址就保存在虛擬地址0x8000117處的四個字節(jié)中。5. 使用查看虛擬內(nèi)存的調(diào)試命令x /1wx 0x80001117查看內(nèi)存中保存的32位函數(shù)入口地址,在Console窗口中會輸出類似下面的內(nèi)容:0x0000000080001117 : 0x800*記錄下此塊內(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行)KiInitializePic();添加一個斷點。3. 現(xiàn)在可以在Console窗口中輸入調(diào)試命令c繼續(xù)調(diào)試,在剛剛添加的斷點處中斷。4. 在start.c源代碼文件中的KiSystemStartup函數(shù)名上點擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添加監(jiān)視”,KiSystemStartup函數(shù)就被添加到了“監(jiān)視”窗口中。在“監(jiān)視”窗口中可以看到此函數(shù)地址為void (PVOID) 0x800* 與在虛擬內(nèi)存x80001117處保存的函數(shù)入口地址相同,說明的確是由Loader程序進(jìn)入了操作系統(tǒng)內(nèi)核。5. 按F5繼續(xù)執(zhí)行EOS操作系統(tǒng)內(nèi)核,在Display窗口中顯示EOS操作系統(tǒng)已經(jīng)啟動,并且控制臺程序已經(jīng)開始運行了。6. 在OS Lab中選擇“調(diào)試”菜單中的“停止調(diào)試”,結(jié)束此次調(diào)試。四、 思考與練習(xí)l 為什么EOS操作系統(tǒng)從軟盤啟動時要使用boot.bin和loader.bin兩個程序?使用一個可以嗎?它們各自的主要功能是什么?l 軟盤引導(dǎo)扇區(qū)加載完畢后內(nèi)存中有兩個用戶可用的區(qū)域,為什么軟盤引導(dǎo)扇區(qū)程序選擇將loader.bin加載到第一個可用區(qū)域的0x1000處呢?這樣做有什么好處?這樣做會對loader.bin文件的大小有哪些限制。l 練習(xí)使用Bochs單步調(diào)試BIOS程序、軟盤引導(dǎo)扇區(qū)程序和loader程序,加深對操作系統(tǒng)啟動過程的理解。五、 相關(guān)閱讀l 打開Windows“開始”菜單,選擇“程序”中的“Bochs 2.4.1 for OS Lab”。其中的“Readme”文件介紹了Bochs模擬器,“Hel

溫馨提示

  • 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

提交評論