任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35
任務和特權級保護(四)——《x86匯編語言:從實模式到保護模式》讀書筆記35
7. 正式進入用戶程序的局部空間
67 mov ebx,message_1 68 call far [fs:PrintString] 69 70 mov eax,100 ;邏輯扇區號100 71 mov ebx,buffer ;緩沖區偏移地址 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] ;將控制權返回到系統第67~78,都是通過調用門使用了內核提供的例程。
第80行,需要特別說明。
[fs:TerminateProgram] 處確實是一個調用門,但是這里是通過jmp far來引用,會發生什么情況呢?
8. 代碼的編譯和調試
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之后,我們發現報錯了:
c14_core.asm:645: error: operation size not specified c14_core.asm:662: error: operation size not specified不用擔心,只要在這兩行加上 dword修飾符即可。
8.3. 運行結果與分析
看上圖,我們發現用戶程序沒有成功返回到內核,也就是下面這段代碼根本沒有執行。
866 return_point: ;用戶程序返回點 867 mov eax,core_data_seg_sel ;因為c14.asm是以JMP的方式使用調 868 mov ds,eax ;用門@TerminateProgram,回到這 869 ;里時,特權級為3,會導致異常。 870 mov ebx,message_6 871 call sys_routine_seg_sel:put_string 872 873 hlt再看看Bochs的調試界面,發現重啟了!
導致重啟的是黃色劃線的那句指令。查看日志,發現產生了一般保護異常。也就是說
80 jmp far [fs:TerminateProgram] ;將控制權返回到系統這句代碼會產生一般保護異常。
究其原因,不難理解。
因為目標代碼段是非一致的,所以用jmp far指令轉移的時候,CPL必須等于目標代碼段的DPL。但是我們的實驗不滿足這個條件,因為CPL=3,目標代碼段的DPL=0.所以,自然就產生異常了。
怎么解決呢?本章的習題1剛好問了這個問題。
修改代碼清單14-1和13-3,使用戶程序能夠正常返回到內核,并在顯示消息后停機。
單單就題目要求,有一種比較省事的解決方法,只需要修改代碼清單13-3中的第80行,把jmp far改成call far就行了。
因為CPL=3;RPL=3;調用門描述符的DPL=3;目標代碼段的DPL=0;完全符合call far的條件。
修改后再次編譯、運行,結果如下圖:
可以看到,確實返回到了全局空間。而且Bochs調試界面也沒有重啟。
這篇博文的內容就到這里。下次我們說一下習題2,敬請關注…
總結
以上是生活随笔為你收集整理的任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读入10个数,显示互不相同的数的数目,并
- 下一篇: 设计一个4*4魔方程序,让魔方的各行值的