Linux では、ソース ツリーがある場合、すべてのシステム コールのソース コードはどこにありますか? また、特定のシステム コールのソース コードとアセンブリを検索したい場合、次のように端末に入力できるものはあり my_system_call
ますか?
3 に答える
システム コールの実際のソースを確認するには、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
の数字は引数の数を意味します。たとえば、getpid(void)
で宣言されている の場合kernel/timer.c
、次のコードがあります。
SYSCALL_DEFINE0(getpid)
{
return task_tgid_vnr(current);
}
物事が少し解決することを願っています。
アプリケーションの観点から見ると、システム コールはカーネルによって実行される基本的かつ原子的な操作です。
Assembly Howtoでは、機械命令の観点から、何が起こっているかを説明しています。
もちろん、syscall を処理するとき、カーネルは多くのことを行っています。
実際には、カーネル コード全体がすべてのシステム コールの処理に専念していると思われるかもしれません (これは完全に正しいというわけではありませんが、ほとんどです。アプリケーションの観点からは、カーネルはシステム コールを介してのみ表示されます)。Daniel Kamil Kozar による もう 1 つの回答fork
は、どのカーネル関数がシステム コールの処理を開始しているかを説明するものです (ただし、多くの場合、カーネルの他の多くの部分が間接的にシステム コールに参加します。たとえば、スケジューラは、システム コールを管理するため、実装に間接的に参加します。成功したfork
syscallによって作成された子プロセス)。
私はそれが古いことを知っていますが、私もソースを探していて、_system_call()
この一口を見つけました
system_call エントリ ポイントの実際のコードは、/usr/src/linux/kernel/sys_call.S にあります。多くのシステム コールの実際のコードは、/usr/src/linux/kernel/sys.c にあります。他の場所で見つかります。find はあなたの友達です。
そのファイルすら持っていないので、これは日付が付けられていると思います。ただし、ENTRY(system_call)
arch/x86/kernel/entry_64.S にある grep は、個々のシステム コールを呼び出すもののようです。私は今 intel-syntax x86 asm に取り組んでいないので、これがあなたが望んでいたものかどうかを見て確認する必要があります。