2012-02-20 17 views
6

szukam wdrożeniami open(), close(), write() i unlink(), ale nie mogę ich nigdzie znaleźć! Każda funkcja, którą znajduję, jest podobna do sys_open, do_open, etc_open ... ale nic z interfejsu, którego używamy. Możesz mi pomóc?Szukasz wdrożenie systemu wywołuje na jądrze Linux

muszę dowiedzieć się, jaki rodzaj kontroli bezpieczeństwa robią

Odpowiedz

5

Musisz szukać makro SYSCALL_DEFINE w źródłach jądra. Na przykład, grepping dla unlink na /fs daje następujące:

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

pamiętać, że liczba po SYSCALL_DEFINE jest liczba argumentem syscall.

5

Jeśli masz na myśli bibliotekę połączeń, takie jak te znajdujące się w fcntl.h, nie są one częścią jądra, są one częścią glibc.

Jeśli odnosząc się do rzeczywistych wywołań jądra, połączenie systemu xyzzy jest zazwyczaj obsługiwane przez funkcję sys_xyzzy.

Plik entry.S, przynajmniej w wersji 2.4 (ja nie spojrzał na późniejszych jądrach), która odbyła się stół system mapowania numerów wezwanie do funkcji:

.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 wydaje się mieć użyteczną stronę pokazujący system połączenia, ich nazwy, parametry i miejsce znalezienia źródła. Na przykład (lekko sformatowany):

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 
    : 

i tak dalej. Ale będąc w starej szkole, wolę zachować lokalne źródła jądra i po prostu użyć grep :-)

Powiązane problemy