3

unistd.hヘッダーで宣言されている Unix 関数のLinux 3.2.21 x86_64実装を見つけようとしています。Linux のunistd.hを見ると、次のプロトタイプが生成されます。sync(2)

/* Make all changes done to all files actually appear on disk.  */
extern void sync (void) __THROW;

syncしたがって、これは Linux カーネルの外部で定義され、glibc 2.7の内部を見ていることを意味すると解釈します。これにより、glibc-2.17/misc/sync.cで次の定義が得られます。

/* Make all changes done to all files actually appear on disk. */
void
sync ()
{
  __set_errno (ENOSYS);
}

つまりsync、 の値を設定する以外は何もしませんerrno

ただし、システムで/usr/lib/x86_64-linux-gnu/libc.aを逆アセンブルすると、 syncセクションがシステム コールを作成し、値を渡していることがわかります162(つまり、何かを実行しています)。

arch/x86/include/asm/unistd_64.hで Linux ソースをもう一度見ると、次のように表示されます。

#define __NR_sync               162
__SYSCALL(__NR_sync, sys_sync)

今、私は本当に混乱しています。

sync(2)が Linux の外部で定義されている場合、なぜそれに対するシステム コールがあるのですか? syncx86_64 アーキテクチャの の定義はどこにありますか?

PS : arch/x86/kernel/syscall_64.c__SYSCALLでのプリプロセッサ定義を見つけましたが、これは、システム コールが として宣言された外部関数を呼び出すだけであることを暗示しているようです。この関数の定義はどこにありますか?syncvoid sys_sync(void)

4

1 に答える 1

7

を探していfs/sync.cます。見る:

SYSCALL_DEFINE0(sync)
{
...

あなたが投稿したglibcバージョンは、カーネルがシステムコールを公開しない非常に厄介なケースでコンパイルされたものである可能性がありsyncます。つまり、ほとんど使用されないスタブです。

于 2013-03-19T18:15:24.010 に答える