操作系统中的双模式操作

2025年4月23日 | 阅读 6 分钟

操作系统中的双模式运行是为了保护操作系统免受非法用户的侵害。我们通过将一些系统指令指定为特权指令来完成这种防御,这些指令可能造成损害。硬件只允许在内核模式下执行特权指令。切换到用户模式的命令就是一个特权指令的例子。其他例子包括 I/O 监控、计时器控制和中断处理。

为了确保操作系统正常运行,我们必须区分机器代码执行和用户定义的代码。大多数计算机系统都采用了提供硬件支持来区分不同执行模式。我们有两种操作系统模式:用户模式内核模式

需要模式位来识别当前指令在哪种模式下执行。如果模式位是 1,则运行用户模式;如果模式位是 0,则运行内核模式。

注意:系统启动时,总是以内核模式开始。

操作系统双模式类型

操作系统有两种运行模式,以确保其正常工作:用户模式和内核模式。

1. 用户模式

当计算机系统在用户模式下运行用户应用程序(如文件创建或其他应用程序)时,此模式无法直接访问计算机硬件。为了执行与硬件相关的任务,例如当用户应用程序请求操作系统服务或发生中断时,在这些情况下,系统必须切换到内核模式。用户模式的模式位为 1。这意味着如果系统处理器模式位为 1,则系统处于用户模式。

Dual Mode Operations in Operating System

2. 内核模式

操作系统所有底层任务都在内核模式下执行。由于内核空间可以直接访问系统硬件,因此内核模式处理所有需要硬件支持的进程。除此之外,内核模式的主要功能是执行特权指令。

Dual Mode Operations in Operating System

这些特权指令不提供用户访问权限,因此这些指令无法在用户模式下处理。因此,用户被限制干预的所有进程和指令都在操作系统内核模式下执行。内核模式的模式位为 0。因此,为了使系统在内核模式下运行,处理器模式位必须等于 0。

示例

通过模式位,我们可以区分代表操作系统执行的任务和代表用户执行的任务。

Dual Mode Operations in Operating System
  • 当计算机系统代表用户应用程序运行时,系统处于用户模式
  • 但是,当用户应用程序通过系统调用请求操作系统服务时,它必须从用户模式过渡到内核模式以满足请求。正如我们所说,这种架构增强功能对系统运行的许多其他方面都有用。
  • 在系统启动时,硬件以内核模式启动。
  • 然后加载操作系统,并在用户模式下启动用户应用程序。
  • 每当发生陷阱或中断时,硬件会从用户模式切换到内核模式,将模式位更改为 0。
  • 因此,每当操作系统获得对计算机的控制权时,它就处于内核模式
  • 在将控制权传递给用户程序之前,系统总是通过将模式位设置为 1 来切换到用户模式

双模式运行的必要性

某些类型的进程需要对用户隐藏,并且某些任务不需要任何类型的硬件支持。使用操作系统的双模式,可以单独处理这些任务。

此外,操作系统需要以双模式运行,因为内核级程序执行操作系统的所有底层功能,如进程管理、内存管理等。如果用户更改了这些,可能会导致整个系统崩溃。因此,为了仅向用户指定对其使用的任务的访问权限,双模式对于操作系统是必需的。

因此,每当系统处理用户应用程序时,它都处于用户模式。当用户请求硬件服务时,会发生从用户模式到内核模式的转换,这是通过将模式位从 1 更改为 0 来实现的。要返回到用户模式,模式位再次更改为 1。

用户模式与内核模式切换

在进程的生命周期中,进程在用户模式和内核模式下执行。用户模式是进程具有有限访问权限的正常模式。然而,内核模式是特权模式,进程可以无限制地访问系统资源,如硬件、内存等。进程可以通过在内核模式下执行访问内核数据来访问硬件 I/O 等服务。任何与进程管理、I/O 硬件管理和内存管理相关的操作都需要进程在内核模式下执行。

重要的是要知道,处于内核模式的进程可以访问任何设备和内存,同时内核模式中的任何崩溃都会导致整个系统崩溃。但用户模式中的任何崩溃只会导致有故障的进程崩溃。

内核提供系统调用接口 (SCI),这是用户进程进入内核模式的入口点。系统调用是进程从用户模式进入内核模式的唯一方式。下图详细解释了用户模式到内核模式的切换。

Dual Mode Operations in Operating System
  • 当处于用户模式时,应用程序进程会调用 Glibc,这是一个供软件程序员使用的库。
  • Glibc 库知道如何为不同体系结构调用系统调用。它根据体系结构的应用程序二进制接口 (ABI) 设置参数传递,为系统调用入口做准备。
  • 现在 Glibc 调用 ARM 的软件中断指令,该指令通过更新 CPSR 寄存器的模式位并将处理器置于 Supervisor 模式,然后跳转到向量地址 0x08。
  • 到目前为止,进程执行处于用户模式。SWI 指令执行后,允许进程执行内核代码。内存管理单元 (MMU) 现在将允许此进程访问内核虚拟内存并执行。
  • 从向量地址 0x08 开始,进程执行加载并跳转到 ARM 的 SW 中断处理程序例程 vector_swi()。
  • 在 vector_swi() 中,系统调用号 (SCNO) 从 SWI 指令中提取,并使用 SCNO 作为系统调用表 sys_call_table 的索引跳转到系统调用函数。
  • 系统调用执行后,在返回路径上,用户空间寄存器会在用户模式开始执行之前恢复。

为什么我们需要切换?

用户模式和内核模式之间切换的两个主要原因是:

  1. 如果所有内容都在单一模式下运行,我们就会遇到早期 Windows 版本中微软遇到的问题。如果一个进程能够利用一个漏洞,那么该进程就可以控制系统。
  2. 某些条件称为陷阱、异常或系统故障,通常由异常情况引起,例如除以零、无效内存访问等。如果进程在内核模式下运行,这种陷阱情况可能会导致整个操作系统崩溃。在用户模式下遇到陷阱情况的进程只会导致用户模式进程崩溃。

因此,切换的开销是可以接受的,以确保一个更稳定、更安全的系统。

用户模式与内核模式的区别

计算机要么在用户模式下运行,要么在内核模式下运行。用户模式与内核模式的区别在于,用户模式是应用程序运行的受限模式,而内核模式是计算机在访问硬件资源时进入的特权模式。

计算机在这两种模式之间切换。频繁的上下文切换会降低速度,但不可能在内核模式下执行所有进程。因为,如果一个进程失败,整个操作系统可能会失败。以下是用户模式与内核模式之间的一些区别:

条款用户模式内核模式
定义用户模式是一种受限模式,应用程序正在其中执行和启动。内核模式是特权模式,计算机在访问硬件资源时进入。
模式用户模式被认为是主模式或受限模式。内核模式是系统模式、主模式或特权模式。
地址空间在用户模式下,进程有自己的地址空间。在内核模式下,进程拥有单个地址空间。
中断在用户模式下,如果发生中断,只有一个进程会失败。在内核模式下,如果发生中断,整个操作系统可能会失败。
限制在用户模式下,访问内核程序受到限制。不能直接访问它们。在内核模式下,用户程序和内核程序都可以访问。