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

Vil*_*ray 3 c linux glibc libc linux-kernel

我正在尝试找到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;
Run Code Online (Sandbox Code Playgroud)

所以我认为这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);
}
Run Code Online (Sandbox Code Playgroud)

所以这意味着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)
Run Code Online (Sandbox Code Playgroud)

现在我真的很困惑.

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

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

cni*_*tar 7

你在找fs/sync.c.看到:

SYSCALL_DEFINE0(sync)
{
...
Run Code Online (Sandbox Code Playgroud)

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