17

我刚刚在 Silberschatz 的“操作系统概念”中读到这一点,p。18:

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

模式位存储在哪里?

(它是CPU中的寄存器吗?你能读取模式位吗?据我了解,CPU必须能够读取模式位。它如何知道哪个程序获得模式位0?特殊地址获取模式位 0?谁设置模式位/如何设置?)

4

3 回答 3

21

请注意,您的问题很大程度上取决于 CPU 本身;尽管您可能会遇到某些甚至不存在用户级/内核级概念的处理器,但这种情况并不常见。

cs 寄存器还有另一个重要功能:它包含一个 2 位字段,用于指定 CPU 的当前特权级别 (CPL)。值 0 表示最高特权级别,而值 3 表示最低特权级别。Linux 仅使用级别 0 和 3,分别称为内核模式和用户模式。

(取自“了解 Linux 内核 3e”,第 2.2.1 节)
另请注意,这取决于 CPU,您可以清楚地看到它会从一个变化到另一个,但这个概念通常是成立的。


谁设置的?通常,内核/cpu 和用户进程无法更改它,但让我在这里解释一下。

**这是过于简单化了,不要当真**
假设内核已经加载并且第一个应用程序刚刚启动(第一个shell),内核加载了这个应用程序启动的所有内容,设置cs 寄存器中的位(如果您正在运行 x86),然后跳转到 Shell 进程的代码。

shell 会在这个上下文中继续执行它的所有指令,如果进程包含一些特权指令,cpu 将获取它并且不会执行它;它会给出一个异常(硬件异常),告诉内核有人试图执行特权指令,在这里内核代码处理工作(CPU将cs设置为内核模式并跳转到某个已知位置来处理此类错误(也许终止进程,也许是别的)。

那么一个进程如何才能做一些有特权的事情呢?例如,与某个设备交谈?系统调用来了;内核将为您完成这项工作。

发生的情况如下:
您在某些寄存器中设置了您想要的内容(例如,您设置了要访问文件,文件位置是 x,您正在访问以进行读取等)(内核文档将让您知道这一点)然后(在 x86 上)您将调用int0x80指令。

这会中断 CPU,停止工作,将模式设置为内核模式,将 IP 寄存器跳转到某个已知位置,该位置具有服务文件 IO 请求的代码并从那里移动。
一旦你的数据准备好了,内核会将这些数据设置在你可以访问的地方(内存位置,寄存器;这取决于 CPU/内核/你请求的内容),将 cs 标志设置为用户模式并跳转回你的it 指令旁边的int 0x80指令。

最后,每当发生切换时,都会发生这种情况,内核会收到通知,因此 CPU 会终止您当前的指令,更改 CPU 状态并跳转到处理此事情的代码;上面解释的过程,粗略地说,适用于内核模式和用户模式之间的切换是如何发生的。

于 2012-11-03T12:28:11.477 回答
8

这是一个CPU寄存器。只有在您已经处于内核模式时才能访问它。

如何设置的细节取决于 CPU 设计。在大多数常见硬件中,它在执行用于执行系统调用的特殊操作码时自动设置。然而,在其他架构中,某些内存页面可能设置了一个标志,表明它们是内核的“网关”——在这些页面上调用函数会设置内核模式位。

于 2012-11-01T21:23:06.307 回答
4

如今,它被赋予了其他名称,例如主管模式或保护

于 2012-11-01T21:24:07.040 回答