Operating system 模式位在哪里?

Operating system 模式位在哪里?,operating-system,mode,Operating System,Mode,我刚刚在Silberschatz的《操作系统概念》一书中读到这篇文章。18: 一个称为模式位的位被添加到计算机的硬件中 指示当前模式:内核(0)或用户(1)。使用模式位, 我们能够区分代表执行的任务 操作系统的,以及代表 用户 模式位存储在哪里? (它是CPU中的寄存器吗?你能读取模式位吗?据我所知,CPU必须能够读取模式位。它如何知道哪个程序获得模式位0?具有特殊地址的程序获得模式位0吗?谁设置模式位/它是如何设置的?这是CPU寄存器。只有当您已经处于内核模式时,才可以访问它 如何设置的细节取

我刚刚在Silberschatz的《操作系统概念》一书中读到这篇文章。18:

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

模式位存储在哪里?


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

这是CPU寄存器。只有当您已经处于内核模式时,才可以访问它


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

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

请注意,您的问题在很大程度上取决于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状态并跳转到处理该事情的代码所在的位置;粗略地说,上面解释的过程适用于内核模式和用户模式之间的切换方式。

g系统在进行上下文切换时设置它因为你说它过于简单,你能让我看一些教程、书或材料来更深入地理解这个主题吗?谢谢!@SamBruns:我强烈推荐这本书:“计算机系统:程序员的视角”我建议也检查一下,以获得更多操作系统信息(以及更深入的信息):@Fingolfin只要设置了模式位,CPU就可以对整个物理内存进行rwx访问,这是真的吗?