CPU 是否总是在内核模式下执行指令?

Does CPU always execute instructions in kernel mode?

这也许是一个非常愚蠢的问题,但它已经困扰了我一段时间。我的疑问是,由于调度到 CPU 的唯一线程是内核线程(通常),并且由于每个用户线程都映射到内核线程,这是否意味着内核中的所有应用程序本质上都是 运行模式?

有多种情况,其中一些不太常见。一个可能的例子(不太常见的情况)是每个 CPU 有一个内核堆栈,“保存用户-space 线程状态”作为特权级别从用户-space 更改的一部分到内核​​并“加载可能不同的 user-space 线程状态”作为特权级别的一部分从内核更改回 user-space(很难说内核代码是否使用 1 thread/task根据 CPU 或如果内核代码根本不使用 threads/tasks 的概念并且仅存在于潜在用户-space 线程切换的两半之间)。

对于常见的场景,每个 thread/task 都有一个内核部分(和它自己的内核堆栈等)和一个 user-space 部分(和它自己的 user-space堆栈等)。在这种情况下,它可以描述为仅在线程使用其内核部分时才会发生的任务切换;但是在任务切换之后,任务的内核部分可以切换到同一个任务的 user-space 部分,并在需要时再次返回(例如,对于内核系统调用和 IRQ)。

请注意,这不是描述常见场景的唯一方式;但这是我更喜欢的方式(因为它避免了“初学者陷阱”——具体来说,IRQ 是任务切换的必要部分的错误假设)。

我怀疑这种描述常见场景的方式(即任务切换只发生在任务之间 运行 内核代码)引起了您的怀疑。