web-dev-qa-db-ja.com

システムコールのソースコードはどこにありますか?

Linuxでは、ソースツリーがある場合、すべてのシステムコールのソースコードはどこにありますか?また、特定のシステムコールのソースコードとアセンブリを検索する場合は、my_system_callなどのターミナルに入力できるものはありますか?

29
Dr.Knowitall

システムコールの実際のソースを表示するには、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);
}
_

少し問題が解決したことを願っています。

34

アプリケーションの観点から見ると、 システムコールカーネル によって実行される基本的でアトミックな操作です。

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を使用していません。そのため、これが必要かどうかを確認する必要があります。

2
KitsuneYMG