模式位在哪里?

Mar*_*oma 15 operating-system mode

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

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

模式位存储在哪里?

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

Fin*_*fin 17

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

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标志设置为用户模式并跳转回你的指令旁边的int 0x80指令.

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

  • @SamBruns:对于一本书,我强烈推荐:"计算机系统:程序员的观点",我建议检查这个以获取更多操作系统信息(以及更深入):http://wiki.osdev.org/主页 . (2认同)

Bar*_*mar 5

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

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