版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
練習1、理解通過make生成執(zhí)行文件的過程。[練習1.1]操作系統(tǒng)鏡像文件ucore.img?proj1makeV=make指令執(zhí)行的過程makemakeV=+ccboot/bootasm.Sgcc-Iboot/-fno-builtin-Wall-ggdb-m32-nostdinc-fno-stack-protector-Ilibs/-Os-nostdinc-cboot/bootasm.S-oobj/boot/bootasm.o+ccboot/bootmain.cgcc-Iboot/-fno-builtin-Wall-ggdb-m32-nostdinc-fno-stack-protector-Ilibs/-Os-nostdinc-cboot/bootmain.c-oobj/boot/bootmain.o+cctools/sign.cgcc-Itools/-g-Wall-O2-ctools/sign.c-oobj/sign/tools/sign.ogcc-g-Wall-O2obj/sign/tools/sign.o-obin/sign+ldbin/bootblockld-m elf_i386-N-estart-Ttext0x7C00obj/boot/bootasm.oobj/boot/bootmain.o-oobj/bootblock.o”obj/bootblock.out”size:440bytesbuild512bytesbootsector:”bin/bootblock”success!ddif=/dev/zeroof=bin/ucore.imgcount=1000010000+0的讀入10000+0的寫出5120230字節(jié)(5.1MB)已復制,0.0227439秒,225MB/秒ddif=bin/bootblockof=bin/ucore.imgconv=notrunc1+0的讀入1+0的寫出512字節(jié)(512B)已復制,0.000214966秒,2.4MB/秒ucore.imgbootblock,而bootblockbootmain.obootasm.osign,這三個文件又bootmain.c、bootasm.S、sigh.c來生成。ld-m elf_i386-N-estart-Ttext0x7C00obj/boot/bootasm.oobj/boot/bootmain.o–oobj/bootblock.obootblock,elf_i386elf頭,0x7C00為程序的入口?!眔bj/bootblock.out”size:440bytes這句話表示生成的bootblock的文件大小,由于大小不到512字節(jié),所以需要給blootblock填充,填充的功能在sign.c中有所表達,最終兩字節(jié)設置為了0x55,0xAAbuf[510]=0x55;buf[511]=0xAA;FILE*ofp=fopen(argv[2],“wb+“);size=fwrite(buf,1,512,ofp);[練習1.2]么前面已經提到過:引導扇區(qū)的大小為512字節(jié),最終兩個字節(jié)為標志性完畢字節(jié)0x55,0xAA,做完這樣的檢查才能認為是符合標準的磁盤主引導扇區(qū)。Sign.c文件中有作檢查:if(size!=512){fprintf(stderr,“write”%s”error,sizeis%d.\n“,argv[2],size);return-1;}練習2:使用qemu執(zhí)行并調試lab1中的軟件。[練習2.1]CPU加電后執(zhí)行的第一條指令開頭,BIOS的執(zhí)行。[練習2.2]0x7c00,測試斷點正常。[練習2.3]qemu-din_asm-Dq.log參數,便可以將運行的匯q.logbootasm.S和bootblock.asm進展比較,看看二者是否全都。lab1/proj1做的,練習開頭時是打算用命令行一句一句執(zhí)makefilegdbinit可以大大提高調試效率。于是在makefile中增加以下代碼lab1-mon:lab1-mon:$(UCOREIMG)$(V)$(TERMINAL)-e“$(QEMU)-S-s-din_asm-D$(BINDIR)/q.log-monitorstdio-hda$<-serialnull“$(V)sleep2$(V)$(TERMINAL)-e“gdb-q-tui-x tools/gdbinit“-S–s是使得qemuqemu時增加-din_asm-Dq.log參數,便可以將運行的匯編指令保存q.log中。然后sleep兩秒應當是給qemuGDB調試工具,fileobj/bootblock.otargetremote:1234setarchitecturei8086fileobj/bootblock.otargetremote:1234setarchitecturei8086b*0x7c00continuex/10i$pc先是加載調試文件6的實模式0,也就是bootloader10條指令。運行結果圖如下boot.asm文件中的代碼完全全都,說明斷點q.log文件看,看到了很奇葩的結果。能夠看cli,cld之類生疏的指令,但是他們的地址以及消滅的挨次都不是想象的那樣從0x0x00007c00kcld)。之后聽大神解釋,在q.logBIOS之后的跳轉地址與實際應跳轉地bootasm.S和bootblock.asm不一樣??梢酝ㄟ^makedebug之后在qemu的掌握臺中輸入x/10i$pc看到BIOS執(zhí)行bootloader局部的代碼。進過比照bootasm.Sbootblock.asm中的代碼完全全都。練習3分析bootloader進入保護模式的過程。clicld#Disableinterruptsclicld#Disableinterrupts#Stringoperations#Setuptheimportantdatasegmentregisters(DS,ES,SS).xorw%ax,%ax%ax,%ds%ax,%es%ax,%ss#Segmentnumberzero#->DataSegment#->ExtraSegment1A20A20?seta20.seta20.1:inb$0x64,%altestb$0x2,%aljnzseta20.1等待8042鍵盤掌握器不忙movb$0xd1,%aloutb%al,$0x64發(fā)送寫8042輸出端口的指令seta20.2:inb$0x64,%altestb$0x2,%aljnzseta20.2等待8042鍵盤掌握器不忙movb$0xdf,%aloutb%al,$0x60翻開A20當A20地址線掌握制止時,則程序就像在8086中運行,1MB以上的地是不行訪問的。在保護模式下A20地址線掌握是要翻開的。為了使能全部地址位的尋址力量,必需向鍵盤控制器8042發(fā)送一個命令。鍵盤掌握器8042將會將它的的某個輸出引腳的輸出置高電平,作為A20地址線掌握的輸入。一旦設置成功之后,內存將不會再被繞回(memorywrapping),這樣我們就可以尋址intel80286CPU支持的16M內存空間,或者是尋址intel80386以上級別CPU支持的全部4G內存空間了。2GDT表?lgdtlgdtgdtdescmovl%cr0,%eaxorl$CR0_PE_ON,%eaxmovl%eax,%cr0把gdt表的起始位置和界限裝入GDTR存放器復習一下cr0存放器,它的第0位為保護模式位PE:設置PE將讓處理器工作在保護模式下。復位PE將返回到實模式工作。此外,gdtdesc指出了全局描述符表在符號gdt處,如下上面四句話實現了翻開保護模式位。3、如何使能進入保護模式?通過長跳轉指令gdt:gdt:SEG_NULLASMSEG_ASM(STA_X|STA_R,0x0,0xffffffff)SEG_ASM(STA_W,0x0,0xffffffff)空段代碼段〔起始地址,大小〕數據段〔起始地址,大小〕ljmp$PROT_MODE_CSEG,$protcseg進入了保護模式。進入保護模式之后還有一個步驟:把全部的數據段存放器指向上面的描述符表中的數據段〔0。練習四、分析bootloader加載ELF格式的OS的過程。在proj2中,增加主要增加了對磁盤簡潔的讀取函數readsect,以及對FF頭構造在)。staticstaticvoidreadseg(uintptr_tva,uint32_tcount,uint32_toffset){uintptr_tend_va=va+count;//指針移到邊界va-=offset%SECTSIZE;//計算開頭讀的第一個扇區(qū)號uint32_tsecno=(offset/SECTSIZE)+1;//逐個讀取扇區(qū)for(;va<end_va;va+=SECTSIZE,secno++){readsect((void*)va,secno);}}//kernel8個扇區(qū)〔ELF4KB〕0x10000疑問:為什么要把ELF頭讀到0X10000?從哪讀?以下為一些硬件端口上實現讀取一個扇區(qū)到內存0x10000。//waitfordisktobereadywaitdisk;outb(0x1F2,1);outb(0x1F3,secno&0xFF);/*readsect/*readsect-readasinglesectorat@secnointo@dst*/staticvoidreadsect(void*dst,uint32_tsecno){//count=1outb(0x1F4,(secno>>8)&0xFF);outb(0x1F5,(secno>>16)&0xFF);outb(0x1F6,((secno>>24)&0xF)|0xE0);outb(0x1F7,0x20);//waitfordisktobereadywaitdisk;//readasectorinsl(0x1F0,dst,SECTSIZE/4);//cmd0x20-readsectors}讀I/O地址0x1f7,等待磁盤預備好;寫I/O地址0x1f2~0x1f5,0x1f7,發(fā)出讀取第offseet個扇區(qū)處的磁盤數據的命令;讀I/O地址0x1f7,等待磁盤預備好;連續(xù)讀I/O地址0x1f0,把磁盤扇區(qū)數據讀到指定內存。練習五、實現函數調用堆棧跟蹤函數〔需要編程〕uint32_tebp=uint32_tebp=read_ebp,eip=read_eip;inti,j;for(i=0;ebp!=0&&i<STACKFRAME_DEPTH;i++){cprintf(“ebp:0x%08xeip:0x%08xargs:“,ebp,eip);uint32_t*args=(uint32_t*)ebp+2;for(j=0;j<4;j++){x“,}cprintf(“\n“);print_debuginfo(eip-1);注:read_ebp和readeip都是通過內聯匯編實現的。Eip-1是為了能找到上一條指令結果圖:練習六、完善中斷初始化和處理〔需要編程〕[練習6.1]中斷向量表中一個表項占多少字節(jié)?其中哪幾位代表中斷處理代碼的入口?中斷向量表一個表項占用8字節(jié),其中2-3字節(jié)是段選擇子,0-1字節(jié)和6-7字節(jié)拼成位移,兩者聯合便是中斷處理程序的入口地址。kern/trap/trap.c中對中斷向量表進展初始化的函idt_init。idt_initidt_init(void){externuintptr_t vectors[];inti;for(i=0;i<sizeof(idt)/sizeof(structgatedesc);i++){SETGATE(idt[i],0,GD_KTEXT, vectors[i],DPL_KERNEL);}//初始化每一條IDT項//設置內核態(tài)到用戶態(tài)的轉換SETGATE(idt[T_SWITCH_TOK],0,GD_KTEXT, vectors[T_SWITCH_TOK],DPL_USER);//載入IDTlidt(&idt_pd);}trap.ctrap,在對時鐘中斷進展處理的局部填寫trap函數中處理時鐘中斷的局部,使操作系統(tǒng)每遇100次時鐘中斷s子程序,向屏幕上打印一行文字0casecaseIRQ_OFFSET+IRQ_TIMER:ticks++;if(ticks%TICK_NUM==0){print_ticks;}//當有100次時鐘中斷輸出一次break;練習7、增加syscall功能,即增加一用戶態(tài)函數〔可執(zhí)行一特定系統(tǒng)調用:獲得時鐘計數值,當內核初始完畢后,可從內核態(tài)返回到用戶態(tài)的函數,而用戶態(tài)的函數又通過系統(tǒng)調用得到內核態(tài)的效勞。先附上兩個最重要的圖,分別是內核態(tài)切換到用戶態(tài)、用戶態(tài)切換到內核態(tài)的過程。這局部是最花時間的,光是看代碼就有很多疑問。1、 為什么需要構建一個臨時的trapframe來實現切換棧,切換棧說白了不就是需要修改那幾個存放器嗎?2、 PPT上兩個切換過程中的的兩個老棧頂是一個地址嗎?老棧頂是什么意思?3、 切換到用戶態(tài)的過程中,trapframe的tf_esp為什么要指向原
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025中國建筑國際集團校園招聘245人高頻重點提升(共500題)附帶答案詳解
- 2025中國人壽保險股份限公司南漳縣支公司13人(湖北)高頻重點提升(共500題)附帶答案詳解
- 2025下半年重慶酉陽自治縣教育事業(yè)單位招聘125人開考歷年高頻重點提升(共500題)附帶答案詳解
- 2025下半年浙江省舟山市生態(tài)環(huán)境局下屬事業(yè)單位招聘2人歷年高頻重點提升(共500題)附帶答案詳解
- 2025下半年四川省阿壩州事業(yè)單位招聘191人高頻重點提升(共500題)附帶答案詳解
- 2025下半年四川甘孜州事業(yè)單位招聘619人歷年高頻重點提升(共500題)附帶答案詳解
- 2025上海市行政法制研究所研究人員公開招聘歷年高頻重點提升(共500題)附帶答案詳解
- 2025上半年江蘇省南通通州事業(yè)單位招聘78人歷年高頻重點提升(共500題)附帶答案詳解
- 2025上半年四川省資陽安岳縣人力資源和社會保障局考試招聘89人高頻重點提升(共500題)附帶答案詳解
- 2025上半年四川涼山西昌市招聘教師212人高頻重點提升(共500題)附帶答案詳解
- GB∕T 41550-2022 畜禽屠宰用脫毛劑使用規(guī)范
- 輕型觸探儀地基承載力參數對照表
- 綜合管理部負責人(部長)崗位職責
- 檢驗科15項質量控制指標(檢驗科質控小組活動記錄)
- GB∕T 2518-2019 連續(xù)熱鍍鋅和鋅合金鍍層鋼板及鋼帶
- 海南省商品住宅專項維修資金管理辦法
- 美國文學各個時期作家作品集合
- 空運委托書范本
- 工業(yè)氯化芐企業(yè)標準連云港泰樂
- 機翼翼肋實例零件庫設計
- GB∕T 10596-2021 埋刮板輸送機
評論
0/150
提交評論