2012-02-20 12 views

Respuesta

5

Debe buscar la macro SYSCALL_DEFINE en las fuentes del kernel. Por ejemplo, para grepping unlink en /fs da lo siguiente:

$ 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) 

Tenga en cuenta que el número después de SYSCALL_DEFINE es el número de argumentos de llamada al sistema.

5

Si se refiere a la biblioteca llamadas, tales como las que se encuentran en fcntl.h, no son parte del núcleo, que son parte de glibc.

Si son refiriéndose a las llamadas al kernel reales, la llamada al sistema xyzzy suele ser manejado por la función sys_xyzzy.

El archivo entry.S, por lo menos en 2.4 (no he mirado a los núcleos más tarde), celebró un sistema de mapeo de la tabla números de llamada a funciones:

.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 parece tener una página útil que muestra el sistema llamadas, sus nombres, parámetros y dónde encontrar la fuente. Por ejemplo (ligeramente reformateado):

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 
    : 

y así sucesivamente. Pero, al ser de la vieja escuela, prefiero mantener las fuentes del núcleo locales y solo usar grep :-)

Cuestiones relacionadas