内核模式位

内核模式位

我读了高尔文的《操作系统和概念》一书中的以下内容

“一个称为模式位的位被添加到计算机的硬件中以指示当前模式:内核(0)或用户(1)。通过模式位,我们能够区分执行的任务代表操作系统和代表使用执行的一个”

现在,如果它是多处理器系统,则假设一个进程执行系统调用并将模式位从 1 更改为 0 。

现在可能有一些其他进程在用户模式下并行运行,因为它是一个多处理器系统,但模式位设置为 0 表示内核模式导致不一致。

那么寄存器的数量(存储模式位所需的)是否取决于处理器的数量?

答案1

你的书把事情过于简单化了。实际上,这取决于 CPU 如何设置模式,并且它不一定是“位”,也不一定只有两种模式。

出于该问题的目的,我们假设 Linux、Intel x86 和多核。

多任务处理是通过上下文切换来实现的,在 Linux 中,上下文切换是基于软件的。上下文切换只是停止处理器正在执行的操作(核心或 CPU),将其状态保存到 RAM,然后用另一个上下文替换它。

x86 实现了可以在进程级执行发生之前在每个处理器上设置的保护环。 Linux 内核通过在内存空间中开始执行之前将进程设置为环 3(非特权)来处理此问题。通过前面提到的上下文切换的实现,内核维护了在特定线程上运行的进程的概念(通常每个内核有 2 个线程,英特尔),因为每当该程序代码运行时,内核总是将环设置回 3,即使处理器每秒会发生多次上下文切换,因此许多进程将在同一核心上运行。它可以通过一个或多个核心以基本相同的方式完成此操作。

在 x86 的 Linux 上,当线程想要从环 3 切换到环 0(管理程序)时,它只能通过软件中断来实现。在环 1 和环 2 中,也可以使用特殊指令,但 Linux 不实现这一点。因为 Linux 控制软件中断处理程序,所以即使线程现在位于环 0 中,它也可以确保它只运行“内核空间”中的代码,即属于内核一部分的代码,即使它与执行用户空间代码的线程相同。在操作系统中,这被称为系统调用,因为这就是它真正做的事情。您是否想将此视为“进程”正在切换到内核模式并返回,或者该进程实际上处于暂停状态,因为只有内核空间代码正在执行,直到它切换回用户空间,这取决于您。

因为 x86 允许高环中的那些切换到低环,所以它可以在中断处理程序完成后切换回 3。这就是所有系统调用都会发生的情况,因此从硬件角度来看,所有系统调用都可以在系统上执行任何操作。它可以反向运行程序的每条指令,然后根据需要从内存中删除所有代码。或者它可以切换到环 0 并在程序开始时开始执行。正如您所看到的,这些示例打破了“内核/用户”模式的概念,因为硬件中不存在这样的概念。然而,在 Linux 上,它始终实现为对内核空间的调用和对用户空间的返回(实际上,内存在 x86 上不受环 0 的保护)。

因此,内核/用户模式切换是通过使用软件中断处理程序来实现的,该软件中断处理程序可以突破线程保护环,但实现时只在内核空间中执行,然后返回到用户空间,特别是执行该命令的用户空间进程。系统调用,但仅在返回到环 3 之后。

相关内容