我已阅读有关在StackOverflow上进行上下文切换的问题的类似答案: How does schedule()+switch_to() functions from linux kernel actually work?
但是,我仍然对内部结构感到困惑,并且缺乏对新切换的流程(以前被抢占的)如何在用户区恢复其执行的理解(假设它在Linux上被打断了。
到目前为止,上下文切换的一般流程(在v4.20
上):
firefox
)systemd
)比当前任务多different,则称context_switch() 目前我不知道发生了什么事
->这个新任务正在执行吗?在switch_to
代码中,我没有看到对正在使用的task_struct的指令指针的任何引用。
->我的systemd
进程如何在用户区继续执行?
->我们应该在某个地方击iret
吗?我在resume_kernel中看到了resume_userspace和entry_32.S符号,但我不理解它们如何连接到调度程序。
->为什么task_struct
-> thread
结构中没有指令指针字段? IP如何存储和还原?
-> evey上下文切换是否包含一个中断,后跟iret
?因此,我可以依靠这个事实来捕获上下文切换(通过捕获CR3负载)并单步执行,直到执行iret
吗?
注意:之所以问这个问题,是因为我试图构建一个访客感知的hypervisor-level debugger。因此,我正在开发类似PTRACE_ATTACH
的功能,但是只能使用hypervisors的VMI API
非常感谢您的时间和答复!