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 の外部で定義されている場合、なぜそれに対するシステム コールがあるのですか? sync
x86_64 アーキテクチャの の定義はどこにありますか?
PS : arch/x86/kernel/syscall_64.c__SYSCALL
でのプリプロセッサ定義を見つけましたが、これは、システム コールが として宣言された外部関数を呼び出すだけであることを暗示しているようです。この関数の定義はどこにありますか?sync
void sys_sync(void)