在Linux x86_64上,当我使用ptrace来停止进程时,是否会保存所有线程的CPU上下文,或者只保存进程的CPU上下文?
进程的用户空间堆栈或内核堆栈上的上下文是什么?或者别的地方?还是多份?
对于其他情况(不是ptrace),中断的(包括异常和系统调用)CPU上下文可以保存在哪里,内核堆栈,用户空间堆栈还是其他地方?
ptrace是中断吗?
更新
似乎ptrace的上下文pt_regs_x86_t,保存位置由程序员决定。但内核是否也会为中断的上下文存储副本?
答案 0 :(得分:1)
是的,内核将始终存储当前未执行的任何线程的上下文。无论线程是否被ptrace,该上下文大致相同。区别在于如何/是否可以重新安排线程 - 如果正在进行调度,则跟踪过程将决定何时可以恢复该线程。
线程的用户空间上下文存储在内核堆栈中(但重要的是要注意每个线程都有一个单独的内核堆栈区域)。无论线程是通过执行系统调用进入内核还是由于中断而暂停 - 这都是相同的 - 最终,这些是线程可以被暂停的两种方式。
正如您所发现的,当进程被ptrace时,跟踪程序可以在线程上次执行时获得对跟踪线程寄存器的访问权限。这是通过简单地从跟踪线程的内核堆栈中复制保存的寄存器来实现的。
最后,值得注意的是,如果你看一下linux内核代码,你就找不到任何具体的流程表示。进程只是一组共享其状态的各个部分的相关线程:进程ID,地址空间,文件描述符等。