Kam*_*ran 6 linux cpu operating-systems process kernel
谁负责确定进程处于内核模式还是用户模式?我知道内核知道哪个进程属于哪个空间,但是 CPU 如何确定呢?我的意思是 CPU 应该知道进程或执行语句的模式吗?如果是如何?如果没有,那么当用户想要做一些被禁止的事情时会发生什么?当我们说用户应用程序只能看到机器资源的一个子集时,我知道这意味着应用程序不能执行特定任务,例如在 CPU 中,但谁阻止应用程序做这些事情,更重要的是如何?
嗯,相当有趣的问题。我会尽力帮助...
谁负责确定进程处于内核模式还是用户模式?
操作系统设计者决定:-)。所有现代操作系统都在用户模式下运行所有进程(x86 架构中“保护模式”下的“环 3”),因为这是使用内存保护和虚拟内存等功能所必需的。较旧和/或更简单的操作系统可以在内核模式下运行所有进程(例如 x86 中的“实模式”);这取决于操作系统设计。例如,MS-DOS 就是这样工作的。
请注意,处理器模式的实际名称和类型在不同架构(x86、Sparc、PowerPC...)之间有所不同;然而,所有现代处理器都有类似的“受保护”模式,人们可以称之为“用户”模式。
我知道内核知道哪个进程属于哪个空间,但是 CPU 如何确定呢?
CPU 不“知道”它,因为 CPU 对进程一无所知;这些是操作系统提供的抽象。CPU 只执行提供给它的代码。CPU 有在不同模式之间切换的指令,操作系统使用这些指令根据需要将 CPU 置于正确的模式。
例如,在 x86 上,计算机将以“实模式”启动(出于兼容性原因)。当 Linux 或 Windows(NT 及更高版本)等操作系统启动时,它所做的第一件事就是切换到“保护模式”。然后它使用“环”功能来控制每个程序对硬件的访问。OS 内核在 ring 0(完全权限)中运行;用户软件在环 3(受限)中运行。每当操作系统将控制权交给用户软件时(即当它启动或恢复用户进程时),它首先会切换到环 3。然后控制权返回给内核,CPU 切换回环 0。
模式/环之间的切换究竟如何工作取决于 CPU 架构。大多数体系结构提供特殊的指令或机制进行切换。一旦 CPU 切换到某种模式/环,它就会自行跟踪该模式(以及任何相关的限制)。
有关 x86 架构如何工作的详细信息,请参阅这篇文章:http : //duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection
顺便说一句:受限 CPU 模式中的保护/限制主要由 CPU 的内存管理单元实现。较旧和/或更简单的处理器(例如 Amiga 和 Atari ST 使用的 Motorola 68000 或来自 C64 的 6510)没有 MMU;因此他们无法运行区分内核模式和用户模式的操作系统。这就是为什么例如 Linux m68k 端口至少需要摩托罗拉 68020 处理器才能运行;早期的 68000 和 68010 没有 MMU。
我的意思是 CPU 应该知道进程或执行语句的模式吗?如果是如何?
是的,CPU 知道它,因为它知道当前正在运行哪种模式(尽管它不知道为什么)。
如果没有,那么当用户想要做一些被禁止的事情时会发生什么?当我们说用户应用程序只能看到机器资源的一个子集时,我知道这意味着应用程序不能执行特定任务,例如在 CPU 中,但谁阻止应用程序做这些事情,更重要的是如何?
一个很好的问题。CPU 本身停止应用程序。
如果代码(应用程序)在权限受限的模式下运行(例如 x86 上保护模式下的 ring 3),则代码可能无法执行某些操作(例如访问分配给它的区域之外的内存)。CPU 知道这一点,并在执行前检查每条指令是否存在可能的违规。如果检测到违规,CPU 将停止执行违规代码(这称为“异常”或硬件中断),并跳转到特殊的错误处理代码(由 OS 预先设置)。
这有效地将控制权传回给操作系统,然后操作系统可以按照它认为合适的方式执行:如果异常是由于访问已换出到磁盘的内存(这就是“分页”的工作原理)而导致的,则从磁盘获取内存,终止进程它非法访问内存(可怕的“保护错误”或“分段错误”)等。