我已经在 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
?