GNU/Linux >> Linux の 問題 >  >> Linux

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

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

残念ながら、システム コールはカーネル ツリー全体の特定の 1 つの場所だけに保存​​されるわけではありません。これは、さまざまなシステム コールがシステムのさまざまな部分 (プロセス管理、ファイル システム管理など) を参照できるため、システムの特定の部分に関連するツリーの部分とは別にそれらを格納することができないためです。 /P>

あなたができる最善のことは、 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 の隣の数字 引数の数を意味します。例えば ​​getpid(void) の場合 、kernel/timer.c で宣言 、次のコードがあります:

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

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


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

Assembly Howto では、機械命令の観点から何が起こっているかを説明しています。

もちろん、syscall を処理するとき、カーネルは多くのことを行っています。

実際には、カーネル コード全体がすべてのシステム コールの処理に専念していると思われるかもしれません (これは完全に正しいというわけではありませんが、ほとんどです。アプリケーションの観点からは、カーネルはシステム コールを介してのみ表示されます)。 Daniel Kamil Kozar によるもう 1 つの回答は、どのカーネル関数が何らかのシステム コールの処理を開始しているかを説明しています (ただし、多くの場合、カーネルの他の多くの部分がシステム コールに間接的に参加します。たとえば、スケジューラは fork 成功した fork によって作成された子プロセスを管理するため システムコール)


Linux
  1. php.ini はどこにありますか?

  2. Linux CFS スケジューラ コードはどこにありますか?

  3. パフォーマンス コール グラフのソース行番号は?

  1. Linux システムが Wayland または X11 を使用しているかどうかを調べるにはどうすればよいですか?

  2. 最速の Linux システム コール

  3. VirtualBox 用の Amazon Linux AMI イメージはどこにありますか?

  1. Linux –特定のバージョンのLinuxカーネルソースコードをどこでダウンロードしますか?

  2. システムがフリーズします。ログに何も見つかりません

  3. ソース コード行へのカーネル スタック トレース