Linux kernel Linux x86_64上32位进程报告的第一个伪系统调用参数?

Linux kernel Linux x86_64上32位进程报告的第一个伪系统调用参数?,linux-kernel,Linux Kernel,在Linux x86_64系统(至少运行2.6.32的RHEL 6.4)上,/proc/pid/syscall为32位进程报告的第一个syscall参数似乎是假的。。。我想确定原因 例如,如果一个进程在执行openat时被阻止(AT_FDCWD,…),我会在/proc/pid/syscall 64位: 257 0xffffffffffffff9c ... 32位: 295 0xffffffff810495c0 ... AT_FD_CWD==-100==0xFFFFFFFFFF9C,因此64位

在Linux x86_64系统(至少运行2.6.32的RHEL 6.4)上,
/proc/pid/syscall
为32位进程报告的第一个syscall参数似乎是假的。。。我想确定原因

例如,如果一个进程在执行openat时被阻止(AT_FDCWD,…),我会在
/proc/pid/syscall

64位:

257 0xffffffffffffff9c ...
32位:

295 0xffffffff810495c0 ...
AT_FD_CWD==-100==0xFFFFFFFFFF9C
,因此64位的大小写看起来是正确的,但32位的值似乎已被删除(其他参数看起来是正确的)

我知道我可以在堆栈顶部找到一个struct pt_regs,我可以通过

#define task_pt_regs(tsk)       ((struct pt_regs *)(tsk)->thread.sp0 - 1)
我在那里看到了虚假的价值

然而。。。strace似乎能够找到第一个参数的正确值,即使在32位的情况下也是如此。它执行ptrace(ptrace_PEEKUSER),AFAIK只查看相同的结构pt_regs

我一定错过了什么。。。strace有什么魔力可以让它通过PTRACE_用户查看有效的寄存器值?通过
/proc/pid/syscall
看到的第一个参数clobber会发生什么情况