2013-03-19 2 views
2

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

ответ

6

Вы ищете fs/sync.c. См:

SYSCALL_DEFINE0(sync) 
{ 
... 

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

+0

Я также предложил бы изучить http://musl-libc.org/, который является альтернативной библиотекой libc с гораздо более понятным исходным кодом, чем Gnu Libc –

 Смежные вопросы

  • Нет связанных вопросов^_^