2013-03-19 42 views
2

我试图找到的Linux 3.2.21 x86_64的实现在unistd.h中头部声明的sync(2)的Unix功能的同步(2)Linux的函数调用的定义。纵观Linux的unistd.h中得到这个原型:凡是x86_64的处理器

/* 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(这样做东西)。

在Linux的源代码重新在arch/x86/include/asm/unistd_64.h看,我看到:

#define __NR_sync    162 
__SYSCALL(__NR_sync, sys_sync) 

现在我真的很困惑。

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

P.S.:我确实发现​​的预处理器定义为arch/x86/kernel/syscall_64.c,但这似乎暗示sync系统调用只是调用声明为void sys_sync(void)的外部函数。这个功能的定义在哪里?

回答

6

您正在查找fs/sync.c。请参阅:

SYSCALL_DEFINE0(sync) 
{ 
... 

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

+0

我也建议看看http://musl-libc.org/这是一个替代的libc库,其源代码比Gnu Libc更容易理解 – 2013-03-19 18:24:16