2013-03-19 25 views
2

我試圖找到的Linux 3.2.21 x86_64的實現在unistd.h中頭部聲明的sync(2)的Unix功能的同步(2)Linux的函數調用的定義。縱觀Linux的unistd.h中得到這個原型:凡是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之外定義,爲什麼會有系統調用它? x86_64架構的sync的定義在哪裏?

P.S.:我確實發現​​的預處理器定義爲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更容易理解 – 2013-03-19 18:24:16