【问题标题】:Where is the definition of the sync(2) Linux function call for x86_64 processorsx86_64 处理器的sync(2) Linux 函数调用的定义在哪里
【发布时间】:2013-03-08 13:57:31
【问题描述】:

我正在尝试查找 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)

现在我真的很困惑。

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

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

【问题讨论】:

    标签: c linux linux-kernel glibc libc


    【解决方案1】:

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

    SYSCALL_DEFINE0(sync)
    {
    ...
    

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

    【讨论】:

    • 我还建议查看musl-libc.org,这是一个替代 libc 库,其源代码比 Gnu Libc 更容易理解
    猜你喜欢
    • 2017-05-05
    • 2012-06-13
    • 2012-11-12
    • 2023-01-19
    • 2012-03-15
    • 2014-01-27
    • 2010-11-18
    • 2010-09-16
    相关资源
    最近更新 更多