Я пытаюсь найти Linux 3.2.21 x86_64 реализацию функции sync(2)
Unix заявленной в заголовке unistd.h в. Глядя на Linux unistd.h дает этот прототип:Где определение синхронизации (2) вызов функции Linux для 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, почему существует системный вызов? Где определение sync
для архитектуры x86_64?
P.S.: Я нашел определение препроцессора __SYSCALL
на arch/x86/kernel/syscall_64.c, но это, по-видимому, означает, что системный вызов sync
просто вызывает внешнюю функцию, объявленную как void sys_sync(void)
. Где определение этой функции?
Я также предложил бы изучить http://musl-libc.org/, который является альтернативной библиотекой libc с гораздо более понятным исходным кодом, чем Gnu Libc –