linux - 从进程上下文中跟踪内核中的单步?

标签 linux linux-kernel kernel ptrace

我想知道如果您从内核(在本例中为 Linux)在进程上下文(系统调用、页面错误等)中使用 PTRACE_SINGLESTEP 调用 ptrace_request 会发生什么。它会单步执行用户空间指令还是内核空间指令。我意识到 ptrace 只能单步执行用户指令,这就是为什么我很好奇这会产生的行为。

只是为了提供更多信息,我正在尝试从页面错误处理程序执行此操作(单步执行出错的指令但更改 PTE 以便指令通过)。我想知道这是否可能,或者是否需要另一种方法来做到这一点,例如重新安排进程运行等....

这是因为进程的 task_struct(如果被抢占)仍将指向内核空间处理程序 IIRC,所以使用 ptrace 的单步执行会绕过它并执行正确的用户空间指令还是根本不执行?

最佳答案

我不完全理解你的意思,PTRACE_SINGLESTEP 总是在用户上下文中从内核调用:当你执行系统调用 ptrace(PTRACE_SINGLESTEP) 时,你将最终在内核上下文中执行该函数,这将表现像往常一样让你正在跟踪的进程执行一条指令,不管你是否从页面错误处理程序调用它。当它像往常一样在内核态时,您将无法单步执行它。

我建议您查看 arch/x86/kernel/ptrace.c 以了解单个步骤的实际工作原理。单步指令实际上是由内核模拟的,IIRC 对此没有硬件支持。

关于linux - 从进程上下文中跟踪内核中的单步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7844569/

相关文章:

linux - 使用带有文本文件的 useradd 添加用户

linux - 在 Docker 容器外的 VPN (SNX) 内无法访问服务器

PHP 写入文件 - 权限被拒绝

c - 尽管出现警告消息 'not found",但已成功删除内核模块

linux - Webapp更新shell脚本

linux - 内核中线程特定的单调时钟源

c - 为什么我在通过内核模块访问 GPIO2 和 GPIO3 时在 Beaglebone Black 上出现段错误?

c - 在从 Linux 套接字发送/接收数据包后访问辅助数据时,在哪些情况下 msg_controllen 可以为 0?

c - 使用内核模块中的 sysctl 接口(interface)

c - 哪些IO口用于编码引擎、传感器