关于一致/非一致代码段与TSS 关系的个人看法
【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机制实现任何切换的话, 调用者的特权级和被调用者的特权级完全是隔开的, 没有任何比较或检验的规则在里面;
版权声明:本文为博主原创文章,未经博主允许不得转载。
最新文章
- 【Java并发系列01】Thread及ThreadGroup杂谈
- effectiveC++ 内存管理 学习笔记
- stm32 usart 异步传输示例
- 通过 UDP 发送数据的简单范例
- C#并行编程中的Parallel.Invoke
- OS X 添加环境变量
- SVN代码的回滚二
- ARM Cortex-M instructions
- MVC3中 swfupload 按钮不显示 解决方案
- windows API中的各种字符串的本质
- surfaceView画图
- 关于jQuery的条件判断问题
- Vue学习笔记-Vue基础入门
- Python之shutil模块(复制移动文件)
- UOJ#103. 【APIO2014】Palindromes PAM模板题
- RabbitMQ教程(二) ——linux下安装rabbitmq
- python框架之Django(11)-中间件
- Flask之勾子,错误捕获以及模板语法
- Java里多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)
- WAF Bypass FUZZ小脚本