Linuxでは、ソースツリーがある場合、すべてのシステムコールのソースコードはどこにありますか?また、特定のシステムコールのソースコードとアセンブリを検索する場合は、my_system_call
などのターミナルに入力できるものはありますか?
システムコールの実際のソースを表示するには、Linuxカーネルソースが必要です。マニュアルページは、ローカルシステムにインストールされている場合、呼び出しのドキュメントのみが含まれ、ソース自体は含まれていません。
残念ながら、システムコールは、カーネルツリー全体の特定の1つの場所に格納されていません。これは、さまざまなシステムコールがシステムのさまざまな部分(プロセス管理、ファイルシステム管理など)を参照する可能性があるため、システムの特定の部分に関連するツリーの部分とは別にそれらを格納することが不可能になるためです。
あなたができる最善のことは_SYSCALL_DEFINE[0-6]
_マクロを探すことです。これは、明らかに、特定のコードブロックをシステムコールとして定義するために使用されます。たとえば、_fs/ioctl.c
_には次のコードがあります。
_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
{
/* do freaky ioctl stuff */
}
_
このような定義は、ioctl
syscallが宣言され、3つの引数を取ることを意味します。 _SYSCALL_DEFINE
_の横の数字は、引数の数を意味します。たとえば、_kernel/timer.c
_で宣言されているgetpid(void)
の場合、次のコードがあります。
_SYSCALL_DEFINE0(getpid)
{
return task_tgid_vnr(current);
}
_
少し問題が解決したことを願っています。
アプリケーションの観点から見ると、 システムコール は カーネル によって実行される基本的でアトミックな操作です。
Assembly Howto は、マシンインストラクションの観点から、何が起こっているかを説明します。
もちろん、syscallを処理するとき、カーネルは多くのことをしています。
実際、カーネルコード全体がすべてのシステムコールを処理するために費やされているとほとんど信じられます(これは完全に正しいわけではありませんが、ほとんどの場合、アプリケーションの観点から見ると、カーネルはシステムコールを通してしか見えません)。他の answer によるDaniel Kamil Kozarは、一部のシステムコールの処理を開始するカーネル関数を説明しています(ただし、多くの場合、カーネルの他の多くの部分が間接的にシステムコールに参加しています。たとえば、スケジューラが参加しています) fork
の実装に間接的に影響します。これは、成功したfork
syscallによって作成された子プロセスを管理するためです)。
古いことは知っていますが、_system_call()
のソースも探していて、この一口を見つけました
System_callエントリポイントの実際のコードは/usr/src/linux/kernel/sys_call.Sにあります。多くのシステムコールの実際のコードは/usr/src/linux/kernel/sys.cにあり、残りは他の場所にあります。あなたの友達です。
私はそのファイルすら持っていないので、これは日付が付けられていると思います。しかし、grepはArch/x86/kernel/entry_64.SでENTRY(system_call)
を見つけ、個々のシステムコールを呼び出すもののようです。私は今、インテルシンタックスx86 asmを使用していません。そのため、これが必要かどうかを確認する必要があります。