Linux上下文切换内部机制:切换后进程如何回到用户态?

时间:2019-02-19 17:03:22

标签: linux kernel context-switch

我已阅读有关在StackOverflow上进行上下文切换的问题的类似答案: How does schedule()+switch_to() functions from linux kernel actually work?

但是,我仍然对内部结构感到困惑,并且缺乏对新切换的流程(以前被抢占的)如何在用户区恢复其执行的理解(假设它在Linux上被打断了。

到目前为止,上下文切换的一般流程(在v4.20上):

  1. 一个进程正在用户域中执行(让我们说firefox
  2. CPU时钟生成中断
  3. scheduler被称为
  4. __schedule()被称为
  5. 如果新任务(比如说systemd)比当前任务多different,则称context_switch()
  6. context_switch调用switch_to()
  7. 这时,CPU上下文切换到下一个任务,包括堆栈和虚拟地址空间
  8. 上一个任务由context_switch()返回

目前我不知道发生了什么事

->这个新任务正在执行吗?在switch_to代码中,我没有看到对正在使用的task_struct的指令指针的任何引用。

->我的systemd进程如何在用户区继续执行?

->我们应该在某个地方击iret吗?我在resume_kernel中看到了resume_userspaceentry_32.S符号,但我不理解它们如何连接到调度程序

->为什么task_struct-> thread结构中没有指令指针字段? IP如何存储和还原?

-> evey上下文切换是否包含一个中断,后跟iret?因此,我可以依靠这个事实来捕获上下文切换(通过捕获CR3负载)并单步执行,直到执行iret吗?

注意:之所以问这个问题,是因为我试图构建一个访客感知的hypervisor-level debugger。因此,我正在开发类似PTRACE_ATTACH的功能,但是只能使用hypervisors的VMI API

非常感谢您的时间和答复!

0 个答案:

没有答案