一步步编写操作系统 58 门、调用门与RPL序 3

接前文:

并不是任何当前特权级都可以使用门结构, 在使用门结构之前,处理器要例行公事做特权级检查,参与检查的不只是CPL和DPL,还有RPL,为了说清楚这个检查过程,咱们得先介绍下RPL。

RPL,即请求特权级,为了解释清楚,咱们得多花点工夫好好说道说道。

我们本节始终在说特权级转移,处理器从一个特权级转移到另一个特权级,任意时刻处理器所处的特权级称为当前特权级。重复叙述的目的是强调当前特权级是对处理器而言的概念,并不是对代码段而言。当前特权级CPL是指处理器任意时刻的身份地位,其变化的原因是处理器从某一特权级的代码段转移到另一特权级的代码段上运行,代码段的特权级DPL是未来处理器的CPL。

各种门结构存在的目的就是为了让处理器提升特权级,这样处理器才能够做一些低特权级下无法完成的工作。比如,当用户程序想读取硬盘文件时,由于处理器在执行用户程序时所处的特权级为3,一般情况下操作系统不允许用户程序操作硬盘。此时必须由用户代码指挥处理器使用某种门结构(如调用门)进入0特权级,在提升了处理器的CPL之后才能控制硬盘、读取文件。是不是说的有些抽象?其实就是用户程序进行系统调用使处理器进入内核态执行内核服务。

当处理器提升为0特权级时,任何事情都能做,是最强大同时也是最危险的状态,如果用户程序通过某种门结构使处理器进入到0特权级,它很有可能会被3特权级的用户程序利用,这样用户程序就有机会访问0特权级下的数据。

调用门是一个描述符,称为门描述符,其中记录的是内核服务程序所在代码段的选择子及在代码段中的偏移地址。门描述符是定义在全局描述符表GDT和局部描述符表LDT中,所以,要想使用调用门,就要通过门描述符的选择子,这一点和访问数据段类似,总之,保护模式下离不开描述符,有描述符就离不开选择子。

我们平时很少有人直接和调用门打交道,大多数程序员甚至都不知道调用门是怎么回事,所以在接触调用门时通常会感到有些吃力,这是由三方面造成的:

  1. 我们大多数情况下是用高级语言编程,编译器或集成开发环境为我们做了太多的工作,大大方便了我们的编码方式,而调用门是在汇编语言下使用的方法,不做底层开发的话我们根本就碰不到它。
  2. 调用门是用来实现系统调用的,但为了兼容等原因,我们平时接触的操作系统很少有使用调用门实现系统调用,如Linux就是用中断门代替。我们顶多听说过中断门,对调用门了解少之又少。
  3. 调用门一般在过去多段模型下使用,大多数情况下需要为调用门指定段选择子。而现在操作系统为了方便,早已经采用了平坦模型,所有用户进程共享几个选择子,比如用户代码段选择子和用户数据段选择子各一个,由所有用户进程共享,用户进程不需要再提供选择子,所以调用门可以用中断门代替了。

综上所述,调用门是在汇编语言中使用,能发挥其特长的场所是多段模型,若没有此方面的编程经验,大家先提前有个印象,也没什么复杂的,仅仅是大家很少接触而已。

猜你喜欢

转载自blog.csdn.net/sinolover/article/details/95201152