【问题标题】:How a real kernel switches context真正的内核如何切换上下文
【发布时间】:2015-12-26 04:04:31
【问题描述】:

我现在知道几种中断执行线程并将上下文交换到另一个执行线程的方法。但是当内核收到来自硬件的中断并且当前代码停止执行时。内核如何将上下文切换到另一个线程。它是否也调用简单的 C 例程来执行此操作?还是必须执行自定义汇编代码才能实现?

假设这个内核在单处理器系统上运行。我只处理过用户空间中的操作系统概念,所以我不太清楚内核代码是如何从较低级别工作的。

注意:如果您想在现有内核(可能是 Linux)的上下文中解释这一点,请继续!我知道我对这个问题的措辞有点含糊。

谢谢!

【问题讨论】:

  • 每个内核处理的方式都特定于内核。除了你正在编写一个内核,这意味着没有简单的库调用,你必须处理寄存器的保存、堆栈指针、TLB 刷新等等。它不会简单,也依赖于架构
  • 让我们将其简化为与 Linux 的做法极为相似。我会更新我的问题
  • 它和C++有什么关系?
  • @curiousguy 当我问这个问题时,我正在用 C++ 思考
  • 我将其标记为关闭,太笼统,谷歌可以获取答案

标签: kernel


【解决方案1】:

如果中断没有触发挂起的上下文切换,它只会返回。如果中断确​​实触发了挂起的上下文切换,它会通过执行上下文切换的“调度程序”退出。 “调度程序”还根据时间片或当挂起的较高优先级线程变为可运行时进行上下文切换,通常是由于某些操作系统同步事件发出信号。

如果允许嵌套中断,则只有初始中断可以通过调度程序退出。初始中断设置某种类型的指示符,以便任何嵌套中断都知道它们不是初始中断并且不会尝试通过调度程序退出。

【讨论】:

  • 但是调度程序究竟是如何切换上下文的呢?它是在汇编中实现的吗?
  • @Curious:如果你想知道它“究竟是如何工作的”,那么你应该克隆 Linux 内核存储库并自己直接查看代码。
  • @ray 你能告诉我我应该查看哪个文件夹吗?
  • linux内核可以简单地调用swapcontext吗?
  • @Curious - 我不了解 Linux 或 Windows 的内部结构,只是一些简单的嵌入式操作系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2012-05-15
  • 1970-01-01
  • 2019-05-09
  • 2013-02-02
相关资源
最近更新 更多