CPU特权级保护

1.特权级

1.1特权级

处理器段保护机制可以识别0-3共4级特权级,数值越大,特权越小。处理器通过识别CPL、DPL、RPL这三种特权级来进行特权级校验

(1)CPL:CPL是当前正在执行程序或任务的特权级。它存放在CS和SS段寄存器的0位和1位。通常CPL等于当前代码段的特权级。当程序把控制转移到另一个具有不同特权级的代码段中时,处理器就会改变CPL。

(2)DPL:DPL是一个段或门的特权级别。它存放在段或门的描述符的DPL字段中。在当前执行代码段试图访问一个段或门时,段或门的DPL会用来与CPL以及段或门选择符中的RPL做比较。根据被访问的段或门的类型不同,DPL的意义也不同

(3)RPL:RPL是一种赋予段选择符的超越特权级,存放在在选择符的位0和位1中。处理器会同时检查RPL和CPL,以确定是否允许访问一个段。即使程序或任务有足够的特权级CPL来访问一个段,但是如果提供的RPL特权级不足则访问也将拒绝。即:如果段选择符的RPL的数值大于CPL,那么RPL将覆盖CPL(而是用RPL作为检查比较的特权级)。RPL可以用来确保高特权级的代码不会代表应用程序去访问一个段,除非应用程序自己具有访问这个段的权限--这句话来itel手册,比较抽象,后面会讲解。

2.为什么增加RPL

Intel手册上的解释为:The RPL can be used to insure that privileged code does not access a segment on behalf of an application program unless the program itself
has access privileges for that segment.

(RPL能够用来确保具有特权级的代码不会代表另一个应用程序去访问一个段,除非那个应用程序具有访问那个段的权限.)

比方说:A进程的DPL为0,C进程的DPL为1,现在有一个B进程他的DPL为2,这B进程想委托A进程(外围程序可以访问一致代码段的内核)去访问C的数据(内核可以访问外围数据),

如果没有RPL来限制的话,这样的委托访问是可以成功的,但这样是非常不安全的。

有了RPL以后,A进程在访问C的时候还要受到RPL的约束,此时可以将访问C的选择子的RPL设为B的DPL,这样A的访问权限就相当为EPL=max(RPL,DPL)=2,这样他就无法代表B去越权访问C了。(那还要委托A干嘛?反正B如果不够权限,委托谁都没用;如果B有权限,不用委托别人也可以啊?)

有RPL的情形,CPU同时检查CPL和RPL来判断是否允许对一个段的访问。在低特权级代码调用高特权级代码时,你可以把RPL认为是调用者CPL的影子。即使高特权级代码在运行,但它是应低特权级代码的请求,作为低特权级代码的代理在执行任务,在必要的时候,RPL作为对CPL的覆盖,可以削弱当前执行代码的可访问的区域,从而保证高特权级代码不会代表低特权级代码去访问一个后者没有访问权限的段。

这里有一个问题,就是低特权级代码在向高特权级代码传递段选择子时,可以任意设置RPL。所以x86处理器有一条专门的指令ARPL用来纠正RPL。

3.RPL的理解

CPL和DPL都是见字面就能理解含义的。唯独RPL不容易理解。

今天就说说我的理解,将来回头来看看,今天说的到底对不对。

1、- 当前进程的意愿 -

RPL代表了当前进程的意愿(因为是一种request)。注意,是当前进程的意愿而不是别的进程。其次是一种意愿,是否实现还有待CPU的许可。

2、- 不能超越自己的特权级 -

前面的帖子已经说了,RPL可以由当前进程随便写,但是CPU会检查RPL和CPL的取值,如果RPL填写的特权级比自己实际情况还高,CPU就不会认可,仍旧给他当前的权限。

3、- 只能下降权限 -

鉴于上面的原因,使用RPL的真正情况就是当前进程使用比自己低的或者相同的RPL。这种情况最典型的,就是外围程序A调用内核B,然后通过内核B再访问程序C。由于访问的来源是A,所以内核为了安全起见,将RPL(来自A的访问意愿)设置为A的DPL。这样在逻辑上就完整了。内核就不会越俎代庖了。

参考:

http://www.360doc.com/content/11/0429/12/6580811_113130013.shtml

http://blog.csdn.net/MOOD/article/details/4623763

CPU特权级保护

时间: 2024-10-15 22:32:31

CPU特权级保护的相关文章

任务和特权级保护

本文为<x86汇编语言:从实模式到保护模式> 第14章笔记 任务的隔离和特权级保护 任务, 任务的LDT和TSS 程序是记录在载体上的指令和数据, 总是为了完成某个特定的工作, 其正在执行中的一个副本, 叫做任务(Task). 这句话的意思是说, 如果一个程序有多个副本正在内存中运行, 那么, 它对应着多个任务, 每一个副本都是一个任务. 为了有效的在任务之间实施隔离, 处理器建议每个任务都应当具有自己的描述符表, 称为局部描述符表LDT, 并且把属于自己的那些段放到LDT中. 和GDT一样,

任务的隔离和特权级保护

任务,任务的LDT和TSS ??程序是记录在载体上的指令和数据,其正在执行的一个副本,叫做任务(Task).如果一个程序有多个副本正在内存中运行,那么他对应多个任务,每一个副本都是一个任务.为了有效地在任务之间进行隔离,处理器建议每个任务都应该具有他自己的描述符表,称为局部描述符表LDT(Local Descriptor Table).LDT和GDT一样也是用来储存描述符的,但是LDT是只属于某个任务的.每个任务是有的段,都应该在LDT中进行描述,和GDT不同的是,LDT的0位也是有效的,也可以

任务和特权级保护(二)——《x86汇编语言:从实模式到保护模式》读书笔记32

之前做了那么多铺垫,我们终于可以看看第14章的代码了. 对于引导代码和用户程序,依然采用第13章的:对于内核程序(c14_core.asm),编译的时候有几行报错了,只要加上dword即可解决. 1. 为什么要用调用门 在第13章,为了能使用内核提供的例程,用户程序是用call far指令直接转移到内核例程(非一致代码段).因为CPL=目标代码段描述符的DPL=RPL=0,符合下面表格的条件,所以转移是没有问题的. 但是在本章,用户程序工作在3特权级,而非0特权级,所以是无法直接转移的.不过也不

第16课 - 保护模式中的特权级(中)

一种新的描述符:门描述符(Gate Descriptor) 通过门描述符在不同特权级的代码间进行跳转 根据应用场景的不同,门描述符分为: 调用门(Call Gates) 中断门(Interrupt Gates) 陷阱门(Trap Gate) 任务门(Task Gate) 门描述符的内存结构 每一个门描述符占用8字节内存 不同类项门描述的内存含义不同 调用门描述符(Call Gates)的定义 调用门描述符的工作原理 调用门描述符的使用 汇编小贴士 汇编语言中的跳转方式 段内跳转:call,jmp

保护模式特权级概述

在IA32的操作系统中,段被分为了4个特权级,分别为0-3级,有时候我们也叫做ring0-ring3,其中,数值越小特权级越高.如下图所示: 图中,核心代码和数据所在的段的特权级都比较高,一般在ring0,而用户程序所在的段的特权级较低,一般在ring3.当低特权级的任务试图在未被允许的情况下访问高特权级的段时,将会产生常规保护错误. 而处理器是如何区分所在段的特权级,进而对其进行保护的呢?这就不得不提到CPL.DPL和RPL三者了.但是在开始之前,我们需要先了解一下一致代码段和非一致代码段.

第十七课 保护模式中的特权级(下)

问题: 使用调用门如何实现不同特权级代码之间的跳转(如:从高特权级到低特权级)? 不幸的事实: 调用门只支持从低特权级到高特权级执行 无法利用调用门从高特权级到低特权级执行 从高特权级的代码段通过return  far可以返回到低特权级的代码段执行.这时return  far是一个跳转指令,完成从高特权级到低特权级的跳转,这正是我们想要的. return的本质是做跳转的,而不是我们根深蒂固的做返回的.只是最常用的方式是做返回使用. 思路整理: 调用门的特权级跳转: 1.通过远调用(call  f

CPU 实模式 保护模式 和虚拟8086模式

从80386开始,CPU有三种工作方式:实模式,保护模式和虚拟8086模式.只有在刚刚启动的时候是real-mode,等到操作系统运行起来以后就切换到protected-mode.实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存.在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务

第十八课 特权级转移(上)

这一节我们来研究从核心代码特权级转移到应用代码特权级. 首先将boot.asm贴出来如下: 1 org 0x7c00 2 3 jmp short start 4 nop 5 6 define: 7 BaseOfStack equ 0x7c00 8 BaseOfLoader equ 0x9000 9 RootEntryOffset equ 19 10 RootEntryLength equ 14 11 EntryItemLength equ 32 12 FatEntryOffset equ 1 1

《一个操作系统的实现》读书笔记--第三章---不同特权级代码段之间的跳转

http://blog.csdn.net/begginghard/article/details/7262901 1.特权级 2.一致代码段和非一致代码段 3.DPL.RPL.CPL分别代表的含义,存储在什么位置,以及它们之间的关系 4.不同特权级数据段之间的访问规则 5.不同特权级代码段之间的转移 6.代码段之间的转移对堆栈的影响 7.结合pmtest5.asm来见证不同特权级代码段之间的跳转 一.特权级在IA32的分段机制下,特权级总共有4个特权级别,从高到低分别是0.1.2.3.数字越小表