2012-08-28 71 views
0

我已經在x86_64 Linux 3.0上實現了一個系統調用,並希望知道如何獲取調用進程的堆棧指針(%rsp)。我的系統調用是一個普通的系統調用...獲取堆棧指針x86_64 linux系統調用

我已經習慣了使用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)中的一個特殊宏設置了sys_fork函數,並使用適當的pt_regs棧幀調用該函數。

如何在我的系統調用中提取像IP和SS這樣的值,而不用強制在我的自定義系統調用上使用PTREGSCALL這樣的sys_fork進行額外的參數?

回答

0

如果能夠很好地理解何時調用系統調用,CPU會跳轉到內核代碼(特權跳轉),此時CPU會使用CS,RIP,RSP和Eflags寄存器填充堆棧以便返回給用戶代碼處理程序執行IRET(從中斷返回)。

這意味着當系統調用執行時,您可能會發現調用進程的RSP和RIP只是查看堆棧。

您可以在「AMD64體系結構,程序員手冊,卷2:系統編程」,第292頁中獲得更多信息。它被稱爲「中斷後的長模式堆棧 - 更高特權」。

在前面的回答中,我忽略了Linux內核處理系統調用的方式,但它並沒有改變答案。