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

时间:2012-08-28 22:35:06

标签: linux-kernel x86-64

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

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

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

如何在我的系统调用中提取IP和SS等值,而不会在我的自定义系统调用(例如带有PTREGSCALL的sys_fork)上强加额外的参数?

1 个答案:

答案 0 :(得分:0)

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

这意味着在执行系统调用时,您可能会发现调用进程的RSP和RIP只是查看堆栈。

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

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