2012-02-20 94 views
6

我正在尋找open(),close(),write()unlink()的實現,但我找不到它們在任何地方!我發現的每個功能都類似於sys_open,do_open,etc_open ...但與我們使用的接口沒有任何關係。你可以幫我嗎?在Linux內核尋找系統調用實現

我需要發現什麼樣的安全檢查,他們讓

回答

5

您需要在內核源代碼中尋找SYSCALL_DEFINE宏。例如,在/fs grepping爲unlink給出如下:

$ grep -r -n SYSCALL_DEFINE *.c | grep unlink

namei.c:2811:SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag) 
namei.c:2822:SYSCALL_DEFINE1(unlink, const char __user *, pathname) 

注意SYSCALL_DEFINE後的數字是系統調用參數計數。

5

如果你指的是調用,如在fcntl.h發現,他們不是內核的一部分,他們的glibc一部分。

如果您的是指實際的內核調用,系統調用xyzzy通常由功能sys_xyzzy處理。

entry.S文件,至少在2.4(我沒有看過以後的內核),舉行了表映射系統調用號到功能:

.data 
    ENTRY(sys_call_table) 
     .long SYMBOL_NAME(sys_ni_syscall)  /* 0 - old "setup()" system call*/ 
     .long SYMBOL_NAME(sys_exit) 
     .long SYMBOL_NAME(sys_fork) 
     .long SYMBOL_NAME(sys_read) 
     .long SYMBOL_NAME(sys_write) 
     .long SYMBOL_NAME(sys_open)    /* 5 */ 
     .long SYMBOL_NAME(sys_close) 
     .long SYMBOL_NAME(sys_waitpid) 
     .long SYMBOL_NAME(sys_creat) 
     .long SYMBOL_NAME(sys_link) 
     .long SYMBOL_NAME(sys_unlink)   /* 10 */ 
     .long SYMBOL_NAME(sys_execve) 
     .long SYMBOL_NAME(sys_chdir) 
     .long SYMBOL_NAME(sys_time) 
     .long SYMBOL_NAME(sys_mknod) 
     .long SYMBOL_NAME(sys_chmod)   /* 15 */ 
     : 
     .long SYMBOL_NAME(sys_ni_syscall)  /* sys_remap_file_pages */ 
     .long SYMBOL_NAME(sys_ni_syscall)  /* sys_set_tid_address */ 

KernelGrok似乎已經顯示系統的有用頁面來電,他們的名字,參數,以及在哪裏找到來源。例如(稍微重新格式化):

0 sys_restart_syscall 
     eax = 0x00 
     kernel/signal.c:2058 
    1 sys_exit 
     eax = 0x01 
     ebx = int error_code 
     kernel/exit.c:1046 
    2 sys_fork 
     eax = 0x02 
     ebx = struct pt_regs * 
     arch/alpha/kernel/entry.S:716 
    3 sys_read 
     eax = 0x03 
     ebx = unsigned int fd 
     ecx = char __user *buf 
     edx = size_t count 
     fs/read_write.c:391 
    4 sys_write 
     eax = 0x04 
     ebx = unsigned int fd 
     ecx = const char __user *buf 
     edx = size_t count 
     fs/read_write.c:408 
    : 

等等。但是,在上學的時候,我更喜歡將內核源碼保存在本地,只需使用grep :-)