Operating system CPU总是在内核模式下执行指令吗?

Operating system CPU总是在内核模式下执行指令吗?,operating-system,scheduling,kernel-mode,Operating System,Scheduling,Kernel Mode,这也许是一个非常愚蠢的问题,但它困扰了我一段时间。我的疑问是,由于CPU上调度的唯一线程(通常)是内核线程,而且每个用户线程都映射到一个内核线程,这是否意味着所有应用程序基本上都在内核模式下运行?存在多个场景,其中一些不太常见。一个可能的例子(一个不太常见的场景)是每个CPU有一个内核堆栈,“保存用户空间线程状态”作为从用户空间到内核的权限级别更改的一部分,“加载可能不同的用户空间线程状态”作为从内核到用户空间的权限级别更改的一部分(这里很难说内核的代码是否每个CPU使用1个线程/任务,或者内核

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

存在多个场景,其中一些不太常见。一个可能的例子(一个不太常见的场景)是每个CPU有一个内核堆栈,“保存用户空间线程状态”作为从用户空间到内核的权限级别更改的一部分,“加载可能不同的用户空间线程状态”作为从内核到用户空间的权限级别更改的一部分(这里很难说内核的代码是否每个CPU使用1个线程/任务,或者内核的代码是否根本不使用线程/任务的概念,并且只存在于潜在用户空间线程开关的两部分之间)

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

请注意,这不是描述常见场景的唯一方法;但它是我首选的方法(因为它避免了“初学者陷阱”——特别是错误的假设,即IRQ是任务切换的必要部分)


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

如果我理解正确,您是说每个线程都由内核段和用户段组成,因此内核线程不单独存在?@Jamāl:是的(虽然我不想使用“段”这个词,但它有太多其他含义)。你可以随意从内核切换到使用空间,而不必更改任务(然后当任务在内核中时,你可以在内核中切换到另一个任务,然后将下一个任务从内核任意切换到用户空间)哦,明白了!谢谢。