【0】概念定义

  • 0.1)一致代码段:

    简单理解,就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码, 但是特权级高的程序不允许访问特权级低的数据.

    通常这些共享代码,是”不访问”受保护的资源和某些类型异常处理。比如一些数学计算函数库,为纯粹的数学运算计算,

    被作为一致代码段.

    一致代码段的限制作用

    1.特权级高的程序不允许访问特权级低的数据:核心态不允许调用用户态的数据.

    2.特权级低的程序可以访问到特权级高的数据.但是特权级不会改变:用户态还是用户态.

  • 0.2)非一致代码段:

    为了避免低特权级的访问而被操作系统保护起来的系统代码.

    非一致代码段的限制作用

    1.只允许同级间访问.

    2.绝对禁止不同级访问:核心态不用用户态.用户态也不使用核心态. (调用门除外)

    [problem] 那低特权级段如何对高特权级的非一致代码段进行访问呢?

    通常低特权代码必须通过 “门” 来实现对高特权代码的访问和调用.

  • 0.3)门

    为了对具有不同特权级的代码段提供受控的访问,处理器提供了称为门描述符的特殊描述符集,有4种门描述符:

  • 1. 调用门(call gate), 类型TYPE=12: 用于在不同特权级间实现受控的程序控制转移;
  • 2. 陷阱门(trap gate),类型TYPE=15:用于调用异常和中断的处理程序;
  • 3. 中断门(interrupt gate),类型TYPE=14:用于调用异常和中断的处理程序;
  • 4. 任务门(task gate),类型TYPE=5:用于任务切换;

Example-看个荔枝:

E1)问题:代码A调用代码B,运用调用门G,而调用门G相当于一个选择子的角色(看它的数据结构,你就知道);

当然,要知道,代码A调用代码B,实际上是通过jmp selector:0 跳转到代码B的, 而selector存储在调用门G中;

E2)调用过程如下:

  • (1)而代码A 访问 G时,相当于访问一个数据段,要求代码A的CPL和RPL都小于或等于DPL_G,即CPL和RPL需要更高的特权级上。(数值上而言)
  • (2)接着,还要比较CPL和DPL_B;
    • (2.1)若B是一致代码段的话,要求DPL_B <= CPL;
    • (2.2)如果是非一致代码段的话,call指令和jmp指令又有不同;
      • (2.2.1)call调用,要求DPL_B <= CPL
      • (2.2.2)jmp调用,要求DPL_B = CPL

in a word: 通过调用门和call指令,可以实现从low level 到 high level 的转移, 无论目标代码是一致还是非一致。(干货)

  • 0.4)TSS描述符

1)使用调用或跳转指令,任何可以访问TSS 描述符的程序都可以进行任务切换。

2)可以访问TSS 描述符的程序其 CPL 必须小于或等于 TSS描述符的 DPL, 要知道, 大多数系统中, TSS描述符的DPL字段 设置成小于 3, 这样一来,只有具有特权级的软件可以执行任务切换操作;

软件或处理器可以使用如下方法来调度一个任务的执行:

(1)使用CALL 指令明确调用一个任务;

(2)使用JMP 指令明确跳转到一个任务(Linux 内核使用的方式);

(3)(由处理器)隐含地调用一个中断句柄处理任务;

(4)隐含地调用一个异常句柄处理任务;

任务门描述符

  • 0)定义:任务门描述符中的TSS 选择子字段指向 GDT 中的一个TSS 段描述符, 这个TSS选择子中的RPL不用;
  • 1)任务门描述符中的 DPL 用于在任务切换时控制对 TSS 段的访问:
    • 1.1)当程序通过任务门调用或跳转到一个任务时,程序的CPL 以及 指向任务门的门选择子的RPL值 必须小于等于任务门描述符的DPL;
    • 1.2)程序可以通过任务门描述符或TSS段描述符来访问一个任务;

【2】关联关系

Attention(感觉os的 程序(被调用者), 和程序(调用者)是关联数据库中的多对多的关系)(干货)

  • A1)首先, 要知道 操作系统的程序有些是共享的,有些是非共享的;而程序的调用者,有些调用者是可以访问非共享程序,有些调用者是不可以访问非共享程序的;而所有调用者都可以访问共享程序。(一致代码段就是共享的, 非一致代码段就是非共享的)
  • A2)显然,os 通过设置高特权级来保护某些程序,以防被不使用TSS机制的低特权级程序调用, 而通过设置低特权级来共享某些程序;

    A3)通过TSS 实现任务切换,给低特权级的调用者和高特权级的被调用者搭建起了一个桥梁;

那 os 如何实现允许某些调用者访问非共享的程序呢?

那就引入了TSS机制来允许低特权级的调用者访问高特权级的被调用者;

程序员创建TSS描述符, TSS选择子, TSS所占的内存空间,然后调用者通过调用TSS选择子(装有TSS选择子的任务门描述符的选择子) 实现低特权级转移到高特权级;

因为-Reason:

  • R1)未引入门或TSS机制前, CPU的 特权级检查规则是:调用者的CPL 和 被调用者选择子的RPL 去和 被调用者的DPL 进行比较,检验;(具体规则,这里略去)
  • R2)引入TSS 机制后, CPU的特权级检查规则是:
    • R2.1)若使用 TSS选择子 实现任务切换:调用者的CPL 必须小于或等于TSS描述符的DPL;
    • R2.2)若使用 装有调用TSS选择子的任务门描述符 实现任务切换:调用者的CPL和指向任务门的门选择子的RPL 必须小于等于任务门描述符的DPL,注意,当使用任务门时,目标TSS段描述符的DPL忽略不用;
  • R3)总结:如果使用TSS机制实现任何切换的话, 调用者的特权级和被调用者的特权级完全是隔开的, 没有任何比较或检验的规则在里面;

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于一致/非一致代码段与TSS 关系的个人看法的更多相关文章

  1. 不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }

    [0]写在前面 0.1)我们讲 CPU的保护机制,它是可靠的多任务运行环境所必须的: 0.2) CPU保护机制:分为段级保护 + 页级保护: 0.2.1)段级保护分为:段限长 limit 检查.段类型 ...

  2. 数据段描述符和代码段描述符(一)——《x86汇编语言:从实模式到保护模式》读书笔记10

    一.段描述符的分类 在上一篇博文中已经说过,为了使用段,我们必须要创建段描述符.80X86中有各种各样的段描述符,下图展示了它们的分类. 看了上图,你也许会说:天啊,怎么这么多段描述符啊!我可怎么记住 ...

  3. 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)

    [0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是 ...

  4. Java 面向对象—非静态代码块

    一.非静态代码块 1.声明格式 [修饰符] class 类名 { { 非静态代码块 } } 2.非静态代码块中的代码执行时机 (1)在"每次"创建对象的时候执行 (2)比构造方法早 ...

  5. JavaScript代码段整理笔记系列(二)

    上篇介绍了15个常用代码段,本篇将把剩余的15个补齐,希望对大家有所帮助!!! 16.检测Shift.Alt.Ctrl键: event.shiftKey; //检测Shift event.altKey ...

  6. linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】

    转自:http://blog.csdn.net/gongweijiao/article/details/8207333 原文参见:http://blog.163.com/xychenbaihu@yea ...

  7. java静态变量、静态方法和静态代码段

    先上实例 public class TestStatic { public static String staticString = "this is a static String&quo ...

  8. 浅谈c语言代码段 数据段 bss段

    代码段.数据段.bss段 (1)编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. (2)代码段:代码段就是程序中的可执行部分,直观理解 ...

  9. JAVA运行程序代码段

    我记得那时候刚毕业.学习JAVA恐惧是这里,它是关于JAVA称号.我总是不正确.如今,这最后审查.看了好半天.得赶紧把刚才学习到的那点东西记下来. 一.关于static的代码段运行顺序 运行结果例如以 ...

随机推荐

  1. 2016百度之星资格赛 Round1(2,3,4题)

    Problem B Accepts: 2515 Submissions: 9216 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...

  2. (4)ASP.NET内置对象1

    一.Response 把数据从服务端发送到客户端 Response.Write() 在页面上输出数据 Response.WriteFile(@"F:\WriteFile.txt") ...

  3. Linux系统日常运维-修改IP地址

    分享下高手写的很好的文章 IP地址.子网掩码.网络号.主机号.网络地址.主机地址 step 0: check the iptables.selinux service iptables iptable ...

  4. Loj #124. 除数函数求和

    链接:https://loj.ac/problem/124 就是筛一下积性函数. #include<bits/stdc++.h> #define ll long long #define ...

  5. python 编程模型

    数据模型(译)   image.png 1 对象(object).类型(type)和值(value) python中所有的数据都是通过对象(object)或者对象之间的关系来表示 每个对象(objec ...

  6. 2016北京集训测试赛(七)Problem A: 自动机

    Solution 注意到这一题并不要求字符串最短或者是字典序最小, 因此直接构造就可以了. 我们对于每个点\(u \ne 0\)找到一个串\(S\), 使得\(T(u, S) = T(0, S)\), ...

  7. centos6.7下安装配置vnc

    vnc是一款使用广泛的服务器管理软件,可以实现图形化管理,下面简单介绍一下如何在centos6.7下安装vnc. 1.安装vncserver yum install tigervnc tigervnc ...

  8. dedecms调用文章发布日期

    <span>[field:pubdate function="MyDate('m-d',@me)"/]</span>

  9. EasyMvc入门教程-基本控件说明(10)图片轮播导航

    图片轮播导航大家一定很常见,尤其是中小型建站系统的必备神器..:) 先上图上例子,看效果如下: 实现代码如下: @{ var data = new List<PhotoPlayerItem> ...

  10. Android - 显示手机执行的Activity

    显示手机执行的Activity 本文地址:http://blog.csdn.net/caroline_wendy 手机中,须要调试程序的界面,能够高速进行定位,使用Android开发工具ADB(And ...