内核 - Linux - 内核在哪里与 cpu 对话?

Kernel - Linux - Where does the kernel talks to the cpu?

上下文:

Linux 64. 英特尔酷睿 2 双核处理器。

问题:

Linux 内核在哪里与 cpu 进行“通信”? 我阅读了调度程序的源代码,但无法理解 它们如何 通信以及内核如何告诉 cpu 需要处理某些内容。

我知道有 运行 个队列,但是没有让内核能够通过总线中断 cpu 的东西吗?

更新

它稍微扩展了我最初的问题:我们如何知道 cpu 任务队列在哪里

因为 cpu 必须轮询一些东西,我想我们会在某个时候告诉它。错过了内核代码中的那一点。

Linux内核是一个程序。它不会 "talk" 到 CPU 本身; CPU 有一个特殊的寄存器,program counter (PC),它指向 CPU 正在处理的内核的当前执行。

内核本身包含很多服务。其中之一管理任务队列。任务队列中的每个条目都包含有关任务的信息。此类信息之一是任务 运行 所在的 CPU 核心。当内核决定服务应该做一些工作时,它会调用它的函数。这些函数由 CPU 解释的 instructions 组成。它们中的大多数会更改 CPU 的状态(例如推进 PC、更改寄存器值、设置标志、enabling/disabling CPU 内核,...)。

这意味着 CPU 没有轮询任何内容。根据调度器的不同,使用不同的策略来处理任务队列。最简单的一个是基于计时器的:内核安装一个计时器中断(即它在某处写入中断处理程序的地址加上它配置计时器以每隔几毫秒引起一次中断)。

处理程序然后查看任务队列并根据其策略决定要做什么。

我会尝试写一个简单的解释它是如何工作的,如果有任何不清楚的地方告诉我。

一个CPU只做一件事:执行指令。它将从一个预定义的地址开始,然后执行。就这样。有时你可以有一个中断,这将暂时使 CPU 跳转到另一条指令。

内核是一个程序(=一系列指令),可以轻松执行其他程序。内核将做他的工作来设置它需要的东西。这通常包括构建进程列表 运行。 "process" 的定义完全取决于内核,因为如您所知,CPU 只做一件事。

现在,当内核 运行s(由 CPU 执行)时,它可能决定需要执行一个进程。为此,内核将简单地跳转到进程程序。它是如何完成的并不重要,但在大多数操作系统中,内核会将周期性中断(CPU 将周期性地跳转)映射到一个函数,该函数决定执行哪个进程并跳转到它。这不是必需的,但它很方便,因为程序将被强制 "interrupted" 周期性地执行,因此其他程序也可以执行。

总而言之,CPU 没有 "know" 任何东西。内核运行s,并且会跳转到其他进程代码使它们运行。只有内核 "knows".