質問: linuxカーネルシステムコールの実装を見つけるにはどうすればよいですか? カーネルソースを調べることで、mkdirなどの関数がどのように機能するかを理解しようとしています。これは、カーネルの内部を理解し、さまざまな機能間を移動する試みです。 mkdirはsys/stat.hで定義されています。私はプロトタイプを見つけました:/* create a new directory named path, with permission bits mode. */ extern int mkdir (__const char *__path, __mode_t __mode) __throw __nonnull ((1)); 次に、この関数が実装されているcファイルを確認する必要があります。ソースディレクトリから、私は試しましたack "int mkdir" 表示されたsecurity/inode.c 103:static int mkdir(struct inode *dir, struct dentry *dentry, int mode) tools/perf/util/util.c 4:int mkdir_p(char *path, mode_t mode) tools/perf/util/util.h 259:int mkdir_p(char *path, mode_t mode); ただし、sys/stat.hの定義に一致するものはありません。質問 どのファイルにmkdir実装がありますか? 上記のような関数定義を使用して、どのファイルに実装があるかをどのように確認できますか?メソッドの定義と実装でカーネルが従うパターンはありますか? 注:私はカーネル 2.6.36-rc1 を使用しています。
回答: システムコールは通常syscall_definex()マクロでラップされます。そのため、単純なgrepはそれらを見つけられません。_fs/namei.c:syscall_define2(mkdir, const char __user *, pathname, int, mode) _マクロが展開された後の最終的な関数名は、最終的に_sys_mkdir_になります。 syscall_definex()マクロは、各syscall定義に必要なトレースコードなどの定型的なものを追加します。