模式位在哪里?

时间:2012-11-01 20:53:13

标签: operating-system mode

我刚从Silberschatz的“操作系统概念”中读到这篇文章。 18:

  

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

模式位存储在哪里?

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

3 个答案:

答案 0 :(得分:17)

请注意,您的问题在很大程度上取决于CPU itselt;虽然你可能会遇到某些处理器,这种处理器甚至不存在用户级/内核级别的概念。

  

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

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


是谁设定的?通常,内核/ cpu和用户进程不能改变它,但让我在这里解释一下。

这是一种过度简化,不要理解
让我们假设内核已加载并且第一个应用程序刚刚启动(第一个shell),内核加载此应用程序启动的所有内容,设置cs寄存器中的位(如果您运行的是x86)然后跳转到代码壳牌流程。

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

那么一个进程怎么能做一些特权呢?比如说某个设备? 这是系统调用;内核将为你完成这项工作。

以下是: 你可以在某个地方设置你想要的东西(例如你设置你想要访问一个文件,文件位置是x,你正在访问读取等)(内核文档会告诉你这个)和然后(在x86上)你将调用int0x80指令。

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

这些天它给出了其他名称,例如主管模式或保护ring