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

下載本文檔

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

文檔簡介

1、操作系統(tǒng)實驗報告班號:1303107學號:1130310726姓名:蔡鵬1. 請簡述head.s 的工作原理。head.s實在32位保護模式下運行的。我認為這段程序主要包括兩個部分:1.初始化設置。2.任務執(zhí)行與切換。初始設置主要包括了:1.設置GDT表2.設置系統(tǒng)定時芯片3.設置IDT表(0x08時鐘中斷和0x80系統(tǒng)調(diào)用中斷)4.切換到任務0執(zhí)行任務切換和執(zhí)行包括了:1.任務0和任務1 , 2. 時鐘中斷, 3. 系統(tǒng)中斷 兩個任務的在LDT中代碼段和數(shù)據(jù)段描述符的內(nèi)容都設置為:基地址0x0000;段限長值為0x03ff,實際段長度為4MB。因此在線性地址空間中這個“內(nèi)核”的代碼和數(shù)據(jù)段與

2、任務的代碼和數(shù)據(jù)段都從線性地址0開始并且由于沒有采用分頁機制,所以他們都直接對應物理地址0開始處。 為了每隔10毫秒切換運行的任務,head.s程序中把定時器芯片8253的通道0設置成每隔10毫秒就向中斷控制芯片8259A發(fā)送一個時鐘中斷請求信號。PC機的ROM BIOS開機時已經(jīng)在8259A中把時鐘中斷請求信號設置成中斷向量8,因此我們需要在中斷8的處理過程中執(zhí)行任務切換操作。任務切換的實現(xiàn)是查看current變量中的當前運行的任務號,如果為0,就利用任務1的TSS選擇符作為操作數(shù)執(zhí)行遠跳轉(zhuǎn)指令,從而切換到任務1中,否則反之。 每個任務在執(zhí)行時,會首先把一個字符的ASCII碼放入寄存器AL中

3、,然后調(diào)用系統(tǒng)中斷調(diào)用int 0x80,而該系統(tǒng)調(diào)用處理過程則會調(diào)用一個簡單的字符寫屏子程序,把寄存器AL中的字符顯示在屏幕上,同時把字符顯示的屏幕的下一個位置記錄下來,作為下一次顯示字符用。在顯示過一個字符后,任務代碼會使用循環(huán)語句延遲一段時間,然后又跳轉(zhuǎn)到任務代碼開始處繼續(xù)循環(huán)執(zhí)行,直到運行了10毫秒而發(fā)生了定時中斷,從而代碼會切換到另一個任務執(zhí)行。對于任務A,寄存器AL中始終存放字符A,而任務B運行時AL中始終存放字符B。因此程序運行時我們將看到一連串的A和一連串的B間隔的連續(xù)不斷的顯示在屏幕上。若出現(xiàn)了一個C,是由于PC機偶然產(chǎn)生了一個不是時鐘中斷和系統(tǒng)調(diào)用中斷的其他中斷。因為我們已經(jīng)

4、在程序中給所有其他中斷安裝了一個默認中斷處理程序。當出現(xiàn)一個其他中斷時,系統(tǒng)就會運行這個中斷處理程序,于是就會在屏幕上顯示一個C,然后退出中斷。4. 請記錄head.s 的內(nèi)存分布狀況,寫明每個數(shù)據(jù)段,代碼段,棧段的起始與終止的內(nèi)存地址。代碼段編號名稱起始地址終止地址1startup_320x000xac2setup_idt0xb50xe43setup_gdt0xad0xb44write_char0xe50x1135ignore_int0x1140x1296timer_interrupt0x12b0x1657system_interrupt0x1660x17c8task00x10e00x10f

5、39task10x10f40x1107數(shù)據(jù)段編號名稱起始地址終止地址1current0x17d0x1802scr_loc0x1810x1843lidt_opcode0x1860x18b4lgdt_opcode0x18c0x1915idt0x1980x9976gtd0x9980x9d77ldt00xbe00xbf78tss00xbf80xc5f9ldt10xc600xe7710tss10xe780xedf堆棧段編號名稱起始地址終止地址1Init_stack0x9d80xbd82Krn_stk00xc600xe603Krn_stk10xe000x10e04User_stk10x11080x1308

6、5. 簡述Head.s 5762行在做什么?簡述iret執(zhí)行后,pc如何找到下一條指令?并記錄iret執(zhí)行前后,棧是如何變化的。代碼作用:是在初始堆棧中人工設置返回環(huán)境。57:把任務0當前局部空間數(shù)據(jù)段(堆棧段)選擇符入棧58:把堆棧指針入棧(也可以把ESP入棧)59:把標志寄存器入棧60:把當前局部空間代碼段選擇符入棧61:把代碼指針入棧62:執(zhí)行中斷返回指令,從而切換到特權(quán)級3的任務0中執(zhí)行如何找到下一條指令:執(zhí)行iret之后,將推入堆棧的段地址和偏移地址彈出,使程序返回到原來發(fā)生中斷的地方。其作用是從中斷中恢復中斷前的狀態(tài),具體作用有如下三點:1.恢復IP:(IP)(SP)+1:(SP)

7、,(SP)(SP)+22.恢復CS:(CS)(SP)+1:(SP),(SP)(SP)+23.恢復中斷前的PSW(program status word),即恢復中斷前的標志寄存器的狀態(tài)。(FR)(SP)+1:(SP),(SP)(SP)+24.恢復ESP(返回權(quán)限發(fā)生變化)5.恢復SS(返回權(quán)限發(fā)生變化)PC根據(jù)彈出的cs查找其ldt表形成段基地址0x0000,然后再加上偏移地址eip得到下一條指令的地址0x10e0。棧的變化:其中,iret指令執(zhí)行前后棧的內(nèi)容如下:執(zhí)行前:棧中的內(nèi)容就是上面57-62行指令壓入的內(nèi)容。棧指針esp=0x0bc4地址值0x0BC40x10e00x0BC80x0f

8、0x0BCC0x2460x0BD00xbd80x0BD40x170x0BD80xbd8具體截圖如下:執(zhí)行后:將上述內(nèi)容全部彈出,使程序返回到原來發(fā)生中斷的地方。棧指針esp=0x0bd8地址值0x0BD80x0bd8具體截圖如下:6. 當任務進行系統(tǒng)調(diào)用時,即int 0x80時,記錄棧的變化情況。當執(zhí)行完system_interrupt函數(shù),執(zhí)行153行iret時,記錄棧的變化情況。此外,當進入和退出system_interrupt時,都發(fā)生了模式切換,請總結(jié)模式切換時,特權(quán)級是如何改變的?棧切換嗎?如何進行切換的?執(zhí)行系統(tǒng)調(diào)用int 0x80前,棧為task0或者task1的用戶棧,棧的內(nèi)容

9、:地址值0x0BD80x0bd8具體截圖如下:執(zhí)行系統(tǒng)調(diào)用int 0x80后,堆棧變?yōu)榇巳蝿盏南到y(tǒng)棧,而在這系統(tǒng)棧中自動壓入了發(fā)生中斷之前的ss、棧指針、標志寄存器、cs和下一條指令的eip。棧的內(nèi)容如下:地址值0x0e4c0x10eb0x0e500x0f0x0e540x2460x0e580xbd80x0e5c0x17具體截圖如下:當執(zhí)行完system_interrupt函數(shù),執(zhí)行153行iret前,棧為任務0的系統(tǒng)棧:esp=0x0e4c,棧的內(nèi)容是:地址值0x0e4c0x10eb0x0e500x0f0x0e540x2460x0e580xbd80x0e5c0x17具體截圖如下:執(zhí)行153行i

10、ret后,系統(tǒng)棧彈出下一條指令的地址以及各寄存器的值,彈完后系統(tǒng)棧為空。棧變化為任務1的用戶棧:esp=0x0bd8。棧的內(nèi)容是:地址值0x0bd80x0bd8具體截圖如下:當進入和退出system_interrupt時,都發(fā)生了模式切換。進入系統(tǒng)中斷時,硬件將各寄存器的值壓入系統(tǒng)棧后,查找其中斷向量表后,根據(jù)描述符的格式,cs值變?yōu)?x08,此時,cs標志著由用戶模式切換至內(nèi)核模式,特權(quán)級也由3變?yōu)?,棧也切換至系統(tǒng)棧。退出系統(tǒng)中斷時,由于處于特權(quán)級0的代碼不能直接把控制權(quán)轉(zhuǎn)移到特權(quán)級3的代碼中執(zhí)行,但中斷返回操作iret是可以的,可利用中斷返回指令IRET來啟動第一個任務。具體實現(xiàn)方法是在

11、初始堆棧init_stack中人工設置一個返回環(huán)境。例,把任務0的TSS段選擇符加載到任務寄存器LTR中、LDT段選擇符加載到LDTR中以后,把任務0的用戶棧指針(0x17: init_stack)和代碼指針(0x0f: task0)以及標志寄存器值壓入棧中,然后執(zhí)行中斷返回指令IRET。該指令會彈出堆棧上的的堆棧指針作為任務0用戶指針,恢復假設的任務0的標志寄存器內(nèi)容,并且彈出棧中代碼指針放入CS: EIP寄存器中,從而開始執(zhí)行任務0的代碼,完成了從特權(quán)級0到特權(quán)級3代碼的控制轉(zhuǎn)移,模式由內(nèi)核模式轉(zhuǎn)換為用戶模式。7. 當時鐘中斷發(fā)生,進入到timer_interrupt程序,請詳細記錄從任務

12、0切換到任務1,以及又過了10ms,從任務1切換回到任務0,整個流程是怎樣的?TSS是如何變化的?各個寄存器的值是如何變化的?請詳細總結(jié)任務切換的過程。從任務0切換到任務1: 1、 硬件將任務0的各寄存器的值和狀態(tài)保存到tss0中。2、 通過$TSS1_SEL選擇符查找gdt的tss1和ldt1得到任務1的各寄存器的值和任務1的局部代碼段指針等,加載到對應各寄存器中,3、 然后跳轉(zhuǎn)到任務1中。此時,tss0中為任務0在跳轉(zhuǎn)前的對應各寄存器的值 跳轉(zhuǎn)前的tss0:tss0的基地址位0xbf8 切換后,數(shù)據(jù)或指針加載到對應各寄存器后的tss0:切換后各寄存器的值是tss1中對應的各寄存器的值:tss1:基地址為0x0e78各寄存器的值也是對應tss1中的值。當過10ms后,從任務1切換到任務0:執(zhí)行跳轉(zhuǎn)指令時,1、硬件將任務1的各寄存器的值和狀態(tài)保存到tss1中。2、通過$TSS0_SEL選擇符查找gdt的tss0和ldt0,3、將tss0對應值加載到寄存器中,其中eip的值是前面跳轉(zhuǎn)到任務0時下一條指令的地址,即 jmp 2f,棧切換為任務1的

溫馨提示

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

評論

0/150

提交評論