【问题标题】:Kernel - Linux - Where does the kernel talks to the cpu?内核 - Linux - 内核在哪里与 cpu 对话?
【发布时间】:2015-05-05 15:00:35
【问题描述】:

上下文:

Linux 64。 英特尔酷睿 2 双核。

问题:

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

我知道有运行队列,但不是有什么东西可以让内核通过总线中断 cpu 吗?

更新

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

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

【问题讨论】:

  • 内核是CPU正在运行的程序。就这样。它是内存中的一堆命令,由 CPU 获取并执行。
  • @Larry 你在说什么队列?
  • 如果绝对无事可做.. CPU 内核可能会停止.. 至少 cpu 调控器就是这样做的。
  • 这个问题写的太宽泛了。请指定架构,最好指定单一类型的 CPU,例如核心 i5 等。由于编写了这个问题,因此没有一个好的答案,因为它非常依赖于硬件。
  • @Larry Understanding the Linux Kernel 有一个很棒的章节介绍了 Linux 调度程序的工作原理。

标签: c linux linux-kernel scheduler


【解决方案1】:

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

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

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

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

总而言之,CPU 什么都不“知道”。内核运行,并将跳转到其他进程代码以使它们运行。只有内核“知道”。

【讨论】:

  • 敲钟!内核跳转到该地址。这就是我错过的!我将尝试在内核源代码中找到有关它如何做到这一点的线索。我想我会在那里见到 tss、GDT 和家人 :)
  • @Larry 从内核到进程的转换(跳转)通常带有上下文切换。即保存前一个进程上下文并加载下一个进程上下文。
  • 非常感谢ElderBug,我现在正在阅读很多关于这个主题的内容,并开始了解事情是如何运作的。你明白我失败的地方:大局。感谢您的帮助。
  • @Larry 很高兴为您提供帮助。如果您还没有遇到过,OSDev wiki 对于一般的操作系统机制来说真的很有趣。如果您在主页上向下滚动一点,在“设计注意事项”部分,您对调度有一些看法。
  • 这正是我作为初学者所需要的。再次感谢。
【解决方案2】:

Linux 内核是一个程序。它不会像这样与 CPU“对话”; CPU 有一个特殊的寄存器,program counter (PC),它指向 CPU 正在处理的内核的当前执行。

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

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

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

【讨论】:

  • 谢谢亚伦,我需要了解更多相关信息。我不明白“我猜”的全貌。 :)
猜你喜欢
  • 2016-11-29
  • 1970-01-01
  • 2021-01-13
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2017-10-14
  • 2017-04-18
相关资源
最近更新 更多