下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
練習(xí)1、理解通過(guò)make生成執(zhí)行文件的過(guò)程。[練習(xí)1.1]操作系統(tǒng)鏡像文件ucore.img?proj1makeV=make指令執(zhí)行的過(guò)程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的寫(xiě)出5120230字節(jié)(5.1MB)已復(fù)制,0.0227439秒,225MB/秒ddif=bin/bootblockof=bin/ucore.imgconv=notrunc1+0的讀入1+0的寫(xiě)出512字節(jié)(512B)已復(fù)制,0.000214966秒,2.4MB/秒ucore.imgbootblock,而bootblockbootmain.obootasm.osign,這三個(gè)文件又bootmain.c、bootasm.S、sigh.c來(lái)生成。ld-m elf_i386-N-estart-Ttext0x7C00obj/boot/bootasm.oobj/boot/bootmain.o–oobj/bootblock.obootblock,elf_i386elf頭,0x7C00為程序的入口。”obj/bootblock.out”size:440bytes這句話表示生成的bootblock的文件大小,由于大小不到512字節(jié),所以需要給blootblock填充,填充的功能在sign.c中有所表達(dá),最終兩字節(jié)設(shè)置為了0x55,0xAAbuf[510]=0x55;buf[511]=0xAA;FILE*ofp=fopen(argv[2],“wb+“);size=fwrite(buf,1,512,ofp);[練習(xí)1.2]么前面已經(jīng)提到過(guò):引導(dǎo)扇區(qū)的大小為512字節(jié),最終兩個(gè)字節(jié)為標(biāo)志性完畢字節(jié)0x55,0xAA,做完這樣的檢查才能認(rèn)為是符合標(biāo)準(zhǔn)的磁盤(pán)主引導(dǎo)扇區(qū)。Sign.c文件中有作檢查:if(size!=512){fprintf(stderr,“write”%s”error,sizeis%d.\n“,argv[2],size);return-1;}練習(xí)2:使用qemu執(zhí)行并調(diào)試lab1中的軟件。[練習(xí)2.1]CPU加電后執(zhí)行的第一條指令開(kāi)頭,BIOS的執(zhí)行。[練習(xí)2.2]0x7c00,測(cè)試斷點(diǎn)正常。[練習(xí)2.3]qemu-din_asm-Dq.log參數(shù),便可以將運(yùn)行的匯q.logbootasm.S和bootblock.asm進(jìn)展比較,看看二者是否全都。lab1/proj1做的,練習(xí)開(kāi)頭時(shí)是打算用命令行一句一句執(zhí)makefilegdbinit可以大大提高調(diào)試效率。于是在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時(shí)增加-din_asm-Dq.log參數(shù),便可以將運(yùn)行的匯編指令保存q.log中。然后sleep兩秒應(yīng)當(dāng)是給qemuGDB調(diào)試工具,fileobj/bootblock.otargetremote:1234setarchitecturei8086fileobj/bootblock.otargetremote:1234setarchitecturei8086b*0x7c00continuex/10i$pc先是加載調(diào)試文件6的實(shí)模式0,也就是bootloader10條指令。運(yùn)行結(jié)果圖如下boot.asm文件中的代碼完全全都,說(shuō)明斷點(diǎn)q.log文件看,看到了很奇葩的結(jié)果。能夠看cli,cld之類(lèi)生疏的指令,但是他們的地址以及消滅的挨次都不是想象的那樣從0x0x00007c00kcld)。之后聽(tīng)大神解釋?zhuān)趒.logBIOS之后的跳轉(zhuǎn)地址與實(shí)際應(yīng)跳轉(zhuǎn)地bootasm.S和bootblock.asm不一樣。可以通過(guò)makedebug之后在qemu的掌握臺(tái)中輸入x/10i$pc看到BIOS執(zhí)行bootloader局部的代碼。進(jìn)過(guò)比照bootasm.Sbootblock.asm中的代碼完全全都。練習(xí)3分析bootloader進(jìn)入保護(hù)模式的過(guò)程。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鍵盤(pán)掌握器不忙movb$0xd1,%aloutb%al,$0x64發(fā)送寫(xiě)8042輸出端口的指令seta20.2:inb$0x64,%altestb$0x2,%aljnzseta20.2等待8042鍵盤(pán)掌握器不忙movb$0xdf,%aloutb%al,$0x60翻開(kāi)A20當(dāng)A20地址線掌握制止時(shí),則程序就像在8086中運(yùn)行,1MB以上的地是不行訪問(wèn)的。在保護(hù)模式下A20地址線掌握是要翻開(kāi)的。為了使能全部地址位的尋址力量,必需向鍵盤(pán)控制器8042發(fā)送一個(gè)命令。鍵盤(pán)掌握器8042將會(huì)將它的的某個(gè)輸出引腳的輸出置高電平,作為A20地址線掌握的輸入。一旦設(shè)置成功之后,內(nèi)存將不會(huì)再被繞回(memorywrapping),這樣我們就可以尋址intel80286CPU支持的16M內(nèi)存空間,或者是尋址intel80386以上級(jí)別CPU支持的全部4G內(nèi)存空間了。2GDT表?lgdtlgdtgdtdescmovl%cr0,%eaxorl$CR0_PE_ON,%eaxmovl%eax,%cr0把gdt表的起始位置和界限裝入GDTR存放器復(fù)習(xí)一下cr0存放器,它的第0位為保護(hù)模式位PE:設(shè)置PE將讓處理器工作在保護(hù)模式下。復(fù)位PE將返回到實(shí)模式工作。此外,gdtdesc指出了全局描述符表在符號(hào)gdt處,如下上面四句話實(shí)現(xiàn)了翻開(kāi)保護(hù)模式位。3、如何使能進(jìn)入保護(hù)模式?通過(guò)長(zhǎng)跳轉(zhuǎn)指令gdt:gdt:SEG_NULLASMSEG_ASM(STA_X|STA_R,0x0,0xffffffff)SEG_ASM(STA_W,0x0,0xffffffff)空段代碼段〔起始地址,大小〕數(shù)據(jù)段〔起始地址,大小〕ljmp$PROT_MODE_CSEG,$protcseg進(jìn)入了保護(hù)模式。進(jìn)入保護(hù)模式之后還有一個(gè)步驟:把全部的數(shù)據(jù)段存放器指向上面的描述符表中的數(shù)據(jù)段〔0。練習(xí)四、分析bootloader加載ELF格式的OS的過(guò)程。在proj2中,增加主要增加了對(duì)磁盤(pán)簡(jiǎn)潔的讀取函數(shù)readsect,以及對(duì)FF頭構(gòu)造在)。staticstaticvoidreadseg(uintptr_tva,uint32_tcount,uint32_toffset){uintptr_tend_va=va+count;//指針移到邊界va-=offset%SECTSIZE;//計(jì)算開(kāi)頭讀的第一個(gè)扇區(qū)號(hào)uint32_tsecno=(offset/SECTSIZE)+1;//逐個(gè)讀取扇區(qū)for(;va<end_va;va+=SECTSIZE,secno++){readsect((void*)va,secno);}}//kernel8個(gè)扇區(qū)〔ELF4KB〕0x10000疑問(wèn):為什么要把ELF頭讀到0X10000?從哪讀?以下為一些硬件端口上實(shí)現(xiàn)讀取一個(gè)扇區(qū)到內(nèi)存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,等待磁盤(pán)預(yù)備好;寫(xiě)I/O地址0x1f2~0x1f5,0x1f7,發(fā)出讀取第offseet個(gè)扇區(qū)處的磁盤(pán)數(shù)據(jù)的命令;讀I/O地址0x1f7,等待磁盤(pán)預(yù)備好;連續(xù)讀I/O地址0x1f0,把磁盤(pán)扇區(qū)數(shù)據(jù)讀到指定內(nèi)存。練習(xí)五、實(shí)現(xiàn)函數(shù)調(diào)用堆棧跟蹤函數(shù)〔需要編程〕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都是通過(guò)內(nèi)聯(lián)匯編實(shí)現(xiàn)的。Eip-1是為了能找到上一條指令結(jié)果圖:練習(xí)六、完善中斷初始化和處理〔需要編程〕[練習(xí)6.1]中斷向量表中一個(gè)表項(xiàng)占多少字節(jié)?其中哪幾位代表中斷處理代碼的入口?中斷向量表一個(gè)表項(xiàng)占用8字節(jié),其中2-3字節(jié)是段選擇子,0-1字節(jié)和6-7字節(jié)拼成位移,兩者聯(lián)合便是中斷處理程序的入口地址。kern/trap/trap.c中對(duì)中斷向量表進(jìn)展初始化的函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項(xiàng)//設(shè)置內(nèi)核態(tài)到用戶(hù)態(tài)的轉(zhuǎn)換SETGATE(idt[T_SWITCH_TOK],0,GD_KTEXT, vectors[T_SWITCH_TOK],DPL_USER);//載入IDTlidt(&idt_pd);}trap.ctrap,在對(duì)時(shí)鐘中斷進(jìn)展處理的局部填寫(xiě)trap函數(shù)中處理時(shí)鐘中斷的局部,使操作系統(tǒng)每遇100次時(shí)鐘中斷s子程序,向屏幕上打印一行文字0casecaseIRQ_OFFSET+IRQ_TIMER:ticks++;if(ticks%TICK_NUM==0){print_ticks;}//當(dāng)有100次時(shí)鐘中斷輸出一次break;練習(xí)7、增加syscall功能,即增加一用戶(hù)態(tài)函數(shù)〔可執(zhí)行一特定系統(tǒng)調(diào)用:獲得時(shí)鐘計(jì)數(shù)值,當(dāng)內(nèi)核初始完畢后,可從內(nèi)核態(tài)返回到用戶(hù)態(tài)的函數(shù),而用戶(hù)態(tài)的函數(shù)又通過(guò)系統(tǒng)調(diào)用得到內(nèi)核態(tài)的效勞。先附上兩個(gè)最重要的圖,分別是內(nèi)核態(tài)切換到用戶(hù)態(tài)、用戶(hù)態(tài)切換到內(nèi)核態(tài)的過(guò)程。這局部是最花時(shí)間的,光是看代碼就有很多疑問(wèn)。1、 為什么需要構(gòu)建一個(gè)臨時(shí)的trapframe來(lái)實(shí)現(xiàn)切換棧,切換棧說(shuō)白了不就是需要修改那幾個(gè)存放器嗎?2、 PPT上兩個(gè)切換過(guò)程中的的兩個(gè)老棧頂是一個(gè)地址嗎?老棧頂是什么意思?3、 切換到用戶(hù)態(tài)的過(guò)程中,trapframe的tf_esp為什么要指向原
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 儲(chǔ)蓄存款和商業(yè)銀行課件
- 《中海國(guó)際社區(qū)Y》課件
- 網(wǎng)絡(luò)布線施工規(guī)范-洞察分析
- 司法考試行業(yè)數(shù)字化轉(zhuǎn)型研究-洞察分析
- 數(shù)字營(yíng)銷(xiāo)在醫(yī)藥行業(yè)的應(yīng)用-洞察分析
- 網(wǎng)絡(luò)調(diào)度實(shí)時(shí)性?xún)?yōu)化-洞察分析
- 糖尿病視網(wǎng)膜病變?cè)缙诓Aw改變研究-洞察分析
- 云計(jì)算平臺(tái)安全性對(duì)比-第1篇-洞察分析
- 醫(yī)療干部評(píng)職稱(chēng)的述職報(bào)告范文(9篇)
- 《市政道路施工技術(shù)》課件
- 考點(diǎn) 23 溶解度及溶解度曲線(解析版)
- 廣東廣業(yè)投資集團(tuán)限公司社會(huì)公開(kāi)招聘高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 農(nóng)業(yè)服務(wù)公司的賬務(wù)處理實(shí)例-記賬實(shí)操
- 新聞媒體新聞采集與編輯規(guī)范標(biāo)準(zhǔn)
- 更夫聘用合同書(shū)2024年
- 2024版抗腫瘤藥物相關(guān)肝損傷診療指南解讀課件
- 2024年秋季學(xué)期新魯教版(五四制)六年級(jí)上冊(cè)英語(yǔ)課件 Unit6 Section B (2a-Reflecting)(第5課時(shí))
- GB/Z 44314-2024生物技術(shù)生物樣本保藏動(dòng)物生物樣本保藏要求
- 中醫(yī)與輔助生殖
- 服務(wù)器行業(yè)市場(chǎng)分析報(bào)告2024年
- 大學(xué)生心理健康智慧樹(shù)知到期末考試答案章節(jié)答案2024年上海杉達(dá)學(xué)院
評(píng)論
0/150
提交評(píng)論