【问题标题】:Getting stack pointer x86_64 linux syscall获取堆栈指针 x86_64 linux 系统调用
【发布时间】:2012-08-23 12:08:42
【问题描述】:

我在 x86_64 Linux 3.0 上实现了一个系统调用,想知道如何获取调用进程的堆栈指针 (%rsp)。我的系统调用是一个普通的系统调用......

我习惯使用task_pt_regs获取调用进程的栈帧,但是从arxh/x86/include/asm/ptrace.hstruct pt_regs中的cmets注意非跟踪系统调用不会读取所有寄存器:ip,cs,当调用 CPU syscall 指令并调用我的实际系统调用时,未设置标志、sp 和 ss。换句话说,在我的系统调用中task_pt_regs(current)->ss 是垃圾。

对于像 sys_fork 这样的调用,arch/x86/kernel/entry_64.S (PTREGSCALL) 中的一个特殊宏设置要使用适当的 pt_regs 堆栈帧调用的 sys_fork 函数。

如何在我的系统调用中提取 IP 和 SS 之类的值,而不用PTREGSCALL 对我的自定义系统调用(例如 sys_fork)强制添加额外的参数?

【问题讨论】:

    标签: linux-kernel x86-64


    【解决方案1】:

    如果可以很好地理解当调用系统调用时 CPU 会跳转到内核代码(特权跳转),那一刻 CPU 会用 CS、RIP、RSP 和 Eflags 寄存器填充堆栈以返回用户代码当处理程序执行 IRET(从中断返回)时。

    这意味着当系统调用执行时,您可能会在堆栈中查找调用进程的 RSP 和 RIP。

    您可以在“AMD64 Architecture, Programmer's Manual, Volume 2: System Programming”中获得更多信息,第 292 页。它被称为“中断后的长模式堆栈——更高的特权”。

    在上一个答案中,我忽略了一些关于 Linux 内核处理系统调用方式的内容,但它并没有改变答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 2016-02-03
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2010-11-08
      相关资源
      最近更新 更多