0

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

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

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

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

4

1 回答 1

0

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

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

您可以在“ AMD64 架构,程序员手册,第 2 卷:系统编程”,第 292 页中获得更多信息。它被称为“中断后的长模式堆栈——更高的特权”。

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

于 2012-09-17T14:26:11.167 回答