x86_64处理器的sync(2)Linux函数调用的定义在哪里

时间:2013-03-19 18:06:43

标签: c linux linux-kernel glibc libc

我正在尝试找到 unistd.h 标头中声明的sync(2) Unix函数的 Linux 3.2.21 x86_64 实现。查看Linux unistd.h 会产生这个原型:

/* 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)

现在我真的很困惑。

如果在Linux之外定义了sync(2),为什么要对它进行系统调用? x86_64架构的sync定义在哪里?

PS :我确实在arch/x86/kernel/syscall_64.c找到了__SYSCALL的预处理器定义,但这似乎意味着sync系统调用只调用外部函数声明为void sys_sync(void)。这个函数的定义在哪里?

1 个答案:

答案 0 :(得分:6)

您正在寻找fs/sync.c。参见:

SYSCALL_DEFINE0(sync)
{
...

您发布的glibc版本很可能是在内核未公开sync系统调用的非常尴尬的情况下编译的。换句话说,它是一个几乎从未使用过的存根。