`

(第三章 10)“代码段间跳转” 和 “访问数据段”

 
阅读更多


下面说明代码段和数据段的访问:


一、代码段间跳转


1、普通(直接)跳转:

JMP Selector:0 或 CALL Selector:0

1)一致代码段(JMP&CALL)

要求:CPL>=DPL,RPL不作检查

特权变化:跳转后程序CPL=跳转前程序CPL

2)非一致代码段(JMP&CALL)

要求:CPL=DPL & RPL<=DPL

特权变化:跳转后程序CPL=目标代码段DPL


2、通过调用门跳转:

JMP 调用门Selector:0 或 CALL 调用门Selector:0 (注意:此时如果选择子后面跟着32位偏移量也不会被CPU使用,因为调用门描述符已经记录了目标代码的偏移)


step1: 要求:指示调用门的选择子的RPL<=门描述符DPL & 当前代码段的CPL<=门描述符的DPL。


只有满足以上条件时,CPU才会进一步从调用门描述符中读取代码段的选择子或地址偏移。而从调用门中读取代码选择子和地址偏移后,跟普通跳转又站在同一起跑线上了。

唯一不同的是CPU会将目标代码段RPL清0。此后需要分类讨论,如下:


step2:

1)一致代码段(JMP&CALL)  <------------------------------------------------------------------------------------------------------

要求:CPL>=DPL,RPL不作检查(因为RPL总被清0)                                                        |

特权变化:跳转后程序CPL=跳转前程序CPL                                                                        |

                                                                                                                                             比较

2)非一致代码段(JMP)                                                                                                                |

要求:CPL=DPL,RPL不作检查(因为RPL总被清0)                                                          |

特权变化:跳转后程序CPL=目标代码段DPL                                                                        |

3)非一致代码段(CALL)  <------------------------------------------------------------------------------------------------------------

要求:CPL>=DPL,RPL不作检查(因为RPL总被清0)

特权变化:跳转后程序CPL=目标代码段DPL(CPL>DPL的情况下,特权级发生跃迁)


二、访问数据段

数据段:特权级低->高:NO | 特权级高->低:YES | 特权级同级之间:YES


注意:

1、一致代码段:无论那种方式跳转到一致代码段,CPL都不会改变(不变化为目标代码段的DPL),也即加载目标代码段选择子时,只加载高14位,表示CPL的低2位保持不变。

因此,“一致”的意思就是——代码段被调用执行时,不使用自己描述符的DPL,而采用调用这特权级,CS的低2位保持不变(与“调用者保持一致”)

2、非一致代码段:无论采用哪种方式跳转到非一致代码段,CPL都发生变化,也即在加载目标代码段选择子时,将整个选择子放入到CS中。

3、为了访问调用门,调用者程序的特权级CPL必须小于或等于调用门的DPL。调用门段选择符的RPL也要同调用CPL一样遵守相同的规则,即RPL也必须小于或等于调用门的DPL。如图:



 



参考:

http://www.cnblogs.com/wanghj-dz/archive/2011/04/23/2025840.html

  • 描述: 通过调用门跳转的特权级检查
  • 大小: 14.4 KB
分享到:
评论

相关推荐

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统...

    linux 内核源代码分析

    第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断请求队列的初始化 3. 4 中断的响应和服务 3. 5 软中断与Bottom Half 3.6 页面异常的进入和返回 3. 7 时钟...

    linux内核源代码情景分析

    第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8...

    《javaScrip开发技术大全》源代码

    第3章(\代码\第03章) • sample01.htm 转换成数字型 第4章(\代码\第04章) • sample01.htm 字符串直接量 • sample02.htm 使用转义字符 • sample03.htm 数组直接量的使用方法...

    Linux内核情景分析(非扫描版)

    第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断请求队列的初始化 3. 4 中断的响应和服务 3. 5 软中断与Bottom Half 3.6 页面异常的进入和返回 3. 7 时钟中断 3. 8...

    Linux内核情景分析

    第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断请求队列的初始化 3. 4 中断的响应和服务 3. 5 软中断与Bottom Half 3.6 页面异常的进入和返回 3. 7 时钟中断 3. 8...

    软件工程与软件测试自动化教程

    第3章 软件工程范畴中软件测试的一般性理论 3. 1 基本概念 3. 1. 1 软件测试基础 3. 1. 2 静态方法和动态方法 3. 1. 3 黑盒测试和白盒测试 3. 1. 4 软件测试的步骤 3. 1. 5 测试阶段的信息流 3. 2 单元测试 ...

    C#本质论(第3版)

    第3章 运算符和控制流 3.1 运算符 3.1.1 一元运算符正和负 3.1.2 二元算术运算符 3.1.3 圆括号运算符 3.1.4 赋值运算符 3.1.5 递增和递减运算符 3.1.6 常量表达式 3.2 流控制概述 3.2.1 if语句 3.2.2 ...

    C#与.NET技术平台实战演练.part2

    修改数据15-6增加核对程序运作的程序代码第16章编写Master/Detail数据库应用程序16-1建立Master/Detail关系的DataSet16-2自定义dataGrid展示样式16-3设计显示明细数据的表单16-4 使用BindingContext浏览数据第17...

Global site tag (gtag.js) - Google Analytics