由于操作系统及其用户共享计算机系统的硬件和软件资源,一个适当设计的操作系统必须确保一个不正确的(或恶意的)程序不能导致其他程序----或操作系统本身-----不正确地执行。为了确保系统的正确执行,我们必须能够区分执行的是操作系统代码还是用户定义的代码。大多数计算机系统采用的方法是提供硬件支持,允许在不同的执行模式之间进行区分。

至少,我们需要两种独立的操作模式【mode】:用户模式[user mode]内核模式[kernel mode](也称为监督者模式、系统模式或特权模式)。它是一个位,称为模式位,添加到计算机的硬件,来显示当前模式:内核(0)用户(1),通过这个模式位,我们可以区分一个任务是为操作系统执行,还是为用户所执行的。当计算机系统代表用户执行应用程序时,系统处于用户模式。但是,当用户应用程序从操作系统请求服务(通过系统调用)时,系统必须从用户模式转换到内核模式以满足请求。如图1.13所示。我们将看到,这种架构增强对于系统操作的许多其他方面也很有用。

在系统启动时,硬件以内核模式启动。然后加载操作系统并以用户模式启动用户应用程序。当发生陷阱或中断时,硬件从用户模式切换到内核模式(即将模式位的状态更改为0),因此,每当操作系统获得对计算机的控制时,它就处于内核模式。在将控制传递给用户程序之前,系统总是切换到用户模式(通过将模式位设置为1)。

双操作模式为我们提供了保护操作系统不受错误用户和错误用户相互攻击的手段。我们通过指定一些可能造成伤害的机器指令作为特权指令来实现这一保护。硬件允许特权指令只在内核模式下执行。如果尝试在用户模式下执行特权指令,硬件不会执行该指令,而是将其视为非法并将其陷阱到操作系统。

切换到内核模式的指令就是特权指令的一个例子。其他一些例子包括I/O控制、计时器管理和中断管理。在整个文本中讨论了许多附加的特权指令。

模式的概念可以扩展到多种模式位。例如,英特尔处理器有四个独立的保护环,其中环0是内核模式,环3是用户模式。(虽然环1和环2可以用于各种操作系统服务,但实际上它们很少被使用。)ARM v8系统有七种模式。支持虚拟化的CPU(第18.1节)通常有一个单独的模式来指示虚拟机管理器(VMM)何时控制系统。在这种模式下,VMM比用户进程拥有更多的特权,但比内核的权限要少。它需要这样的特权级别,以便能够创建和管理虚拟机,从而更改CPU状态。

我们现在可以更好地理解计算机系统中指令执行的生命周期。初始控制驻留在操作系统中,指令在内核模式下执行。当控制权交给用户应用程序时,模式位被设置为用户模式。最后,通过中断、陷阱或系统调用将控制切换回操作系统。大多数现代的操作系统——如Microsoft Windows、Unix和linux——都利用了这种双模式特性,并为操作系统提供了更大的保护。

系统调用为用户程序提供了一种方法,来请求让操作系统代表用户程序执行为操作系统而保留的任务。系统调用以多种方式调用,具体取决于底层处理器提供的功能。在所有形式中,它都是进程用来请求操作系统操作的方法。系统调用通常以陷阱的形式出现在中断向量的特定位置。这个陷阱可以通过通用的陷阱指令执行,尽管有些系统有一个特定的syscall指令来调用系统调用。

当系统调用被执行时,硬件通常将其视为软件中断。控制通过中断向量传递到操作系统中的服务例程,模式位被设置为内核模式。系统调用服务例程[system-call service routine]是操作系统的一部分。内核检查中断指令,以确定发生了什么系统调用;参数指示用户程序请求的服务类型。请求所需的其他信息可以在寄存器、堆栈或内存中传递(指针指向寄存器中传递的内存位置)。内核验证参数是否正确和合法,执行请求,并在系统调用之后将控制权返回给指令。在第2.3节中,我们将更完整地描述系统调用。

一旦硬件保护到位,它就会检测到违反模式的错误。这些错误通常由操作系统处理。如果用户程序以某种方式失败(例如尝试执行非法指令或访问不在用户地址空间中的内存),那么硬件就会陷阱到操作系统。陷阱通过中断向量将控制传递给操作系统,就像中断一样。当程序发生错误时,操作系统必须异常地终止程序。这种情况的处理代码与用户请求的异常终止的处理代码是相同的。给出一个适当的错误消息,程序的内存可能会被转储。内存转储通常被写到文件中,以便用户或程序员可以检查它,也许还可以纠正它并重新启动程序。

results matching ""

    No results matching ""