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