2012-04-13 17 views
22

linuxでは、私はソースツリーを持っていることを前提に、すべてのシステムコールのソースコードを見つけることができますか?また、特定のシステムコールのソースコードとアセンブリを調べたい場合は、-my_system_callのように端末に入力できるものがありますか?システムコールのソースコードはどこにありますか?

+2

http://kernel.org/ – TJD

答えて

29

システムコールの実際のソースを確認するには、Linuxカーネルソースが必要です。マニュアルページは、ローカルシステムにインストールされている場合は、呼び出し元のドキュメントのみが含まれています。

残念ながら、システムコールはカーネルツリー全体の特定の場所に保存されません。これは、さまざまなシステムコールがシステムのさまざまな部分(プロセス管理、ファイルシステム管理など)を参照できるため、システムの特定の部分に関連するツリーの部分からそれらを保存することは実行不可能であるためです。

あなたができることは、SYSCALL_DEFINE[0-6]マクロを探すことです。与えられたコードブロックをシステムコールとして定義するために使用されます(明らかに)。

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) 
{ 
/* do freaky ioctl stuff */ 
} 

このような定義はioctlシステムコールが宣言されていることを意味し、3つの引数を取ります。たとえば、fs/ioctl.cは、次のコードを持っています。 SYSCALL_DEFINEの横の数字は引数の数を意味します。

SYSCALL_DEFINE0(getpid) 
{ 
     return task_tgid_vnr(current); 
} 

希望を少し物事をクリアします:たとえば、getpid(void)の場合には、kernel/timer.cで宣言され、私たちは、次のコードを持っています。

2

アプリケーションの観点からは、system callは、kernelで行われる基本的な原子操作です。

Assembly Howtoは、マシンの命令に関して何が起こっているのかを説明します。

もちろん、カーネルはシステムコールを処理するときに多くのことを行っています。

実際には、カーネルコード全体がすべてのシステムコールを処理すると考えられます(これはまったく真実ではありませんが、ほとんどの場合、アプリケーションの観点からはカーネルはシステムコールを通してしか見えません)。 Daniel Kamil Kozarの他のanswerは、何らかのシステムコールの処理を開始しているカーネル機能を説明しています(しかし、カーネルの他の多くの部分が間接的にシステムコールに関与することがよくあります。成功したforkシステムコールによって作成された子プロセス)。

1

私はそれが古いですけど、私はあまりにも_system_call()のソースを検索し、SYSTEM_CALLエントリポイントについてこのちらほら

実際のコードは、/ sys_callは/ usr/src/linuxの/カーネルで見つけることができますがわかりました。 Sシステムコールの多くの実際のコードは/usr/src/linux/kernel/sys.cにあり、残りは他の場所にあります。 findはあなたの友人です。

私はこのファイルも持っていないので、これは日付だと思います。しかし、grepはarch/x86/kernel/entry_64.SにENTRY(system_call)が見つかり、個々のシステムコールを呼び出すものと思われます。私はintel-syntax x86 asmではないので、あなたが見たいと思っているかどうか見てみる必要があります。

+0

メインライン4.8では 'entry_64.S'が存在しなくなりました。 – sherrellbc

関連する問題