被 ptrace 中断的 CPU 上下文在哪里,用户空间栈还是内核栈?

Where would the CPU context interrupted by ptrace be, userspace stack or kernel stack?

在 Linux x86_64 上,当我使用 ptrace 停止进程时,会保存所有线程的 CPU 上下文,还是只保存进程的 CPU要保存上下文吗?

上下文是进程的用户空间栈还是内核栈?或者别的地方?还是多份?

对于其他情况(不是 ptrace),中断(包括异常和系统调用)CPU 上下文保存在哪里,内核堆栈,用户空间堆栈或其他地方?

ptrace是中断吗?


更新

看来,ptrace的上下文pt_regs_x86_t,保存到哪里,是程序员决定的。但是内核是否也会为中断的上下文存储一个副本?

是的,内核将始终存储当前未执行的任何线程的上下文。无论线程是否被 ptrace,该上下文在很大程度上是相同的。不同之处在于 how/whether 线程可以重新调度——如果正在跟踪,跟踪进程将决定何时可以恢复。

线程的user-space上下文存储在内核栈中(但需要注意的是每个线程都有一个单独的内核栈区)。无论线程是通过执行系统调用进入内核,还是由于中断而被挂起,都是一样的——最终,这是线程挂起的唯一两种方式。

正如您所发现的,当一个进程被 ptrace 时,跟踪程序可以访问被跟踪线程的寄存器,这些寄存器处于线程上次执行时的状态。这是通过简单地从跟踪线程的内核堆栈中复制保存的寄存器来实现的。

最后,值得注意的是,如果您查看 linux 内核代码,您将找不到进程的任何具体表示。进程只是一组共享其状态的各个部分的相关线程:进程 ID、地址 space、文件描述符等