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

Linux 被ptrace中断的CPU上下文在哪里,是用户空间堆栈还是内核堆栈?,linux,exception,linux-kernel,interrupt,ptrace,Linux,Exception,Linux Kernel,Interrupt,Ptrace,在Linux x86_64上,当我使用ptrace停止进程时,是保存所有线程的CPU上下文,还是只保存进程的CPU上下文 上下文是进程的用户空间堆栈还是内核堆栈?还是别的地方?还是多份 对于其他情况(不是ptrace),中断的CPU上下文(包括异常和系统调用)可以保存在哪里、内核堆栈、用户空间堆栈或其他地方 ptrace是一个中断吗 更新 看起来,ptrace的上下文pt_regs_x86_t的保存位置是由程序员决定的。但是内核还会为中断的上下文存储一个副本吗?是的,内核将始终为当前未执行的任

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

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

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

ptrace是一个中断吗


更新


看起来,ptrace的上下文pt_regs_x86_t的保存位置是由程序员决定的。但是内核还会为中断的上下文存储一个副本吗?

是的,内核将始终为当前未执行的任何线程存储上下文。无论线程是否被ptrace,上下文基本上是相同的。区别在于如何/是否可以重新调度线程——如果正在进行ptrace,跟踪进程将决定何时可以恢复

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

正如您所发现的,当一个进程被ptrace'd时,跟踪程序被授予对被跟踪线程寄存器的访问权,该状态与线程上次执行时的状态相同。这只需从跟踪线程的内核堆栈复制保存的寄存器即可实现


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

这里异常和int 0x80包含在中断中,对吗?这里的syscall是指sysenter/sysexit,对吗?是的,存在实际中断(由外部事件/设备引起)、用户进程直接调用的陷阱(sysenter、int 0x80等)以及由用户代码行为(页面错误、被零除、分段冲突等)引起的陷阱或错误。但是所有这些都会在内核中产生相同类型的上下文保存。那么内核代码导致的错误会怎样呢?ptrace()ptrace_SETREGS可以在单个线程中工作,而不仅仅是进程,对吗?