特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS
【0】README
text description from orange’s implemention of a os .
【1】特权级概述
当当前代码段试图访问一个段或者门时,目标段的DPL将会和 CPL 以及段或门选择子的RPL相比较,如何比较:(这里是干货)
- (1)数据段: DPL规定了可以访问此段的最低特权级;如一个数据段的DPL=1,那么只有CPL=0或1的程序才有权访问;
- (2)调用门: DPL规定了当前执行的程序或任务可以访问此调用门的最低特权级(这与数据段是一致的);
- (3)TSS: DPL规定了可以访问此TSS的最低特权级(这与数据段的规则是一致的);
- (4)非一致代码段(不使用调用门的情况下): DPL规定了访问此段的特权级;如一个非一致代码段的特权级为0,那么只有CPL=0的程序才可以访问;
- (5)一致代码段和非一致代码段(使用调用门的情况下): DPL规定了访问此段的最高特权级;如一个一致代码段的DPL=2,那么CPL=0或1 的程序将无法访问此段;
- (5.1)即是说, 一致代码段允许低特权级访问高特权级,不允许高特权级访问第特权级;
- (5.2)通过调用门访问的非一致代码段的特权级验证也是这样: 允许低特权级访问高特权级,不允许高特权级访问低特权级;
- (6)以上的特权级检验(除开RPL)的话,都是允许同级特权级代码段间的访问的;
【2】RPL-requested privilege level-请求特权级
- 2.1) RPL 是通过段选择子的第0位和第1位表现出来的;
- 2.2)即是说, 如果RPL的数字比CPL的数字大(即,其特权级比较小),那么RPL将会起决定性作用, 反之亦然;
- 2.3) os 过程往往用 RPL 来避免低特权级应用程序访问高特权级段内的数据;
【3】不同特权级间的转移
使用jmp 或 call 指令可以实现以下4 种转移:
- 3.1) 目标操作数包含目标代码段的段选择子;
- 3.2) 目标操作数指向一个包含目标代码段选择子的调用门描述符;
- 3.3) 目标操作数指向一个包含目标代码段选择子的TSS;
- 3.4) 目标操作数指向一个任务门, 这个任务门指向一个包含目标代码段选择子的TSS;
我们来看看通过调用门来访问代码段是如何进行特权级验证的?(干货)
假设我们想由代码A 转移到 代码B,运用一个调用门G ,即调用门G中的目标选择子指向代码B的段。进行特权级验证,涉及这么几个要素:CPL、RPL、代码B 的DPL(DPL_B)、调用门G 的DPL(DPL_G)。特权级验证方法如下(methods):
- M1) A访问G 这个调用门时,规则相当于访问一个数据段,要求 CPL 和 RPL 都小于或者等于DPL_G。即是,CPL 和 RPL 需要比 DPL_G 更高的特权级上;
- M2) 如果M1的验证通过的话,系统还要比较CPL 和 DPL_B;
- M2.1) 如果代码B 是一致代码段的话,要求DPL_B <= CPL;
- M2.2) 如果代码B 是非一致代码段的话,call 指令 和 jmp指令又会不同;
- M2.2.1) 在用call 指令时,要求 DPL_B <= CPL;
- M2.2.2) 在用jmp时,只能是 DPL_B=CPL;
使用调用门进行转移时特权级检验的规则(call + jmp 跳转指令)
将上图做个总结-Conclusion:
- C1)目标是一致代码段: DPL_B<=CPL<=DPL_G && RPL<=DPL_G
- C2)目标是非一致代码段
- C2.1)采用 call 指令调用: DPL_B<=CPL<=DPL_G && RPL<=DPL_G
- C2.2)采用 jmp 指令调用: DPL_B<=CPL<=DPL_G && RPL=DPL_G
(Attention)
因为从低特权级 跳转到 高特权级,是需要切换堆栈的,所以这就必须要用到TSS了。TSS里面存储有ring0~ring2共3个特权级的堆栈信息,当跳转到那个ring,就将其堆栈抽取出来赋给 ss 和 sp; 参见 http://blog.csdn.net/PacosonSWJTU/article/details/48657053
特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS的更多相关文章
- CPU Rings, Privilege, and Protection.CPU的运行环, 特权级与保护
原文标题:CPU Rings, Privilege, and Protection 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的 ...
- Flutter路由跳转父级页面向子页面传参及子页面向父级页面传参
Flutter中页面通过路由跳转传参主要分两种,一种是通过push()跳转时根据设定的参数进行传参,另一种是通过pop()返回时进行传参. 父级页面向子页面push()传参 假设从A页面跳到B页面可能 ...
- 128_Power BI父级排名TOPN子级动态展示
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前些天在和朋友交流Power BI中有这样一个需求,按照父级排名后,需要显示出父级TOPN的子级明细. 如下&l ...
- ThinkPHP 关联模型中查询某条记录的父级(非查询子级)
数据表 id cat_name cat_pid 76 手机.数码 0 84 手机配件 76 86 蓝牙耳机 84 从属关 ...
- jquery选择器 之 获取父级元素,子元素,同级元素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link href ...
- SQL根据指定节点ID获取所有父级节点和子级节点
--根据指定节点ID获取所有子节点-- WITH TEMP AS ( SELECT * FROM table_name WHERE Id=' --表的主键ID UNION ALL SELECT T0. ...
- SQL根据指定节点ID获取所有父级节点和子级节点(转载)
--根据指定节点ID获取所有子节点-- WITH TEMP AS ( ' --表的主键ID UNION ALL SELECT T0.* FROM TEMP,table_name T0 WHERE TE ...
- 让一个父级div根据子级div高度而自适应高度
需求是点击上传的时候进行子级div高度不定,相对来说父级div高度也不能固定,把元素都设置成普通标准流,然后样式可以使用margin内边距或者padding外边距来进行调节 放上代码供参考: .opu ...
- js和jquery获取父级元素、子级元素、兄弟元素的方法
最近工作中总遇到取各种父啊子啊兄弟姐妹啊,每次都得查,这次整理个全乎的~ [js的获取方式] function dom(){ var a = document.getElementByIdx ...
随机推荐
- 無法使用 system/bin/r 讀取 pmic pm8937 hardware regitster 的原因
Platform Qualcomm MSM8917 + PM8937 + PMI8940 起因 同事問我 PM8937 的 VREG_L17 如何設定成 3.3V, 從 PM8937 hardware ...
- AC日记——任务查询系统 洛谷 P3168
题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei ...
- 2018 Multi-University Training Contest 7
GuGuFishtion dls真厉害,快速求$\sum_{a=1}^n \sum_{b=1}^m gcd(a,b) $的个数,我想的方法是根据上节课dls讲的方法,要容过来容过去,这次不用了. 则$ ...
- 2017广东工业大学程序设计竞赛决赛 F(LCA + 斐波那契数列性质)
不能组成三角形的极端数列:1,1,2,3,5,8,13,21,……到第50项时候肯定到1e9了…… 如果两个点之间距离大于50,则直接Yes…… 否则的话直接暴力取出所有边,然后升序排序,判断一下就可 ...
- Light oj 1125 - Divisible Group Sums (dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1125 题意: 给你n个数,q次询问,每次询问问你取其中m个数是d的整数倍的方案 ...
- CSS定位与布局:浮动
浮动的特点 浮动(float)属性提出的作用是实现文字的环绕效果,一个元素浮动后,会脱离普通流.主要的特点如下: 浮动的元素会向左或者向右移动直到它的外边缘接触容器框(containing blo ...
- Java---Static内存图详解
案例: 输出结果 内存图: 执行流程: java文件通过编译成class文件,class文件通过类加载器加载到方法区中,程序首先会加载核心类库,也就是你的程序想要运行所需要的一些最基本的类.接着程序会 ...
- 为Zepto添加Slide动画效果
一.缘由 公司的移动端项目,采用zepto为主要框架,但是zepto毕竟是精简版的jquery,体积小了,功能自然没有这么强大,特别是动画和选择器这两块,需要我们自己去拓展. 在项目开发过程中,很多页 ...
- Display LOV (List Of Values) Using Show_Lov In Oracle Forms
Show_Lov Function is used to display list of values (LOV) in Oracle Forms. It returns TRUE if the us ...
- cocos3.7.1 mac 创建项目
cocos2d-x-3.7/tools/cocos2d-console/bin目录下,输入命令: ./cocos.py new HelloWorldDemo -p com.coco2dx.org -l ...