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状态并跳转到处理此事件的代码所在的位置; 粗略地说,上面解释的过程适用于内核模式和用户模式之间的切换.
这是一个CPU寄存器.只有在你已经处于内核模式时才能访问它.
它的设置细节取决于CPU设计.在大多数常见硬件中,它在执行用于执行系统调用的特殊操作码时自动设置.但是,还有其他架构,其中某些内存页面可能有一个标志设置,表明它们是内核的"网关" - 调用这些页面上的函数设置内核模式位.
| 归档时间: |
|
| 查看次数: |
12127 次 |
| 最近记录: |