《操作系统真象还原》特权级

下面是看第五章特权级的收获

特权

简介

  什么是特权?顾名思义,如果特权级别高的,就能拥有更强大的能力,能访问低特权不能访问的数据。操作系统将特权分为四层,分别为0、1、2、3,0是最高特权级别,3是最低特权级别。特权级别为0一般时由操作系统占有,特权级别1、2是由驱动程序和虚拟机占有,而用户程序一般都在特权级别3的级别下,也就是最低特权级别,能拥有的能力是最低的。

TSS

  TSS是一种描述任务状态的数据结构,每一个任务都会有这样的一个结构。为什么要描述这种结构,是因为在特权级别转移的时候会用到这个结构,但TSS不仅仅用于特权级别转移,既然它是描述任务状态的,那它必然也包含任务的其它信息。

  那什么是任务呢?在没有操作系统内核的情况下,任务就是进程,一段独立的程序运行起来就是一个任务;但在有操作系统的情况下,任务就不仅仅包括用户的进程了,它还包含内核程序,用户进程处于特权级别3,内核程序处于特权级别0,即一个任务是有可能从特权级别3的用户程序跳到特权级别0的内核程序的,反之亦然。

  先来看看TSS的整体结构:

  我们关注一下TSS结构偏移4到偏移27的三个栈指针,包括ss和esp。一个任务最多有4个栈,每个特权级别会用到一个独立的栈,但并不是每个任务都会有4个栈,因为不是每个特权级别都会用到。为什么每个特权级别的栈是独立的,而不是共用一个栈呢?这是因为如果共用一个栈,容易导致交叉引用引起混乱,并且一个栈也比较容易导致溢出。

  那既然至多有4个栈,那为啥TSS只有三个栈指针信息呢?esp0和ss0、esp1和ss1、esp2和ss2分别代表特权级别0、1、2的栈指针信息,唯独没有特权级别3的栈指针。

  要理解这个问题,我们首先得知道为什么要用到TSS的这三个栈指针信息。

  分两种情况,一种是从低特权级别转移到高特权级别,一种是由高特权级别转移到低特权级别。

  ①低特权级别转移到高特权级别时,栈也要由低转到高(省略的是特权级别这几个字,下面也是),所以处理器就会在TSS结构里面找到高特权级别的栈信息,并转移到高特权级别的栈上。这种情况下,只需要知道高特权级别的栈信息,所以作为最低特权级别的3的栈信息是不需要在TSS记录的。

  ②高特权级别转移到低特权级别时,高转低之前一般都有低转高的过程。这种情况下是不会用到TSS的,这是因为低转高时已经将低的栈指针压进高的栈里面了,所以只需要从高的栈里面获取低的栈指针即可返回到低的栈上。

  另一个值得注意的点是,低转高时,由于高特权级别下执行指令时不免会对高特权级别的栈进行操作,此时高的esp就会变更,但是TSS里面的esp并不会跟着变更,如果要变更,也只有操作系统直接对TSS操作才会变更。

  

猜你喜欢

转载自www.cnblogs.com/thougr/p/12210220.html