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

标签 c linux linux-kernel glibc libc

我试图找到 sync(2)Linux 3.2.21 x86_64 实现在 unistd.h header 中声明的 Unix 函数。查看 Linux unistd.h 会产生以下原型(prototype):

/* 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(所以它正在做某事)。

再次查看 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 找到了 __SYSCALL 的预处理器定义,但这似乎意味着 sync 系统调用只是调用一个声明为 void sys_sync(void) 的外部函数。这个函数的定义在哪里?

最佳答案

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

SYSCALL_DEFINE0(sync)
{
...

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

关于c - x86_64 处理器的 sync(2) Linux 函数调用的定义在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15507185/

相关文章:

ios - DragonFire SDK NetSend 回调未触发

c - 由于内存耗尽而从 NULL == malloc() 恢复的策略

c - 并非for循环中的所有指令都被执行

linux - 由于 pam 配置,centOS 不允许您(root)访问(crontab)

linux-kernel - 自定义构建的内核在 Centos 7 上生成不可引导的 initramfs

c - 在 C 中调试合并排序实现

linux - UNIX 排序忽略空格

linux - 分析系统调用

linux - 飞溅停止并出现错误 "unregister_netdevice: waiting for lo to become free"

c - 在哪里编写中断处理程序以及如何在 Linux 中向内核注册?