任务和特权级保护(四)——《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相关推荐

  1. 访问数据段时的特权级检查,修改SS时的特权级检查——《x86汇编语言:从实模式到保护模式》读书笔记30

    1. 访问数据段时的特权级检查 为了访问数据段,数据段的选择子必须被加载进段寄存器(ES,ES,FS,GS,SS).在把一个段选择子加载进段寄存器之前,处理器会进行特权级检查(如下图所示). 在数值上 ...

  2. X86汇编语言从实模式到保护模式16:特权级和特权级保护

    目录 1. 特权级保护机制 1.1 基础段保护机制的不足 1.2 特权级划分 1.3 特权级的表示 1.3.1 当前特权级CPL 1.3.2 描述符特权级DPL 1.3.3 请求特权级RPL 1.4 ...

  3. 【OS修炼指南目录】----《X86汇编语言-从实模式到保护模式》读书笔记目录表

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 本文是将个人 ...

  4. x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上

    目录: 什么是任务 任务由什么组成 任务门描述符是什么东东?有了TSS描述符为什么要有任务门描述符? 参考文献 什么是任务 任务(task)是处理器可以分配.执行.挂起的工作单位,笔者认为和我们操作系 ...

  5. x86汇编语言从实模式百度云_x86汇编语言:从实模式到保护模式

    x86汇编语言:从实模式到保护模式2013年1月由电子工业出版社出版发行,总共6000行的源代码,全方位地向读者展现汇编语言程序设计之美.尽管汇编语言也是一种计算机语言,但却是与众不同的,与它的同类们 ...

  6. [书]x86汇编语言:从实模式到保护模式 -- 第14章 任务和特权级保护,调用门、LDT、TSS、TCB

    # 加载用户程序 Part 1.TCB, Task Control Block, 任务控制块 分配内存作为该任务的TCB,并插入至TCB链表. Part 2.LDT, Locak Descriptor ...

  7. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述...

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

  8. <X86汇编语言:实模式到保护模式>四十四 协同式任务切换

    多任务和任务切换概述 什么时候切换到另一个任务? 以及切换到哪一个任务? 都是操作系统决定. 内核任务的创建和I/O特权级IOPL 0特权级始终高于或等于 IOPL 先使用and,将iopl清0,再使 ...

  9. X86汇编语言从实模式到保护模式20:平坦模型

    1 引入平坦模型(Flat Model)的原因 1.1 内存管理模型变迁 1.1.1 分段模型 1.1.1.1 基本特点 1. 在程序中按结构组织为多个段 2. 在加载程序时,为程序中的每个段创建段描 ...

最新文章

  1. 大块数据申请及DMA
  2. 【题解】 bzoj2748 [HAOI2012]音量调节 (动态规划)
  3. Android studio | From Zero To One ——TextView实现跑马灯效果及聊天室、文字直播间
  4. C/C 代码规范注释有哪些讲究?
  5. ROS中阶笔记(一):机器人系统设计—ROS系统下连接外部传感器
  6. linux noprobe参数,find 命令的参数详解
  7. ES 6理解 let
  8. BUG记录 —— JSON转对象部分字段丢失
  9. 读书印记 - 《批判性思维工具》
  10. swagger注释API :@ApiModel
  11. 广州坐标系转换大地2000_如何将百度坐标转换为国家2000坐标系?
  12. shader篇-立方体纹理
  13. python中的Empty suite
  14. 微软文件共享服务器进程,Windows Server“8”– 将服务器应用程序存储转移到 Windows 文件共享...
  15. 浙江互联网金融联合会成立三周年走进海宁
  16. Sourcetree 使用
  17. undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocat
  18. PIM-DM协议原理
  19. IT人需要了解的认证大全(持续补充)
  20. Node.js的用户交互(使用readline模块)

热门文章

  1. NYOJ 661 亲亲串
  2. 开始简单项目的第二周
  3. HttpContext.Cache属性
  4. #include NOIP2009 Junior 细胞分裂 ——using namespace wxl;
  5. 20个常用Linux性能监控工具/命令
  6. ubuntu下软件删除
  7. 使用sprc097的DSP281x_usDelay.asm
  8. 编程的精髓:发现问题,解决问题
  9. 12月13日主题讨论日
  10. 程序员终身发展规划---应对中国软件发展的大环境要求