我的理解是:
用户代码在进程地址空间的进程/线程上下文中以用户模式执行,并且只能寻址为进程定义的用户代码/数据,而无法访问特权指令。
操作系统如何知道用户创建的进程/线程是在用户空间和用户模式,而不是内核空间和内核模式?它是由寄存器/CPU/硬件设置控制的吗?它到底是如何运作的?
答案1
处理器(CPU)有一个模式位(bits)。从特权模式ring-0开始,计算机可以运行所有指令,并访问所有资源。内核运行在这种模式下。有更改模式的说明,例如更改为用户模式ring-3(不使用ring-1和ring-2)。
转移到特权模式的指令更加复杂。这些是中断和陷阱:如果硬件中断,或者用户模式程序执行软件中断,则处理器查找预先注册的地址,更改模式,将返回地址放入堆栈并跳转到该地址。只有特权模式才能注册这些地址(类似于set-uid)。
至于内存:在两种模式下,用户内存和内核内存都是映射的。然而,在用户模式下,内核内存被禁用。当跳转到内核空间时,它可以快速重新启用。
除了提到环(在 x86 上使用)之外,这并不特定于特定的 CPU。如果您想了解 CPU 的工作原理,那么 ARM 是最简单的现代处理器之一。 x86 是最复杂的(但不是很好)。