Где определение вызова функции Linux sync (2) для процессоров x86_64

Я пытаюсь найти в 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). Где определение этой функции?


person Vilhelm Gray    schedule 19.03.2013    source источник


Ответы (1)


Вы ищете fs/sync.c. Видеть:

SYSCALL_DEFINE0(sync)
{
...

Опубликованная вами glibc версия, вероятно, скомпилирована в очень неудобном случае, когда ядро ​​не предоставляет sync системный вызов. Другими словами, это заглушка, которая практически не используется.

person cnicutar    schedule 19.03.2013
comment
Я также предлагаю изучить musl-libc.org, которая является альтернативной библиотекой libc с очень большим исходным кодом. легче понять, чем Gnu Libc - person Basile Starynkevitch; 19.03.2013