2011-03-31 52 views

回答

1

系統調用是用戶和內核空間之間的接口。列表見man 2 syscallssyscalls.h

不應該將它們與標準C庫函數(如printf)混淆。這些通常最終會調用系統調用,但不一定。此外,用戶空間程序可以直接使用syscall函數調用系統調用。

+0

但是如何識別系統調用**編程**??? – gdb 2011-03-31 01:34:43

+0

底線是它使用['ptrace'](http://linux.die.net/man/2/ptrace)。你可以閱讀[來源](http://www.google.com/codesearch/p?hl=en#cZwlSNS7aEw/external/strace/strace.c&q=strace.c&sa=N&cd=1&ct=ri)(這是Android版本)的確切細節。 – 2011-03-31 01:40:40

+0

它如何攔截參數? – 2011-09-23 15:30:11

30

正如馬修所說,strace使用系統調用來發揮其魔力。 ptrace用於實現調試器和其他需要檢查其他程序正在做什麼的工具。實質上,strace會調用ptrace並附加到目標進程。

只要目標進程進行系統調用,它就會停止,並會通知strace。然後strace將檢查目標進程的寄存器和堆棧(也使用ptrace)來確定正在進行什麼系統調用(每個調用都有唯一的編號,通過寄存器傳遞)以及參數是什麼。 strace然後恢復過程。當它從系統調用中返回時,它會停止,並且會再次通知strace,因此它可以檢查返回值。 strace會在每次發生這種情況時爲用戶打印一些信息。

在回答第二個問題時,系統調用與普通函數調用不同,系統調用在內核中實現,而常規函數在用戶空間中實現。儘管如此,這是一個完整的蠕蟲。

3

我寫了一篇博客文章about how strace works和一篇更長的博文about how syscalls work

strace通過使用ptrace系統調用進行工作,這會導致內核在每次進入或退出內核時都會通過系統調用暫停正在被跟蹤的程序。跟蹤程序(在這種情況下爲strace)可以使用ptrace檢查程序的狀態。

strace根據系統的工作方式獲取每個系統調用的參數。在x86-64系統上,系統調用的參數在CPU寄存器中傳遞。在這種情況下,strace可以使用PTRACE_GETREGS參數調用ptrace來獲取寄存器值的副本並將其打印出來。