任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35
来源:互联网 发布:软件过期怎么修改 编辑:程序博客网 时间:2024/05/20 10:55
任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35
7. 正式进入用户程序的局部空间
67 mov ebx,message_168 call far [fs:PrintString]69 70 mov eax,100 ;逻辑扇区号10071 mov ebx,buffer ;缓冲区偏移地址72 call far [fs:ReadDiskData] 73 74 mov ebx,message_275 call far [fs:PrintString]76 77 mov ebx,buffer78 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 emptyA_DIR = /home/cjy/a.imgC_DIR = /home/cjy/c.imgall:$(BIN).PHONY:all cleanc13_mbr.bin:c13_mbr.asm nasm $< -o $@ dd if=$@ of=$(A_DIR)c14_core.bin:c14_core.asm nasm $< -o $@ dd if=$@ of=$(C_DIR) bs=512 seek=1 conv=notruncc13.bin:c13.asm nasm $< -o $@ dd if=$@ of=$(C_DIR) bs=512 seek=50 conv=notruncempty:diskdata.txt dd if=$< of=$(C_DIR) bs=512 seek=100 conv=notrunc touch $@clean: $(RM) $(BIN)
8.2. 编译
make之后,我们发现报错了:
c14_core.asm:645: error: operation size not specifiedc14_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_6871 call sys_routine_seg_sel:put_string872873 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,敬请关注…
1 0
- 任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35
- 任务和特权级保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记27
- 任务和特权级保护(二)——《x86汇编语言:从实模式到保护模式》读书笔记32
- 任务和特权级保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记34
- 任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36
- 进入保护模式(一)——《x86汇编语言:从实模式到保护模式》读书笔记12
- 进入保护模式(二)——《x86汇编语言:从实模式到保护模式》读书笔记14
- 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17
- 程序的加载和执行(四)——《x86汇编语言:从实模式到保护模式》读书笔记24
- 存储器的保护(二)——《x86汇编语言:从实模式到保护模式》读书笔记19
- 存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18
- 存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20
- 任务切换的方法——《x86汇编语言:从实模式到保护模式》读书笔记37
- 任务切换——《x86汇编语言:从实模式到保护模式》读书笔记38
- 代码段间转移控制时的特权级检查(JMP/CALL)——《x86汇编语言:从实模式到保护模式》读书笔记28
- 访问数据段时的特权级检查,修改SS时的特权级检查——《x86汇编语言:从实模式到保护模式》读书笔记30
- 页目录项和页表项——《x86汇编语言:从实模式到保护模式》读书笔记43
- 硬盘和显卡的访问与控制(一)——《x86汇编语言:从实模式到保护模式》读书笔记01
- 欢迎使用CSDN-markdown编辑器
- Android 自定义组合控件
- 交换两个变量的值
- SDAU练习三1019
- 自定义折线图
- 任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35
- 杭电 OJ 1028 整数划分
- c++作业6
- 面试笔试算法目录
- 模拟实现顺序表
- ReactNative(二)——HelloWorld
- c++第六次实验
- LeetCode 91. Decode Ways(解码方法)
- 【Spring Framework 深入】—— IoC容器初始化 -> Bean定义资源的载入解析