Linux kernel 获取堆栈指针x86_64 linux系统调用

Linux kernel 获取堆栈指针x86_64 linux系统调用,linux-kernel,x86-64,Linux Kernel,X86 64,我已经在x86_64 Linux 3.0上实现了一个系统调用,我想知道如何获取调用进程的堆栈指针(%rsp)。我的系统调用是普通的系统调用 我习惯于使用task\u pt_regs来获取调用进程的堆栈帧,但是从arxh/x86/include/asm/ptrace.h中,struct pt_regs中的注释注意,非跟踪系统调用不会读取所有寄存器:ip、cs、flags、,当调用CPUsyscall指令并调用我的实际syscall时,不会设置sp和ss。换句话说,在我的系统调用中,task\u p

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

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

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


如何提取系统调用中的IP和SS等值,而不在自定义系统调用(如sys_fork)上使用
PTREGSCALL

强制附加参数?

如果我能很好地理解调用系统调用时CPU跳转到内核代码(特权跳转),此时CPU会用CS、RIP填充堆栈,RSP和Eflags注册,以便在处理程序执行IRET(中断返回)时返回到用户代码

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

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

在前面的回答中,我忽略了Linux内核处理系统调用的一些方法,但这并没有改变答案