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时,我发现同步部分进行了系统调用,并传递了值162(所以它正在做某事)。

在arch/x86/include/asm/unistd_64.h再次查看 Linux 源代码,我看到:

#define __NR_sync               162
__SYSCALL(__NR_sync, sys_sync)

现在我真的很困惑。

如果sync(2)是在 Linux 之外定义的,为什么会有系统调用呢?syncx86_64 架构的定义在哪里?

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

4

1 回答 1

7

您正在寻找fs/sync.c. 看:

SYSCALL_DEFINE0(sync)
{
...

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

于 2013-03-19T18:15:24.010 回答