2012-02-20 2 views
6

Je cherche les implémentations de open(), close(), write() et unlink(), mais je ne les trouve nulle part! Chaque fonction que je trouve est comme sys_open, do_open, etc_open ... mais rien avec l'interface que nous utilisons. Pouvez-vous m'aider?Recherche de l'implémentation des appels système sur le noyau Linux

J'ai besoin de découvrir quel genre de contrôles de sécurité, ils font

Répondre

5

Vous devez rechercher la macro SYSCALL_DEFINE dans les sources du noyau. Par exemple, grep pour unlink à /fs donne les éléments suivants:

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

Notez que le nombre après SYSCALL_DEFINE est le nombre d'arguments syscall.

5

Si vous voulez parler de la bibliothèque appels tels que ceux trouvés dans fcntl.h, ils ne font pas partie du noyau, ils font partie de glibc.

Si vous sont référence aux appels du noyau réels, l'appel système xyzzy est généralement gérée par la fonction sys_xyzzy.

Le fichier entry.S, au moins en 2.4 (je ne l'ai pas regardé les noyaux plus tard), a organisé un numéro d'appel système de mappage de table aux fonctions:

.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 semble avoir une page utile montrant le système appels, leurs noms, paramètres et où trouver la source. Par exemple (légèrement reformaté):

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 
    : 

et ainsi de suite. Mais, étant vieille école, je préfère garder les sources du noyau locales et juste utiliser grep :-)

Questions connexes