實驗二-操作系統的啟動_第1頁
實驗二-操作系統的啟動_第2頁
實驗二-操作系統的啟動_第3頁
實驗二-操作系統的啟動_第4頁
實驗二-操作系統的啟動_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、上海應用技術學院程序設計語言實驗報告實驗名稱操作系統的啟動實驗序號實驗二實驗日期姓 名學 號指導教師專 業計算機科學與技術班 級 成 績1、 實驗目的及要求 跟蹤調試EOS在PC機上從加電復位到成功啟動的全過程,了解操作系統的啟動過程。2、 實驗環境 Windows XP;Tevation OS Lab。3、 實驗內容1 準備實驗1. 啟動OS Lab。2. 新建一個EOS Kernel項目。3. 在“項目管理器”窗口中打開boot文件夾中的boot.asm和loader.asm兩個匯編文件。boot.asm是軟盤引導扇區程序的源文件,loader.asm是loader程序的源文件。簡單閱讀一

2、下這兩個文件中的NASM匯編代碼和注釋。4. 按F7生成項目。如圖1.圖1.5. 生成完成后,使用Windows資源管理器打開項目文件夾中的Debug文件夾。找到由boot.asm生成的軟盤引導扇區程序boot.bin文件,該文件的大小一定為512字節(與軟盤引導扇區的大小一致);找到由loader.asm生成的loader程序loader.bin文件,記錄下此文件的大小(如圖2),在下面的實驗中會用到;找到由其它源文件生成的操作系統內核文件kernel.dll。如圖3。圖2圖32 調試EOS操作系統的啟動過程2.1 使用Bochs做為遠程目標機按照下面的步驟將調試時使用的遠程目標機修改為Bo

3、chs:1. 在“項目管理器”窗口中,右鍵點擊目錄樹的根節點(kernel),選擇快捷菜單中的“屬性”,彈出項目的“屬性頁”對話框(此時按F1可以獲得關于屬性頁的幫助)。2. 在彈出的“屬性頁”對話框右側的屬性列表中找到“遠程目標機”屬性,將此屬性值修改為“Bochs Debug”(此時按F1可以獲得關于此屬性的幫助)。3. 點擊“確定”按鈕關閉“屬性頁”對話框。接下來就可以使用Bochs模擬器調試BIOS程序和軟盤引導扇區程序了。4. 結果如圖4。圖42.2 調試BIOS程序按F5啟動調試,此時會彈出兩個Bochs窗口。標題為“Bochs for windows - Display”的窗口(

4、如圖5)相當于計算機的顯示器,顯示操作系統的輸出;標題為“Bochs for windows - Console”的窗口(如圖6)是Bochs的控制臺,用來輸入調試命令,輸出各種調試信息。圖5圖6啟動調試后,Bochs在CPU要執行的第一條指令(即BIOS的第一條指令)處中斷, 此時,Display窗口沒有顯示任何內容,Console窗口顯示要執行的BIOS第一條指令的相關信息,并等待用戶輸入調試命令,如圖7:圖7 從Console窗口顯示的內容中,我們可以獲得關于BIOS第一條指令的如下信息:l 行首的0xfffffff0表示此條指令所在的物理地址。l f000:fff0表示此條指令所在的邏

5、輯地址(段地址:偏移地址)。l jmp far f000:e05b是此條指令的反匯編代碼。l 行尾的ea5be000f0是此條指令的十六進制字節碼,可以看出此條指令有5個字節。接下來可以按照下面的步驟查看CPU在沒有執行任何指令之前主要寄存器和內存中的數據:1. 在Console窗口中輸入調試命令sreg后按回車,顯示當前CPU中各個段寄存器的值,如圖8。其中CS寄存器信息行中的“s=0xf000”表示CS寄存器的值為0xf000。 圖82. 輸入調試命令r后按回車,顯示當前CPU中各個通用寄存器的值,如圖9。其中“rip: 0x00000000:0000fff0”表示IP寄存器的值為0xff

6、f0。圖9輸入調試命令xp /1024b 0x0000,查看開始的1024個字節的物理內存。在Console中輸出的這1K物理內存的值都為0,如圖10。說明BIOS中斷向量表還沒有被加載到此處。圖103. 輸入調試命令xp /512b 0x7c00,查看軟盤引導扇區應該被加載到的內存位置。輸出的內存值都為0,如圖11,。說明軟盤引導扇區還沒有被加載到此處??梢则炞CBIOS第一條指令所在邏輯地址中的段地址和CS寄存器值是一致的,偏移地址和IP寄存器的值是一致的。由于內存還沒有被使用,所以其中的值都為0。圖112.3 調試軟盤引導扇區程序BIOS在執行完自檢和初始化程序后,會將軟盤引導扇區加載到物

7、理地址0x7c00-0x7dff處,并從0x7c00處的指令開始執行引導程序,所以接下來練習從0x7c00處開始調試軟盤引導扇區程序:1. 輸入調試命令vb 0x0000:0x7c00,這樣就在邏輯地址0x0000:0x7c00(相當于物理地址0x7c00)處添加了一個斷點如圖12。圖122. 輸入調試命令c繼續執行,在0x7c00處的斷點中斷如圖13。圖13中斷后會在Console窗口中輸出下一個要執行的指令,即軟盤引導扇區程序的第一條指令如圖14。(0) 0x00007c00 0000:7c00 (unk. ctxt): jmp .+0x006d (0x00007c6f) ; eb6d圖1

8、43. 為了方便后面的使用,先在紙上分別記錄下此條指令的字節碼(eb6d)和此條指令要跳轉執行的下一條指令的地址(括號中的0x00007c6f)。4. 輸入調試命令sreg驗證CS寄存器(0x0000)的值。如圖15。圖15.5. 調試命令r驗證IP寄存器(0x7c00)的值。如圖16。圖166. 由于BIOS程序此時已經執行完畢,輸入調試命令xp /1024b 0x0000驗證此時BIOS中斷向量表已經被載入。如圖17。圖177. 輸入調試命令xp /512b 0x7c00顯示軟盤引導扇區程序的所有字節碼。觀察此塊內存最開始的兩個字節分別為0xeb和0x6d,這和引導程序第一條指令的字節碼(

9、eb6d)是相同的。此塊內存最后的兩個字節分別為0x55和0xaa(如圖18-19),圖18圖19表示引導扇區是激活的,可以用來引導操作系統,這兩個字節是boot.asm中最后一行語句dw 0xaa55定義的(注意,Intel 80386 CPU使用little endian字節順序)。8. 輸入調試命令xp /512b 0x0600驗證第一個用戶可用區域是空白的。如圖20。圖209. 輸入調試命令xp /512b 0x7e00驗證第二個用戶可用區域是空白的。如圖21。圖2110. 自己設計兩個查看內存的調試命令,分別驗證這兩個用戶可用區域的高地址端也是空白的。如圖22。圖2211. 輸入調試

10、命令xp /512b 0xa0000驗證上位內存已經被系統占用。如圖23。圖2312. 自己設計一個查看內存的調試命令,驗證上位內存的高地址端已經被系統占用。如圖24。圖24NASM匯編器在將boot.asm生成為boot.bin的同時,會生成一個boot.lst列表文件,幫助開發者調試boot.asm文件中的匯編代碼。按照下面的步驟查看boot.lst文件:1. 在OS Lab的“項目管理器”窗口中右鍵點擊“boot”文件夾中的boot.asm文件。2. 在彈出的快捷菜單中選擇“打開生成的列表文件”,在源代碼編輯器中就會打開文件boot.lst。3. 將boot.lst文件和boot.asm

11、文件對比可以發現,此文件包含了boot.asm文件中所有的匯編代碼,同時在代碼的左側又添加了更多的信息。 如圖25所示。圖254. 在boot.lst中查找到軟盤引導扇區程序第一條指令所在的行(第73行)如圖26。圖26 73 00000000 EB6D jmp short Start此行包含的信息有:l 73是行號。l 00000000是此條指令相對于程序開始位置的偏移(第一條指令應該為0)。l EB6D是此條指令的字節碼,和之前記錄下來的指令字節碼是一致的。軟盤引導扇區程序的主要任務就是將軟盤中的loader.bin文件加載到物理內存的0x1000處,然后跳轉到loader程序的第一條指令

12、(物理地址0x1000處的指令)繼續執行loader程序。按照下面的步驟調試上述過程:1. 在boot.lst文件中查找到加載完畢loader.bin文件后要跳轉到loader程序中執行的指令(第278行)如圖27。圖27 278 00000181 EA00100000 jmp0:LOADER_ORG根據此指令相對于程序開始的偏移(0x0181)可以得到此指令的邏輯地址為0x0000:7D81。2. 輸入調試命令vb 0x0000:0x7d81添加一個斷點。3. 輸入調試命令c繼續執行,到斷點處中斷。在Console窗口中顯示如圖28。圖28 (0) 0x00007d81 0000:7d81

13、(unk. ctxt): jmp far 0000:1000 ; ea00100000此條指令就是跳轉到物理內存0x1000處(即Loader程序的第一條指令)繼續執行。4. 按照打開boot.lst文件的方法打開loader.lst文件,并在此文件中查找到loader程序的第一條指令(第33行)如圖29。 33 00000000 E91801 jmpStart圖295. 輸入調試命令xp /8b 0x1000查看內存0x1000處的內存,驗證此塊內存的前三個字節和loader.lst文件中的第一條指令的字節碼是相同的。如圖30。圖306. 根據之前記錄的loader.bin文件的大小,自己設

14、計一個查看內存的調試命令,查看內存中loader程序結束位置的字節碼,并與loader.lst文件中最后指令的字節碼比較,驗證loader程序被完全加載到了正確的位置。2.4 調試加載程序Loader程序的主要任務是將操作系統內核(kernel.dll文件)加載到內存中,然后讓CPU進入保護模式并且啟用分頁機制,最后進入操作系統內核開始執行(跳轉到kernel.dll的入口點執行)。按照下面的步驟調試上述過程:1. 在loader.lst文件中查找到準備進入EOS操作系統內核執行的指令(第755行)如圖31。 755 0000014F FF1517010080 call dword va_Im

15、ageEntry圖312. 計算此條指令的物理地址要復雜一些:偏移地址實際上是相對于節(節SECTION是NASM匯編中的概念)開始的。由于在boot.asm程序中只有一個節,所以之前計算的結果都是正確的,但是在loader.asm程序中有兩個節,并且此條指令是在第二個節中。下面引用的代碼是loader.lst中第一個節的最后一條指令(第593行)如圖32。圖32 593 000003C1 C20600 ret 6根據第一個節中最后一條指令的偏移為0x03c1,并占用了3個字節(字節碼C20600),可以計算出進入內核執行的指令所在的物理地址為0x1513(0x1000+0x03c1+0x3+

16、0x14f)。3. 使用添加物理地址斷點的調試命令pb 0x1513添加一個斷點。4. 輸入調試命令c繼續執行,到斷點處中斷。在Console窗口中顯示要執行的下一條指令:(0) 0x00001513 0008:0000000080001513 (unk. ctxt): call dword ptr ds:0x80001117 ; ff1517110080注意,這里使用了函數指針的概念,所以,根據反匯編指令可以確定內核入口點函數的地址就保存在虛擬內存0x8000117處。如圖33。圖335. 使用查看內存的調試命令x /1wx 0x80001117查看內存中保存的32位函數入口地址,在Cons

17、ole窗口中輸出,如圖34。0x0000000080001117 <bogus+ 0>: 0x800*圖34記錄下Console輸出的地址,后面的實驗會驗證內核入口點函數的地址與此地址是一致的。2.5 調試內核調試內核的步驟如下:1. 在OS Lab的“項目管理器”窗口中打開ke文件夾中的start.c文件,此文件中只定義了一個函數,就是操作系統內核的入口點函數KiSystemStartup。2. 在KiSystemStartup函數中的KiInitializePic();代碼行(第61行)添加一個斷點。3. 現在可以在Console窗口中輸入調試命令c繼續調試,在剛剛添加的斷點處中斷。4. 在start.c源代碼文件中的KiSystemStartup函數名上點擊鼠標右鍵,在彈出的快捷菜單中選擇“添加監視”,KiSystemStartup函數就被添加到了“監視”窗口中。在“監視”窗口中可以看到此函數的值為void (PVOID) 0x800* <KiSystemStartup

溫馨提示

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

評論

0/150

提交評論