模式位在哪里?

20
我刚在Silberschatz的“操作系统概念”中读到这段话(第18页):
引入了一个叫做“模式位”的比特,被添加到计算机硬件中以指示当前模式:内核(0)或用户(1)。通过这个模式位,我们能够区分代表操作系统执行的任务和代表用户执行的任务。
那么,该模式位存储在哪里呢?
(它是CPU中的寄存器吗?你能读取该模式位吗?据我所知,CPU必须能够读取该模式位。它如何知道哪个程序会获得模式位0?是否具有特殊地址的程序获取模式位0?谁设置模式位/如何设置?)

1
操作系统在进行上下文切换时设置它。 - Karoly Horvath
3个回答

22
请注意,您的问题高度依赖于CPU本身;尽管很少见,但您可能会遇到某些处理器,其中甚至不存在用户级/内核级的概念。 cs寄存器具有另一个重要功能:它包括一个2位字段,指定CPU的当前特权级(CPL)。值0表示最高特权级,而值3表示最低特权级。Linux仅使用级别0和3,分别称为内核模式和用户模式。 (摘自“理解Linux内核3e”,第2.2.1节) 请注意,这取决于CPU,正如您可以清楚地看到的那样,它将从一个CPU更改为另一个CPU,但是通常的概念仍然适用。
由谁设置?通常是内核/CPU和用户进程无法更改它,但是让我在这里解释一些内容。 这是过于简化了,请不要直接采纳。 让我们假设内核已加载并且第一个应用程序刚刚启动(第一个shell),内核加载此应用程序启动所需的所有内容,设置cs寄存器中的位(如果您正在运行x86),然后跳转到Shell进程的代码。 Shell将继续在此上下文中执行其所有指令,如果该进程包含某些特权指令,则CPU将获取它并不会执行它;它将引发异常(硬件异常),告诉内核有人尝试执行受特权保护的指令,这里内核代码处理工作(CPU将cs设置为内核模式并跳转到一些已知位置来处理此类错误,例如终止进程或其他操作)。 那么进程如何执行特权操作?例如与某个设备通信? 这就涉及系统调用;内核将为您执行此操作。 发生的情况如下: 将要访问的内容(例如,您设置要访问的文件,文件位置为x,正在进行读取等)放置在某个寄存器中(内核文档将告诉您相关信息),然后(在x86上)调用int0x80指令。

这个操作会中断CPU,停止你的工作,将模式设置为内核模式,并跳转IP寄存器到一些已知位置,该位置有处理文件IO请求的代码,然后从那里移动。
一旦您的数据准备好了,内核就会将这些数据设置在您可以访问的位置(内存位置、寄存器;这取决于CPU/内核/您所请求的内容),将cs标志设置为用户模式,并跳回到您的指令下一个位置,紧接着int 0x80指令。

最后,每当发生切换时,内核都会收到通知,CPU终止当前指令,更改CPU状态并跳转到处理此事情的代码所在位置。简单来说,上述过程适用于内核模式和用户模式之间的切换。


1
既然你说这是一种过于简化的描述,能否为我提供一些教程、书籍或材料,以更深入地了解这个主题?谢谢! - aldeb
2
@SamBruns:对于一本书,我强烈推荐《计算机系统:程序员的视角》,并建议查看此链接以获取更多操作系统信息(以及更深入的内容):http://wiki.osdev.org/Main_Page。 - Fingolfin
@Fingolfin,如果模式位被设置,CPU是否真的可以对整个物理内存进行rwx访问? - bytecode77

8

这是一种CPU寄存器。只有在内核模式下才能访问。

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


4

现在它被赋予了其他名称,例如监管模式或保护


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接