任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35
任務(wù)和特權(quán)級(jí)保護(hù)(四)——《x86匯編語言:從實(shí)模式到保護(hù)模式》讀書筆記35
7. 正式進(jìn)入用戶程序的局部空間
67 mov ebx,message_1 68 call far [fs:PrintString] 69 70 mov eax,100 ;邏輯扇區(qū)號(hào)100 71 mov ebx,buffer ;緩沖區(qū)偏移地址 72 call far [fs:ReadDiskData] 73 74 mov ebx,message_2 75 call far [fs:PrintString] 76 77 mov ebx,buffer 78 call far [fs:PrintString] 79 80 jmp far [fs:TerminateProgram] ;將控制權(quán)返回到系統(tǒng)第67~78,都是通過調(diào)用門使用了內(nèi)核提供的例程。
第80行,需要特別說明。
[fs:TerminateProgram] 處確實(shí)是一個(gè)調(diào)用門,但是這里是通過jmp far來引用,會(huì)發(fā)生什么情況呢?
8. 代碼的編譯和調(diào)試
8.1. Makefile文件
BIN = c13_mbr.bin c14_core.bin c13.bin empty A_DIR = /home/cjy/a.img C_DIR = /home/cjy/c.imgall:$(BIN).PHONY:all cleanc13_mbr.bin:c13_mbr.asmnasm $< -o $@dd if=$@ of=$(A_DIR)c14_core.bin:c14_core.asmnasm $< -o $@ dd if=$@ of=$(C_DIR) bs=512 seek=1 conv=notruncc13.bin:c13.asmnasm $< -o $@dd if=$@ of=$(C_DIR) bs=512 seek=50 conv=notruncempty:diskdata.txtdd if=$< of=$(C_DIR) bs=512 seek=100 conv=notrunctouch $@clean:$(RM) $(BIN)8.2. 編譯
make之后,我們發(fā)現(xiàn)報(bào)錯(cuò)了:
c14_core.asm:645: error: operation size not specified c14_core.asm:662: error: operation size not specified不用擔(dān)心,只要在這兩行加上 dword修飾符即可。
8.3. 運(yùn)行結(jié)果與分析
看上圖,我們發(fā)現(xiàn)用戶程序沒有成功返回到內(nèi)核,也就是下面這段代碼根本沒有執(zhí)行。
866 return_point: ;用戶程序返回點(diǎn) 867 mov eax,core_data_seg_sel ;因?yàn)閏14.asm是以JMP的方式使用調(diào) 868 mov ds,eax ;用門@TerminateProgram,回到這 869 ;里時(shí),特權(quán)級(jí)為3,會(huì)導(dǎo)致異常。 870 mov ebx,message_6 871 call sys_routine_seg_sel:put_string 872 873 hlt再看看Bochs的調(diào)試界面,發(fā)現(xiàn)重啟了!
導(dǎo)致重啟的是黃色劃線的那句指令。查看日志,發(fā)現(xiàn)產(chǎn)生了一般保護(hù)異常。也就是說
80 jmp far [fs:TerminateProgram] ;將控制權(quán)返回到系統(tǒng)這句代碼會(huì)產(chǎn)生一般保護(hù)異常。
究其原因,不難理解。
因?yàn)槟繕?biāo)代碼段是非一致的,所以用jmp far指令轉(zhuǎn)移的時(shí)候,CPL必須等于目標(biāo)代碼段的DPL。但是我們的實(shí)驗(yàn)不滿足這個(gè)條件,因?yàn)镃PL=3,目標(biāo)代碼段的DPL=0.所以,自然就產(chǎn)生異常了。
怎么解決呢?本章的習(xí)題1剛好問了這個(gè)問題。
修改代碼清單14-1和13-3,使用戶程序能夠正常返回到內(nèi)核,并在顯示消息后停機(jī)。
單單就題目要求,有一種比較省事的解決方法,只需要修改代碼清單13-3中的第80行,把jmp far改成call far就行了。
因?yàn)镃PL=3;RPL=3;調(diào)用門描述符的DPL=3;目標(biāo)代碼段的DPL=0;完全符合call far的條件。
修改后再次編譯、運(yùn)行,結(jié)果如下圖:
可以看到,確實(shí)返回到了全局空間。而且Bochs調(diào)試界面也沒有重啟。
這篇博文的內(nèi)容就到這里。下次我們說一下習(xí)題2,敬請(qǐng)關(guān)注…
總結(jié)
以上是生活随笔為你收集整理的任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读入10个数,显示互不相同的数的数目,并
- 下一篇: 设计一个4*4魔方程序,让魔方的各行值的