我在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.S
(PTREGSCALL
)中的一个特殊宏设置要使用适当的pt_regs堆栈帧调用的sys_fork函数。
如何在我的系统调用中提取IP和SS等值,而不会在我的自定义系统调用(例如带有PTREGSCALL
的sys_fork)上强加额外的参数?
答案 0 :(得分:0)
如果能够很好地理解调用系统调用时CPU会跳转到内核代码(特权跳转),那时CPU会用CS,RIP,RSP和Eflags寄存器填充堆栈以返回用户代码当处理程序执行IRET(从中断返回)时。
这意味着在执行系统调用时,您可能会发现调用进程的RSP和RIP只是查看堆栈。
您可以在“ AMD64体系结构,程序员手册,第2卷:系统编程”,第292页中获得更多信息。它被称为“中断 - 更高权限后的长模式堆栈”。
在上一个回答中,我忽略了Linux内核处理系统调用的方式,但它没有改变答案。