【OS学习笔记】二十三 保护模式七:保护模式下任务的隔离与任务的特权级概念
发布日期:2021-07-01 00:05:45 浏览次数:2 分类:技术文章

本文共 2470 字,大约阅读时间需要 8 分钟。

上一篇文章学习了保护模式下操作系统内核如何加载程序并运行:

本篇文章接着上一篇文章学习保护模式下任务的隔离。

包括以下学习内容:

  • 任务的全局空间和局部空间
  • 任务的TSS
  • 任务的LDT
  • 任务的特权级概念等

1、回顾

在保护模式下,通过将内存分成大小不等的段,并用描述符对每个段的用途、类型、长度进行指定,就可以在程序运行时由处理器硬件施加访问保护。比如,当程序试图去写一个可执行程序的代码段时,处理器就会阻止这种企图;再比如当程序试图让处理器反问超过段的界限内存区域,处理器会引发异常中断。

首先一个程序老老实实地访问只属于它自己的段时,基本的段保护机制是有效的。但是一个失控的程序,或者一个恶意的程序,依然可以通过追踪和修改描述符表来达到它访问任何内存段的目的。比如用户程序知道GDT的位置,它可以通过向段寄存器加载操作系统的段描述符,或者在GDT中添加一个指向操作系统的数据段的描述符,来修改只属于操作系统的私有数据。

我们肯定是不能允许有以上的事情发生。

现在都是多任务系统。对于多任务系统,首先就必须保证任务的隔离和保护以及任务与操作系统之间的隔离。这是我们首要的任务(此任务非彼任务)。其次,由于操作系统主要是为各个任务服务,负责加载、创建和执行环境的管理,并执行各个任务的调度,最操作系统的保护显得尤为重要。我们之前学习过的基本的段保护机制已经无法满足以上那些要求。

所以新的机制就要出现。比如任务的隔离,特权级与特权级访问规则等,这些都是在以上新的保护要求下被创造出来的规则。

当然本文不是一下子就将这些机制学习完。本文先学习任务的隔离,以及特权级的基本概念。

2、任务描述符的隔离

所谓任务。程序是记录在载体(比如硬盘)上的指令和数据,总是为了完成某个特定的工作,其正在执行的一个副本,叫做任务(Task)。当然,一个程序,它可以有多个在运行的副本,那么就会有多个任务在同时执行。不同的程序也可以同在在内存中运行,这也是多个任务。

在以前的学习中,我们只接触到了GDT,我们把所有的任务的描述符以及操作系统的描述符都放在这个全局描述符表里面。这样显得不是很好。为了让任务与任务,任务与操作系统之间能够更好的隔离,便有了局部描述符表(LDT)。每一个任务都有自己的独立的描述符表,叫做LDT,LDT里面存放的是各个任务自己的描述符。各个任务自己的描述符不再放在GDT中,而是放在自己的独立的LDT中,这样更加有利于任务的隔离。

类似于GDTR是指向GDT的寄存器,对于LDT来说,也有一个寄存器叫做LDTR指向LDT。这个LDTR指向的是当前正在执行的任务的LDT。当任务切换时,对应的LDT肯定会变,那么LDTR也会更新指向新的任务的LDT。

具体的LDT的大小以及各个如何从LDT中加载描述符,与GDT类似,只不过在段选择子的TI位为1的时候表示从LDT中加载描述符,TI位为0的时候表示从GDT中加载描述符。具体的步骤参考书籍。

3、 保护任务现场的任务状态段(TSS段)

我们知道,任务切换的时候,肯定是涉及到任务上下文信息的保存。任务的上下文信息包括通用寄存器、段寄存器、栈指针寄存器ESP、指令指针寄存器EIP、状态寄存器EFLAGS,等等。

为了保存任务的状态,并在下次重新恢复执行的时候恢复他们,每个任务都应该有一个额外的内存段区域用于保存相关信息,这叫做任务状态段(TSS)

如下图是一个TSS的具有的固定格式:

在这里插入图片描述

处理器固件能够识别TSS中每个元素,并在任务切换的时候读取其中的信息。

和LDT一样,处理器用TR寄存器来指向当前任务的TSS。

下面我们来综合看一下多任务系统的组合示意图,包括了GDT,LDT,TSS大致的关系。

在这里插入图片描述

4、任务的全局空间和局部空间

我们大多数人都学过C语言,知道在C语言中会调用一些库函数例如printf,实际上这些函数最终都会去调用对应的系统函数。这些系统函数正是操作系统为用户程序提供的例程。

这样的话,我们程序中就包括了调用自己写的函数,以及调用操作系统的函数。这就导致我们用户程序的执行会在操作系统内核用户程序之间来回切换。我们把在用户程序空间执行的空间叫做局部空间,在内核中执行的空间叫做全局空间。

如下a图为每个任务的全局空间个局部空间,b图为多任务系统的全局空间和局部空间。

在这里插入图片描述

所谓全局空间和局部空间,也就是地址划分为题,即段的划分问题。全局空间有全局描述符表GDT指定。局部空间由局部描述符表LDT指定。

5、特权级基本概念

引入LDT和TSS ,只是任务层面进一步强化了分段机制,从安全保障的角度来看,只是相当于构建了可靠的硬件设施。

仅有设施是不行的,还需要有规章制度,还要有人来执行,处理器也一样。为此在分段机制的基础上,处理器引入了特权级,并由固件负责实施特权级保护。

特权级是存在于描述符及其选择子中的一个数值。当这些描述符或者选择子所指向的对象要进行某种操作,或者被别的对象进行访问的时候,该数值用于控制它们所能进行的操作。或者限制它们的可访问性。

Intel处理器共有4个访问级别:0,1,2,3. 较大的特权级意味着较低的特权级。较小的数值一位置较高的特权级。如下图是Intel提供的4级换装保护:

在这里插入图片描述

由上图可以看出,操作系统的内核特权级最高,系统服务程序(例如设备驱动程序等)的特权级其次,用户程序的特权级最低。

其实这很容易理解,操作系统的特权最高,它想干什么就干什么,肯定需要最高的特权级。普通的用户程序是被操作系统管理的,而且用户程序也不能随便的访问硬件操作硬件,所以用户程序的特权级最低。

剩下的关于特权级的保护方面的内容,就放到下一篇文章去学习。

6、总结

今天学习了以下基本内容:

  • 任务的全局空间和局部空间
  • 任务的TSS
  • 任务的LDT
  • 任务的特权级概念等

最后我们再给出一个与任务相关的各部分逻辑示意图:

在这里插入图片描述

详细的内容还是要参考原书籍,这里只是做一个简单的总结。

学习探讨加个人:

qq:1126137994
微信:liu1126137994

转载地址:https://lyy-0217.blog.csdn.net/article/details/85012117 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【OS学习笔记】二十四 保护模式七:调用门与依从的代码段----特权级保护
下一篇:【OS学习笔记】二十二 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之用户程序

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月09日 01时34分46秒