momo zone

调核人的blog

关于保护模式下权限检查

这里有几处是比较重要的用来进行权限检查的依赖:
CPL:当前特权级,存在于cpu中cs和ss段寄存器的第0和第1位。(注意:段寄存器加载的是段选择符,而段选择符的第0和第1位是RPL)
DPL:描述符特权级,存在于相关描述符的DPL字段中。
RPL:请求特权级,在使用长跳转等指令通过段选择符来载入段描述符时,段描述符的第0和第1为PRL。
 
根据检查的类别分为
1.数据段访问权限检查
2.代码段访问权限检查
3.各种门机制的访问权限检查
4.堆栈段访问权限检查
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

1. 数据段访问权限检查
 这个比较简单,不过要明确一点,就是数据段的权限问题仅仅是检查,不存在运行级切换,即访问不同级别的数据段不会像代码段那样导致运行级变更。 检查的时候,一方是DPL另一方是CPL和RPL 。必须CPL<=DPL并且RPL<=DPL才能访问。归纳一下就是必须MAX(CPL,RPL)<=DPL。记住加载完之后系统运行级不变哦。所以CPL也不会有任何变化。
 
2.代码段访问权限检查
这个就相当复杂和麻烦了,因为代码段的加载涉及到运行级的改变,以及使用不同方式(门)来加载描述符的过程中所涉及到众多细节。

代码段的加载一般有下面的指令触发:JMP,CALL,RET,INT,IRET以及异常和中断。

其中JMP和CALL后面的操作数可以是如下类型:
(1)操作数是目标代码段的段选择符,这个是最常用到的。
(2)操作数指向一个调用门描述符, 该描述符含有目标代码段的段选择符。
(3)操作数指向一个TSS。该TSS中含目标代码段选择符。
(4)最复杂的一种,结合(2)和(3):操作数指向一个调用门描述符,该描述符含有一个TSS,该TSS中含目标代码段选择符。

这里先说第1种情况,也是最简单和直接的一种:
这种情况下检查权限除了以来CPL,RPL,DPL 还有C标志(代码一致标志)。
当C=0时(非一致代码)时,必须CPL=DPL并且RPL<=DPL才能访问,否则将出现“一般保护性异常”。一旦这个目标非一致代码段被加载到CS,那么CPL不会改变,无论RPL是不是和CPL一致,尽管加载到CS的是段选择服符(包含RPL)。

当C=1时(一致代码)时,必须CPL>=DPL。并且忽略关于RPL的任何检查。同样这种情况下,载入目标一致代码段后,CPL不会变化。但注意这时已加载代码段的DPL和CPL有可能不同了!!一致代码往往用在这种情况下:比如除0错误,发生异常,数学库需要访问更高特权级下的异常处理代码但又要保证不能访问更高特权级下的其他代码。这样一致代码段就扮演了这个角色,毕竟CPL没有变化嘛。
可以把一致代码段看作一种另类的代码段。实际上操作系统中的大部分代码段都是非一致代码段。

接下来是第2种情况,通过门描述符会比较复杂一些
第3种和第4种情况太复杂,很多系统实现都没有采用这种机制,不做介绍。

3.各种门机制的访问权限检查
门描述符又分为4种:
调用门(call gate)
陷阱门(Trap gate)
中断门(Interrupt gate)
任务门(Task gate)

只讲解一下相对简单的调用门:
这里的权限检查依赖以下:
  当前CPL
  调用门选择符RPL
  调用门描述符中的DPL
  目的代码段描述符中的DPL
  目的代码段描述符中的C标志

实际检查时还会根据触发指令的不同而有不同的检查规则:
CALL:
CPL<=调用门的DPL且RPL<=调用们的DPL
一致/非一致目的代码段都只要求CPL>=DPL。如果真的CPL>DPL的话,那么还将会把DPL赋给CPL。这样就能让低特权级的代码切换到高特权级代码了!当然也会引起堆栈切换。

JMP:

CPL<=调用门的DPL且RPL<=调用门的DPL,一致目的代码段要求DPL<=CPL,非一致目的代码段要求DPL=CPL。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: